Delen via


Processen, threads en appartementen

Een proces is een verzameling virtuele geheugenruimte, code, gegevens en systeembronnen. Een thread is code die serieel moet worden uitgevoerd binnen een proces. Een processor voert threads uit, niet processen, dus elke toepassing heeft ten minste één proces en een proces heeft altijd ten minste één thread van uitvoering, ook wel de primaire thread genoemd. Een proces kan meerdere threads bevatten naast de primaire thread.

Processen communiceren met elkaar via berichten, met behulp van de RPC-technologie (Remote Procedure Call) van Microsoft om informatie aan elkaar door te geven. Er is geen verschil tussen een oproep die afkomstig is van een proces op een externe computer en een oproep die afkomstig is van een ander proces op dezelfde computer.

Wanneer een thread wordt uitgevoerd, gaat deze door totdat deze wordt gedood of totdat deze wordt onderbroken door een thread met een hogere prioriteit (door een gebruikersactie of de threadplanner van de kernel). Elke thread kan afzonderlijke codesecties uitvoeren of meerdere threads kunnen dezelfde codesectie uitvoeren. Threads die hetzelfde codeblok uitvoeren, onderhouden afzonderlijke stacks. Elke thread in een proces deelt de globale variabelen en resources van dat proces.

De thread scheduler bepaalt wanneer en hoe vaak een thread moet worden uitgevoerd, volgens een combinatie van het kenmerk prioriteitsklasse van het proces en de basisprioriteit van de thread. U stelt het kenmerk prioriteitsklasse van een proces in door de functie SetPriorityClass aan te roepen en u stelt de basisprioriteit van een thread in met een aanroep naar SetThreadPriority-.

Multithreaded-toepassingen moeten twee threadingproblemen voorkomen: impasses en races. Er treedt een impasse op wanneer elke thread wacht tot de andere iets doet. Het besturingselement voor COM-aanroepen helpt impasses in aanroepen tussen objecten te voorkomen. Een racevoorwaarde treedt op wanneer een thread is voltooid voordat een andere thread waarvan deze afhankelijk is, waardoor de eerste een niet-geïnitialiseerde waarde gebruikt omdat de laatste nog geen geldige waarde heeft opgegeven. COM levert bepaalde functies die speciaal zijn ontworpen om raceomstandigheden in out-of-process servers te voorkomen. (Zie Out-of-Process Server Implementation Helpers.)

Het appartement en de COM Threading-architectuur

Hoewel COM het model met één thread per proces ondersteunt dat vóór de introductie van meerdere threads van uitvoering wordt gebruikt, kunt u code schrijven om te profiteren van meerdere threads, wat resulteert in efficiëntere toepassingen, doordat één thread kan worden uitgevoerd terwijl een andere thread wacht totdat een tijdrovende bewerking is voltooid.

Notitie

Het gebruik van meerdere threads is geen garantie voor betere prestaties. Omdat threadfactoring een moeilijk probleem is, veroorzaakt het gebruik van meerdere threads vaak prestatieproblemen. De sleutel is om meerdere threads alleen te gebruiken als u zeker weet wat u doet.

 

Over het algemeen is de eenvoudigste manier om de COM threading-architectuur te bekijken, is het bedenken van alle COM-objecten in het proces, zoals onderverdeeld in groepen genaamd appartementen. Een COM-object woont in precies één appartement, in de zin dat zijn methoden wettelijk alleen kunnen worden aangeroepen door een draad die tot dat appartement behoort. Alle andere threads die het object willen aanroepen, moeten via een proxy gaan.

Er zijn twee soorten appartementen: appartementen met één threaden multithreaded appartementen.

  • Appartementen met één thread bestaan uit precies één thread, dus alle COM-objecten die in een appartement met één thread wonen, kunnen alleen methode-aanroepen ontvangen van de ene thread die bij dat appartement hoort. Alle methodeaanroepen naar een COM-object in een appartement met één thread worden gesynchroniseerd met de berichtenwachtrij van windows voor de thread van het appartement met één thread. Een proces met één thread van uitvoering is gewoon een speciaal geval van dit model.
  • Multithreaded appartementen bestaan uit een of meer threads, dus alle COM-objecten die in een multithreaded appartement wonen, kunnen methodeaanroepen rechtstreeks ontvangen van een van de threads die deel uitmaken van het multithreaded appartement. Threads in een multithreaded appartement gebruiken een model met de naam free threading. Oproepen naar COM-objecten in een multithreaded appartement worden gesynchroniseerd door de objecten zelf.

Notitie

Zie Single-Threaded en Multithreaded Communicationvoor een beschrijving van de communicatie tussen appartementen met één thread en multithreaded appartementen binnen hetzelfde proces.

 

Een proces kan nul of meer single-threaded appartementen en nul of één multithreaded appartement hebben.

In een proces is het hoofdappartement de eerste die moet worden geïnitialiseerd. In een enkel threaded proces is dit het enige appartement. Oproepparameters worden tussen appartementen marshaled en COM verwerkt de synchronisatie via berichten. Als u meerdere threads in een proces aanwijst om vrij te threaden, bevinden alle gratis threads zich in één appartement, worden parameters rechtstreeks doorgegeven aan een thread in het appartement en moet u alle synchronisatie afhandelen. In een proces met zowel free-threading als appartementthreading bevinden alle gratis threads zich in één appartement en alle andere appartementen zijn appartementen met één thread. Een proces dat COM-werk doet, is een verzameling appartementen met maximaal één multithreaded appartement, maar een willekeurig aantal appartementen met één thread.

De threadingmodellen in COM bieden het mechanisme voor clients en servers die gebruikmaken van verschillende threadingarchitecturen om samen te werken. Aanroepen tussen objecten met verschillende threadingmodellen in verschillende processen worden natuurlijk ondersteund. Vanuit het perspectief van het aanroepende object gedragen alle aanroepen naar objecten buiten een proces zich identiek, ongeacht hoe het object wordt aangeroepen. Vanuit het perspectief van het object dat wordt aangeroepen, gedragen aankomende aanroepen zich op dezelfde manier, ongeacht het threadingmodel van de aanroeper.

Interactie tussen een client en een out-of-process-object is eenvoudig, zelfs wanneer ze verschillende threadingmodellen gebruiken, omdat de client en het object zich in verschillende processen bevinden. COM, tussen de client en de server, kan de code voor de threading-modellen leveren om samen te werken, met behulp van standaard marshaling en RPC. Als een object met één thread bijvoorbeeld tegelijkertijd wordt aangeroepen door meerdere gratis threads clients, worden de aanroepen gesynchroniseerd door COM door bijbehorende vensterberichten in de berichtenwachtrij van de server te plaatsen. Het appartement van het object ontvangt één oproep telkens wanneer het berichten ophaalt en verzendt. Er moet echter enige zorg worden besteed om ervoor te zorgen dat in-process servers correct communiceren met hun clients. (Zie In-Process Problemen met serverthreading.)

Het belangrijkste probleem bij het programmeren met een multithreaded-model is om uw codethread-veilig te maken, zodat berichten die zijn bedoeld voor een bepaalde thread alleen naar die thread gaan en toegang tot threads zijn beveiligd.

Zie de volgende onderwerpen voor meer informatie: