Sdílet prostřednictvím


Procesy, vlákna a apartmány

Proces je kolekce prostoru virtuální paměti, kódu, dat a systémových prostředků. Vlákno je kód, který se má sériově spouštět v rámci procesu. Procesor spouští vlákna, ne procesy, takže každá aplikace má alespoň jeden proces a proces má vždy alespoň jedno vlákno provádění, označované jako primární vlákno. Proces může mít kromě primárního vlákna více vláken.

Procesy vzájemně komunikují prostřednictvím zpráv pomocí technologie Vzdálené volání procedur (RPC) od Microsoftu k předávání informací sobě navzájem. Neexistuje žádný rozdíl mezi volajícím mezi voláním přicházejícím z procesu na vzdáleném počítači a voláním přicházejícím z jiného procesu na stejném počítači.

Když se vlákno začne spouštět, pokračuje, dokud ho nezavře nebo dokud se nepřeruší vlákno s vyšší prioritou (akcí uživatele nebo plánovačem vláken jádra). Každé vlákno může spouštět samostatné části kódu nebo více vláken může spustit stejný oddíl kódu. Vlákna, která spouští stejný blok kódu, udržují samostatné zásobníky. Každé vlákno v procesu sdílí globální proměnné a prostředky procesu.

Plánovač vláken určuje, kdy a jak často se má vlákno spouštět, podle kombinace atributu třídy priority procesu a základní priority vlákna. Atribut třídy priority procesu nastavíte voláním funkce SetPriorityClass a základní prioritu vlákna nastavíte voláním SetThreadPriority.

Vícevláknové aplikace se musí vyhnout dvěma problémům s vlákny: zablokování a rasy. K vzájemnému zablokování dochází, když každé vlákno čeká na další, aby něco udělalo. Ovládací prvek volání MODELU COM pomáhá zabránit zablokování ve voláních mezi objekty. Podmínka časování nastane, když se jedno vlákno dokončí před jiným, na kterém závisí, což způsobí, že první z nich použije neinicializovanou hodnotu, protože druhé vlákno ještě nezadá platnou hodnotu. Com dodává některé funkce speciálně navržené tak, aby se zabránilo konfliktům časování na mimoprocesových serverech. (Viz pomocné rutiny pro implementaci mimo procesový server.)

The Apartment and the COM Threading Architecture

I když model COM podporuje model s jedním vláknem pro jednotlivé procesy, který se používá před zavedením více vláken provádění, můžete napsat kód, který bude využívat více vláken, což vede k efektivnějším aplikacím, protože jedno vlákno se spustí, zatímco jiné vlákno čeká na dokončení určité časově náročné operace.

Poznámka

Použití více vláken není zárukou lepšího výkonu. Vzhledem k tomu, že faktoring vláken je složitý problém, použití více vláken často způsobuje problémy s výkonem. Klíčem je použití více vláken pouze v případě, že jste si velmi jisti, co děláte.

 

Obecně platí, že nejjednodušší způsob, jak zobrazit architekturu vláken MODELU COM, je představit všechny objekty MODELU COM v procesu rozdělené do skupin nazývaných apartmány. Objekt COM žije v přesně jednom bytě, v tom smyslu, že jeho metody mohou být právně volány pouze vláknem, které patří do daného bytu. Jakékoli jiné vlákno, které chce volat objekt, musí projít proxy serverem.

Existují dva typy apartmánů: jednovláknové apartmánya vícevláknové apartmány.

  • Jednovláknové apartmány se skládají z přesně jednoho vlákna, takže všechny objekty COM, které žijí v apartmánu s jedním vláknem, mohou přijímat volání metody pouze z jednoho vlákna, které patří do daného bytu. Všechna volání metody objektu COM v jednovláknovém apartmánu jsou synchronizována s frontou zpráv oken pro jednovláknové vlákno vlákna apartmánu. Proces s jedním vláknem provádění je jednoduše speciální případ tohoto modelu.
  • Vícevláknové apartmány se skládají z jednoho nebo více vláken, takže všechny objekty COM, které žijí v vícevláknovém apartmánu, mohou přijímat volání metod přímo z libovolného vlákna, které patří do vícevláknového bytu. Vlákna ve vícevláknovém apartmánu používají model s názvem bezvláknové. Volání objektů COM v vícevláknovém apartmánu jsou synchronizována objekty samy.

Poznámka

Popis komunikace mezi apartmány s jedním vláknem a vícevláknovými apartmány v rámci stejného procesu naleznete v tématu Single-Threaded a vícevláknové komunikace.

 

Proces může mít nula nebo více apartmánů s jedním vláknem a nula nebo jeden vícevláknový byt.

V procesu je hlavní byt prvním, který se má inicializovat. V jednovláknovém procesu je to jediný byt. Parametry volání jsou zařazovány mezi apartmány a com zpracovává synchronizaci prostřednictvím zasílání zpráv. Pokud v procesu určíte více vláken, která mají být bez vláken, všechny bezplatné vlákna se nacházejí v jednom apartmánu, parametry se předávají přímo do libovolného vlákna v bytě a musíte zpracovat veškerou synchronizaci. V procesu s bezvláknovým i apartment threadingem se všechna bezplatná vlákna nacházejí v jednom bytě a všechny ostatní byty jsou jednovláknové apartmány. Proces, který com funguje, je kolekce apartmánů s jedním vícevláknovým bytem, ale libovolným počtem jednovláknových apartmánů.

Modely podprocesů v modelu COM poskytují mechanismus pro klienty a servery, které používají různé architektury threadingu, aby spolupracovaly. Volání mezi objekty s různými modely vláken v různých procesech jsou přirozeně podporována. Z pohledu volajícího objektu se všechna volání objektů mimo proces chovají stejně, bez ohledu na to, jak je volán objekt je vlákno. Podobně se z pohledu volaného objektu chovají příchozí volání stejně, bez ohledu na model vláken volajícího.

Interakce mezi klientem a objektem mimo proces je jednoduchá, i když používají různé modely threadingu, protože klient a objekt jsou v různých procesech. COM, které jsou propojeny mezi klientem a serverem, může poskytnout kód pro modely threadingu pro spolupráci pomocí standardního zařazování a RPC. Pokud je například objekt s jedním vláknem volán současně více klientů s volným vláknem, volání budou synchronizována objektem COM umístěním odpovídajících zpráv oken do fronty zpráv serveru. Byt objektu obdrží jedno volání pokaždé, když načte a odešle zprávy. Je však potřeba věnovat pozornost tomu, aby procesové servery správně komunikovaly se svými klienty. (Viz In-Process Problémy s vlákny serveru.)

Nejdůležitějším problémem při programování s vícevláknovým modelem je zajistit bezpečnost vláken kódu tak, aby zprávy určené pro konkrétní vlákno přešly pouze na toto vlákno a přístup k vláknům jsou chráněné.

Další informace najdete v následujících tématech: