procesy i zarządzanie procesami
TRANSCRIPT
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