Prozesse, Threads und Wohnungen
Ein Prozess ist eine Sammlung von virtuellen Speicherplatz, Code, Daten und Systemressourcen. Ein Thread- ist Code, der in einem Prozess serial ausgeführt werden soll. Ein Prozessor führt Threads aus, nicht Prozesse, sodass jede Anwendung über mindestens einen Prozess verfügt, und ein Prozess verfügt immer über mindestens einen Thread der Ausführung, der als primärer Thread bezeichnet wird. Ein Prozess kann zusätzlich zum primären Thread mehrere Threads enthalten.
Prozesse kommunizieren miteinander über Nachrichten, wobei die Remoteprozeduraufruftechnologie (RPC) von Microsoft verwendet wird, um Informationen aneinander zu übergeben. Der Anrufer unterscheidet sich nicht zwischen einem Anruf von einem Prozess auf einem Remotecomputer und einem Anruf, der von einem anderen Prozess auf demselben Computer stammt.
Wenn ein Thread mit der Ausführung beginnt, wird er fortgesetzt, bis er beendet wird oder bis er von einem Thread mit höherer Priorität unterbrochen wird (durch eine Benutzeraktion oder den Threadplaner des Kernels). Jeder Thread kann separate Codeabschnitte ausführen, oder mehrere Threads können denselben Codeabschnitt ausführen. Threads, die denselben Codeblock ausführen, verwalten separate Stapel. Jeder Thread in einem Prozess teilt die globalen Variablen und Ressourcen dieses Prozesses.
Der Threadplaner bestimmt, wann und wie oft ein Thread ausgeführt werden soll, entsprechend einer Kombination des Prioritätsklassenattributes des Prozesses und der Basispriorität des Threads. Sie legen das Prioritätsklassenattribut eines Prozesses fest, indem Sie die funktion SetPriorityClass aufrufen und die Basispriorität eines Threads mit einem Aufruf von SetThreadPriority-festlegen.
Multithread-Anwendungen müssen zwei Threadingprobleme vermeiden: Deadlocks und Rennen. Ein Deadlock tritt auf, wenn jeder Thread auf die andere wartet, um etwas zu tun. Das COM-Aufrufsteuerelement verhindert Deadlocks in Aufrufen zwischen Objekten. Eine Racebedingung tritt auf, wenn ein Thread vor einem anderen endet, von dem es abhängt, was dazu führt, dass der frühere einen nicht initialisierten Wert verwendet, da letztere noch keinen gültigen Wert angegeben hat. COM stellt einige Funktionen bereit, die speziell entwickelt wurden, um Rennbedingungen in Out-of-Process-Servern zu vermeiden. (Siehe Out-of-Process Server Implementation Helpers.)
Die Wohnung und die COM Threading-Architektur
Während COM das single-thread-pro-Process-Modell unterstützt, das vor der Einführung mehrerer Ausführungsthreads vorherrscht, können Sie Code schreiben, um mehrere Threads zu nutzen, was zu effizienteren Anwendungen führt, indem sie zulassen, dass ein Thread ausgeführt wird, während ein anderer Thread auf einen zeitaufwendigen Vorgang wartet.
Anmerkung
Die Verwendung mehrerer Threads ist keine Garantie für eine bessere Leistung. Da threadfaktoring ein schwieriges Problem darstellt, verursacht die Verwendung mehrerer Threads häufig Leistungsprobleme. Der Schlüssel besteht darin, mehrere Threads nur zu verwenden, wenn Sie sehr sicher sind, was Sie tun.
Im Allgemeinen ist die einfachste Möglichkeit, die COM-Threadingarchitektur anzuzeigen, darin, sich alle COM-Objekte im Prozess wie in Gruppen unterteilt, die als Wohnungenbezeichnet werden. Ein COM-Objekt lebt in genau einer Wohnung, in dem Sinne, dass seine Methoden legal nur von einem Thread aufgerufen werden können, der zu dieser Wohnung gehört. Jeder andere Thread, der das Objekt aufrufen möchte, muss einen Proxy durchlaufen.
Es gibt zwei Arten von Wohnungen: Singlethread-Wohnungenund Multithread-Wohnungen.
- Singlethread-Wohnungen bestehen aus genau einem Thread, sodass alle COM-Objekte, die in einer Singlethread-Wohnung leben, Methodenaufrufe nur von dem Thread empfangen können, der zu dieser Wohnung gehört. Alle Methodenaufrufe an ein COM-Objekt in einem Singlethread-Apartment werden mit der Windows-Nachrichtenwarteschlange für den Thread des Singlethreads synchronisiert. Ein Prozess mit einem einzelnen Ausführungsthread ist einfach ein Sonderfall dieses Modells.
- Multithread-Wohnungen bestehen aus einem oder mehreren Threads, sodass alle COM-Objekte, die in einer Multithread-Wohnung leben, Methodenaufrufe direkt von jedem der Threads empfangen können, die zur Multithread-Wohnung gehören. Threads in einer Multithread-Wohnung verwenden ein Modell namens Freithreading. Aufrufe von COM-Objekten in einer Multithread-Wohnung werden von den Objekten selbst synchronisiert.
Anmerkung
Eine Beschreibung der Kommunikation zwischen Singlethread-Wohnungen und Multithread-Wohnungen innerhalb desselben Prozesses finden Sie unter Single-Threaded und Multithreaded Communication.
Ein Prozess kann null oder mehr Singlethread-Wohnungen und null oder eine Multithread-Wohnung haben.
In einem Prozess ist die Hauptwohnung die erste zu initialisieren. Bei einem Einthreadprozess ist dies die einzige Wohnung. Anrufparameter werden zwischen Wohnungen gemarstet, und COM verarbeitet die Synchronisierung über Messaging. Wenn Sie mehrere Threads in einem Prozess als Freithread festlegen, befinden sich alle freien Threads in einem einzigen Apartment, Parameter werden direkt an jeden Thread in der Wohnung übergeben, und Sie müssen alle Synchronisierung behandeln. In einem Prozess mit Freithreading und Apartmentthreading befinden sich alle freien Threads in einer einzigen Wohnung und alle anderen Wohnungen sind Singlethread-Wohnungen. Ein Prozess, der COM funktioniert, ist eine Sammlung von Wohnungen mit höchstens einer Multithread-Wohnung, aber einer beliebigen Anzahl von Singlethread-Wohnungen.
Die Threadingmodelle in COM stellen den Mechanismus für Clients und Server bereit, die verschiedene Threadingarchitekturen verwenden, um zusammenzuarbeiten. Aufrufe zwischen Objekten mit unterschiedlichen Threadingmodellen in verschiedenen Prozessen werden natürlich unterstützt. Aus Sicht des aufrufenden Objekts verhalten sich alle Aufrufe von Objekten außerhalb eines Prozesses identisch, unabhängig davon, wie das aufgerufene Objekt threaded wird. Ebenso verhalten sich eingehende Aufrufe aus der Perspektive des aufgerufenen Objekts unabhängig vom Threadingmodell des Aufrufers identisch.
Die Interaktion zwischen einem Client und einem Out-of-Process-Objekt ist auch dann einfach, wenn sie unterschiedliche Threadingmodelle verwenden, da sich der Client und das Objekt in verschiedenen Prozessen befinden. COM,interpos between the client and the server, can provide the code for the threading models to interoperate, using standard marshaling and RPC. Wenn z. B. ein Singlethread-Objekt von mehreren Freethread-Clients gleichzeitig aufgerufen wird, werden die Aufrufe von COM synchronisiert, indem entsprechende Fenstermeldungen in der Nachrichtenwarteschlange des Servers platziert werden. Die Wohnung des Objekts erhält jedes Mal einen Anruf, wenn es Nachrichten abruft und sendet. Es muss jedoch darauf geachtet werden, dass prozessinterne Server ordnungsgemäß mit ihren Clients interagieren. (Siehe In-Process Serverthreading-Probleme.)
Das wichtigste Problem bei der Programmierung mit einem Multithreadmodell besteht darin, ihren Codethread sicher zu machen, damit Nachrichten, die für einen bestimmten Thread vorgesehen sind, nur zu diesem Thread wechseln und der Zugriff auf Threads geschützt ist.
Weitere Informationen finden Sie in den folgenden Themen:
- Auswählen des Threadingmodells
- Single-Threaded Apartments
- Multithreaded Apartments
- Single-Threaded und Multithread-Kommunikation
- In-Process Serverthreadingprobleme
- Zugriff auf Schnittstellen über Wohnungen