Udostępnij przez


Kiedy używać wielozadaniowości

Istnieją dwa sposoby implementowania wielozadaniowości: jako pojedynczy proces z wieloma wątkami lub wieloma procesami, z których każdy ma co najmniej jeden wątek. Aplikacja może umieścić każdy wątek, który wymaga prywatnej przestrzeni adresowej i zasobów prywatnych do własnego procesu, aby chronić go przed działaniami innych wątków procesu.

Wielowątkowy proces może zarządzać zadaniami, które się wzajemnie wykluczają, przy użyciu wątków, takimi jak udostępnianie interfejsu użytkownika i wykonywanie obliczeń w tle. Tworzenie wielowątkowego procesu może być również wygodnym sposobem tworzenia struktury programu, który wykonuje kilka podobnych lub identycznych zadań jednocześnie. Na przykład, serwer nazwanych potoków może utworzyć wątek dla każdego procesu klienta, który dołącza do potoku. Ten wątek zarządza komunikacją między serwerem a klientem. Proces może używać wielu wątków do wykonywania następujących zadań:

  • Zarządzanie danymi wejściowymi dla wielu okien.
  • Zarządzanie danymi wejściowymi z kilku urządzeń komunikacyjnych.
  • Rozróżnianie zadań o różnym priorytetyzowaniu. Na przykład wątek o wysokim priorytecie zarządza zadaniami krytycznymi czasowo, a wątek o niskim priorytecie wykonuje inne zadania.
  • Zezwalaj interfejsowi użytkownika na reagowanie, a jednocześnie przydzielanie czasu do zadań w tle.

Zazwyczaj bardziej wydajne jest zaimplementowanie wielozadaniowości przez utworzenie pojedynczego, wielowątkowego procesu zamiast tworzenia wielu procesów z następujących powodów:

  • System może szybciej przełączać kontekst dla wątków niż procesy, ponieważ proces ma większe obciążenie niż wątek (kontekst procesu jest większy niż kontekst wątku).
  • Wszystkie wątki procesu współdzielą tę samą przestrzeń adresową i mogą uzyskiwać dostęp do zmiennych globalnych procesu, co może uprościć komunikację między wątkami.
  • Wszystkie wątki procesu mogą udostępniać otwarte dojścia do zasobów, takich jak pliki i potoki.

Istnieją inne techniki, których można użyć zamiast wielowątkowości. Najważniejsze z nich są następujące: asynchroniczne wejście i wyjście (I/O), porty zakończenia operacji We/Wy, wywołania procedur asynchronicznych (APC) i możliwość oczekiwania na wiele zdarzeń.

Pojedynczy wątek może inicjować wiele czasochłonnych żądań wejścia/wyjścia, które mogą być wykonywane równolegle przy użyciu asynchronicznych operacji wejścia/wyjścia. Asynchroniczne operacje we/wy można wykonywać na plikach, potokach i urządzeniach komunikacji szeregowej. Aby uzyskać więcej informacji, zobacz Synchronizacja i równoczesne dane wejściowe i wyjściowe.

Pojedynczy wątek może zablokować własne wykonanie, oczekując na wystąpienie któregokolwiek z kilku zdarzeń lub wszystkich jednocześnie. Jest to bardziej wydajne niż używanie wielu wątków, z których każdy czeka na pojedyncze zdarzenie, i bardziej wydajny niż użycie pojedynczego wątku, który zużywa czas procesora, stale sprawdzając, czy występują zdarzenia. Aby uzyskać więcej informacji, zobacz Wait Functions.