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