Udostępnij za pośrednictwem


Procesy, wątki i apartamenty

Proces to kolekcja przestrzeni pamięci wirtualnej, kodu, danych i zasobów systemowych. Wątek to kod, który ma być wykonywany szeregowo w ramach procesu. Procesor wykonuje wątki, a nie procesy, więc każda aplikacja ma co najmniej jeden proces, a proces zawsze ma co najmniej jeden wątek wykonywania, znany jako wątek podstawowy. Proces może zawierać wiele wątków oprócz wątku podstawowego.

Procesy komunikują się ze sobą za pośrednictwem komunikatów przy użyciu technologii Remote Procedure Call (RPC) firmy Microsoft w celu przekazania informacji do siebie. Nie ma różnicy między obiektem wywołującym między wywołaniem pochodzącym z procesu na maszynie zdalnej a wywołaniem przychodzącym z innego procesu na tym samym komputerze.

Gdy wątek zacznie działać, będzie kontynuowany, dopóki nie zostanie przerwany lub nie zostanie przerwany przez wątek o wyższym priorytecie (przez akcję użytkownika lub harmonogram wątków jądra). Każdy wątek może uruchamiać oddzielne sekcje kodu lub wiele wątków może wykonywać tę samą sekcję kodu. Wątki wykonujące ten sam blok kodu zachowują oddzielne stosy. Każdy wątek w procesie udostępnia zmienne globalne i zasoby procesu.

Harmonogram wątków określa, kiedy i jak często należy wykonać wątek, zgodnie z kombinacją atrybutu klasy priorytetu procesu i priorytetu podstawowego wątku. Atrybut klasy priorytetu procesu można ustawić przez wywołanie funkcji SetPriorityClass i ustawić priorytet podstawowy wątku z wywołaniem polecenia SetThreadPriority.

Aplikacje wielowątkowa muszą unikać dwóch problemów wątkowych: zakleszczenia i wyścigów . Impas występuje, gdy każdy wątek czeka na inne, aby coś zrobić. Kontrolka wywołań COM pomaga zapobiegać zakleszczeniom wywołań między obiektami. Warunek wyścigu występuje, gdy jeden wątek kończy się przed drugim, od którego zależy, powodując, że były używa niezainicjowanej wartości, ponieważ ten ostatni nie dostarczył jeszcze prawidłowej wartości. COM dostarcza niektóre funkcje zaprojektowane specjalnie w celu uniknięcia warunków wyścigu na serwerach poza procesem. (Zobacz pomocników implementacji serwera przetwarzania.)

Apartament i architektura wątkowa COM

Chociaż model COM obsługuje model pojedynczego wątku na proces rozpowszechniony przed wprowadzeniem wielu wątków wykonywania, można napisać kod, aby korzystać z wielu wątków, co powoduje bardziej wydajne aplikacje, umożliwiając wykonywanie jednego wątku, podczas gdy inny wątek czeka na ukończenie pewnej czasochłonnej operacji.

Nuta

Korzystanie z wielu wątków nie gwarantuje lepszej wydajności. W rzeczywistości, ponieważ faktoring wątków jest trudnym problemem, użycie wielu wątków często powoduje problemy z wydajnością. Kluczem jest użycie wielu wątków tylko wtedy, gdy masz bardzo pewność, co robisz.

 

Ogólnie rzecz biorąc, najprostszym sposobem wyświetlenia architektury wątkowania COM jest myślenie o wszystkich obiektach COM w procesie podzielonym na grupy o nazwie apartamenty. Obiekt COM mieszka w dokładnie jednym mieszkaniu, w sensie, że jego metody mogą być prawnie wywoływane tylko przez wątek, który należy do tego mieszkania. Każdy inny wątek, który chce wywołać obiekt, musi przejść przez serwer proxy.

Istnieją dwa rodzaje mieszkań: jednowątkowy apartament, a wielowątkowy apartament.

  • Mieszkania jednowątkowe składają się z dokładnie jednego wątku, więc wszystkie obiekty COM, które mieszkają w jednym wątku mieszkania, mogą odbierać wywołania metod tylko z jednego wątku, który należy do tego mieszkania. Wszystkie wywołania metody do obiektu COM w jednym wątkowym mieszkaniu są synchronizowane z kolejką komunikatów systemu Windows dla wątku jednowątkowego mieszkania. Proces z pojedynczym wątkiem wykonywania jest po prostu specjalnym przypadkiem tego modelu.
  • Wielowątkowane apartamenty składają się z co najmniej jednego wątku, więc wszystkie obiekty COM, które mieszkają w wielowątkowym mieszkaniu, mogą odbierać wywołania metod bezpośrednio z dowolnego wątku należącego do wielowątkowego mieszkania. Wątki w wielowątkowym mieszkaniu używają modelu o nazwie free-threading. Wywołania obiektów COM w wielowątkowym mieszkaniu są synchronizowane przez same obiekty.

Nuta

Aby uzyskać opis komunikacji między apartamentami jednowątkowymi i wielowątkowymi apartamentami w ramach tego samego procesu, zobacz Single-Threaded i Multithreaded Communication.

 

Proces może mieć zero lub więcej jednowątkowych mieszkań i zero lub jedno wielowątkowy apartament.

W procesie głównym mieszkaniem jest pierwszy do zainicjowania. W jednym wątkowym procesie jest to jedyne mieszkanie. Parametry połączeń są marshalowane między mieszkaniami, a COM obsługuje synchronizację za pośrednictwem komunikatów. Jeśli wyznaczysz wiele wątków w procesie, które mają być wolne wątki, wszystkie wolne wątki znajdują się w jednym mieszkaniu, parametry są przekazywane bezpośrednio do dowolnego wątku w mieszkaniu i musisz obsłużyć wszystkie synchronizacje. W procesie zarówno bez wątków, jak i wątków mieszkalnych, wszystkie darmowe wątki znajdują się w jednym mieszkaniu, a wszystkie inne apartamenty są jednowątkowy apartamenty. Proces, który wykonuje pracę COM, to kolekcja mieszkań z co najwyżej jednym wielowątkowym mieszkaniem, ale dowolną liczbą jednowątkowych mieszkań.

Modele wątkowe w modelu COM zapewniają mechanizm dla klientów i serwerów korzystających z różnych architektur wątków do współpracy. Wywołania między obiektami z różnymi modelami wątków w różnych procesach są naturalnie obsługiwane. Z punktu widzenia obiektu wywołującego wszystkie wywołania obiektów poza procesem zachowują się identycznie, niezależnie od tego, jak wywoływany obiekt jest wątkowy. Podobnie z punktu widzenia wywoływanego obiektu wywoływane wywołania przychodzące zachowują się identycznie, niezależnie od modelu wątkowego obiektu wywołującego.

Interakcja między klientem a obiektem poza procesem jest prosta, nawet jeśli używają różnych modeli wątków, ponieważ klient i obiekt znajdują się w różnych procesach. Com, między klientem a serwerem, może dostarczyć kod dla modeli wątków do współdziałania, przy użyciu standardowego marshalingu i RPC. Na przykład jeśli obiekt jednowątkowy jest wywoływany jednocześnie przez wielu klientów bezwątkowy, wywołania zostaną zsynchronizowane przez com przez umieszczenie odpowiednich komunikatów okna w kolejce komunikatów serwera. Mieszkanie obiektu będzie odbierać jedno wywołanie za każdym razem, gdy pobiera i wysyła komunikaty. Należy jednak zadbać o to, aby serwery przetwarzania działały prawidłowo ze swoimi klientami. (Zobacz In-Process Server Threading Issues.)

Najważniejszym problemem w programowaniu z wielowątkowym modelem jest zapewnienie bezpieczeństwa wątku kodu, tak aby komunikaty przeznaczone dla określonego wątku były chronione tylko do tego wątku i dostęp do wątków.

Aby uzyskać więcej informacji, zobacz następujące tematy: