Procesy i zarządzanie procesami
Transkrypt
Procesy i zarządzanie procesami
Projektowanie oprogramowania systemów PROCESY I ZARZĄDZANIE PROCESAMI plan Cechy, właściwości procesów Multitasking Scheduling Fork czym jest proces? Działającą instancją programu Program jest kolekcją instrukcji, a proces aktualnym wykonaniem tych instrukcji Może być wiele instancji procesów dla tego samego programu, każda wykonująca inną ścieżkę kodu zasoby procesu Każdy proces jest właścicielem określonych zasobów: Identyfikator procesu(process id, PID) Obraz maszynowego kodu wykonalnego (może być współdzielony z innymi instancjami programu, ale w przypadkach gdy obraz jest nadpisywalny, jest on kopiowany), zawarty wewnątrz Izolowanego obszaru pamięci wirtualnej (przestrzeń adresowa) Zasoby systemu operacyjnego (np. uchwyty/deskryptory plików, zegary, obiekty synchronizacji, dojścia urządzeń…) Atrybuty bezpieczeństwa (id właściciela procesu, zestaw uprawnień) Bieżący stan procesora (kontekst wykonania) – zawartość rejestrów, mapowanie pamięci wirtualnej do adresów fizycznych pamięć procesu Każdy proces działa wewnątrz przestrzeni adresowej izolowanej od innych procesów (AKA sandbox) Przestrzeń adresowa procesu zawiera specyficzne dla danego procesu struktury danych systemu operacyjnego stosy wywołań wszystkich wątków procesu stertę Stos jest fragmentem pamięci przechowującym informacje o aktywnych procedurach, specyficznych dla każdego wątku Sterta („pamięć wolna”) jest regionem pamięci dzielonym pomiędzy wątkami i używanym dla potrzeb dynamicznej alokacji pamięci wielowątkowość Nowoczesne systemy operacyjne wspierają pojęcie wielowątkowości - wielu jednoczesnych ścieżek wykonania w ramach jednego procesu Wątki współdzielą zasoby procesu-rodzica (pamięć, deskryptory/uchwyty), ale każdy wątek posiada własny stos wywołań (i czasami również atrybuty bezpieczeństwa) Ponieważ wątki dzielą wspólną przestrzeń adresową, mogą z łatwością komunikować się między sobą za pomocą "zwykłych" konstrukcji języka programowania Procesy z drugiej strony są na ogół izolowane, więc wymagają pewnych specjalnych zabiegów do komunikacji: interprocess communication (IPC) wiele wątków vs wiele procesów Wątki Wątki są uważane za „lekkie procesy” – ilość informacji niezbędna do przetworzenia podczas tworzenia wątku wewnątrz istniejącego procesu jest dużo mniejsza niż podczas tworzenia nowego procesu Ponieważ operują na tych samych, współdzielonych danych, są generalnie „tańsze” pod względem zasobów systemowych niż procesy Komunikacja międzywątkowa jest łatwiejsza niż międzyprocesowa Procesy Wadliwy wątek może wywalić cały proces, zewnętrzny proces generalnie nie jest w stanie uszkodzić innego Istnieją techniki współdzielenia regionu pamięci pomiędzy procesami, co ułatwia wymianę danych (ale nie jest równie naturalne jak z wątkami) Istnieją techniki umożliwiające tworzenie nowych procesów równie tanio jak wątki (fork, copy-on-write) wielozadaniowość (multitasking) Większość współczesnych systemów operacyjnych sprawia wrażenie że uruchamia wiele procesów (zadań) równocześnie, nawet na jednordzeniowym (jednowątkowym) procesorze Odbywa się to poprzez podział czasu – każde zadanie otrzymuje mały przedział czasu procesora, po czym zostaje wywłaszczone i następuje przełączenie kontekstu do innego zadania Szybkie przełączenia kontekstu i niewielkie sloty czasowe zadań powodują, że zadania zdają się działać równolegle Dokładny sposób przełączania zadań zależy od modelu wielowątkowości modele wielowątkowości Multiprogramming Przestarzały, nie używany już Program jest wykonywany tak długo, jak długo nie wymaga dostępu do urządzeń I/O Podczas dostępu do I/O aktywny program jest przełączany na ten, który ma już przygotowane dane wielozadaniowość bez wywłaszczania (cooperative) Program „ochotniczo” oddaje kontrolę nad CPU po wykonaniu części zadania Wadliwie zaprojektowane programy mogą zająć cały czas procesora dla siebie, OS nie ma możliwości przerwać ich wykonanie 16-bitowy Windows, Mac OS przed X wielozadaniowość z wywłaszczaniem (preemptive) OS (scheduler) wywłaszcza (przerywa) wykonanie zadań aby zagwarantować „sprawiedliwy” dostęp do slotów czasowych, za pomocą przerwań sprzętowych Przydział slotów czasowych zależy od priorytetów zadań i polityki szeregowania szeregowanie zadań (task scheduling) Każde zadanie (proces i wątek) ma określony priorytet Zadania o wyższym priorytecie generalnie mają możliwość uzyskać większy przydział czasu niż te o niższym Priorytet procesu można ustawić programowo, z wewnątrz lub z zewnątrz Podnoszenie priorytetu powyżej określonego pułapu zwykle wymaga podwyższonych uprawnień Intensywne zadania o wysokim priorytecie mogą zagłodzić inne zadania – ostrożnie! ;) ustawianie priorytetu zadań Windows Unix/POSIX patrz man 7 sched ;) scheduler (algorytm szeregowania zadań) Część jądra systemu operacyjnego Algorytm, który decyduje które zadanie zostanie uruchomionę w oparciu o priorytety, historię wykonania, stan wejścia/wyjścia i wiele innych czynników Scheduler może być optymalizowany pod kątem Maks. przepływności Min. opóźnień Sprawiedliwości Gwarancji wykonania w określonym czasie (systemy realtime) … tworzenie nowego procesu Windows Linux/Unix/POSIX patrz man 3 exec ;) Właściwie, exec() zastępuje aktualny proces (jego przestrzeń adresową innym), więc… Będzie najpierw potrzebny fork() fork Wywłanie systemowe fork() jest unikatową cechą systemów Unix/POSIX patrz man 2 fork ;) fork() tworzy nowy proces poprzez skopiowanie procesu wywołującego Proces potomny jest identyczny z rodzicem, włączając w to używane (otwarte) zasoby systemowe, których dojścia są dziedziczone Dziedziczenie zasobów i zawartości pamięci sprawia, że komunikacja IPC pomiędzy rodzicem i procesem potomnym jest wyjątkowo prosta, co historycznie było powodem dla którego systemy Unix nie obsługiwały wielowątkowości, tylko używały forków do zapewnienia współbieżności programów Właśnie dlatego logiem BSD Unixa jest trzymający trójząb diabeł ;) implementacja fork wywołanie systemowe fork() jest zaimplementowane za pomocą bardzo wydajnej techniki copy-on-write Proces potomny początkowo używa dokładnie tych samych stron pamięci co rodzić (nie są one kopiowane), ale są one dla niego zabezpieczane przed zapisem Próba zapisu do takiej strony pamięci powoduje page fault (rodzaj przerwania sprzętowego), które jest przechwytywane przez OS i dopiero wtedy, w sposób niewidoczny dla procesu strona jest kopiowana i zastępowana zapisywalną dla nowego procesu To sprawia, że fork() jest wyjątkowo tani w odniesieniu do zasobów systemowych (i szybki!) jak to działa? IPC po forku Proces rodzic i potomny współdzielą dostęp do deskryptorów plików, które były otwarte przed forkiem Można więc utworzyć potok (pipe – parę połączonych gniazd Unix-owych) przed forkiem, a następnie użyć tego potoku, aby połączyć obydwa sforkowane procesy Dzięki temu IPC na Uniksie jest bardzo proste – wystarczy przesyłać polecenia i/lub dane za pomocą potoku