Proces - Wojciech Bieniecki

Download Report

Transcript Proces - Wojciech Bieniecki

Systemy operacyjne
Wykład 6a
Procesy
dr inż. Wojciech Bieniecki
Instytut Nauk Ekonomicznych
i Informatyki
http://wbieniec.kis.p.lodz.pl/pwsz
1
Czym jest proces
Program to plik wykonywalny na dysku (lub innym rodzaju pamięci masowej)
Proces to program uruchomiony i wykonywany w pamięci operacyjnej
Program jest pojęciem statycznym
- sekwencja symboli opisująca obliczenia zgodnie z pewnymi regułami zwanymi
językiem programowania.
Proces ma naturę dynamiczną (zmieniającą się). Zmianie ulegają m.in.
Licznik rozkazów (adres ostatnio wykonywanej instrukcji)
Rejestry procesora
Wskaźnik stosu
Proces posiada własną przestrzeń adresową
Kod
Dane zainicjalizowane
Uruchomienie programu
Dane niezainicjalizowane
Stos
2
Model procesu
Z punktu widzenia systemu
operacyjnego jednocześnie jest
wykonywanych wiele programów.
Z punktu widzenia procesora na
komputerze jest wykonywany
jeden program.
Wiele liczników rozkazów (SO)
Jeden licznik rozkazów (CPU)
3
Stany procesu
Nowy – proces został utworzony.
Gotowy – proces czeka na przydział
procesora
Proces mógłby się wykonywać, ale nie
wykonuje się, ponieważ w tej chwili działa
inny proces
Aktywny – wykonywane są instrukcje
procesu
W systemie z jednym procesorem w danej
chwili tylko jeden proces może być aktywny
Oczekujący (uśpiony) – proces czeka na
zdarzenie (np. zakończenie operacji I/O).
Proces w stanie uśpionym nie otrzyma
procesora
Zakończony – proces zakończył działanie
4
Przejścia pomiędzy stanami procesów
1 (Nowy -> Gotowy).
Nowo utworzony proces przechodzi do kolejki procesów gotowych.
Zarządza Planista długoterminowy (ang. long-term scheduler)
2 (Gotowy => Aktywny)
Proces otrzymuje przydział procesora.
3 (Aktywny => Gotowy)
Procesowi został odebrany procesor (i przekazany
innemu procesowi). Przejściami 2 oraz 3 zarządza
planista krótkoterminowy (ang. short-term scheduler).
4 (Aktywny => Oczekujący)
Proces przechodzi w stan oczekiwania na zajście
zdarzenia. (np. na zakończenie operacji I/O)
5 (Oczekujący => Gotowy)
Zdarzenie na które czekał proces nastąpiło (zakończenie transmisji).
Przejścia 4 oraz 5 są wykonywane przy przeprowadzeniu
synchronicznej operacji wejścia/wyjścia.
6 (Aktywny => Zakończony). Proces zakończył pracę (np. funkcja exit, błąd ochrony)
7 (Gotowy =>Zakończony oraz Oczekujący => Zakończony).
Proces został zakończony przez inny proces (np. funkcją kill).
5
Proces w stanie zawieszonym
Wprowadzono dodatkowy stan procesu
Proces oczekuje bardzo długo na operacje we-wy (np. polecenie login)
Przejście do stanu zawieszonego
Pamięć zajmowana przez proces podlega wymianie (ang. swapping) tzn. zapisaniu
na dysk do obszaru wymiany (swap area).
Zwolniona pamięć może być wykorzystana przez inne procesy.
Po zajściu zdarzenia proces ponownie wczytywany z obszaru wymiany
Inne przyczyny zawieszenia procesu
Żądanie użytkownika
Brak pamięci w systemie
Proces co jakiś czas cyklicznie wykonuje jakąś czynność np. sprawozdawczość
Przejściami do i z stanu zawieszenie zarządza planista średnioterminowy
(ang. medium-term scheduler)
6
Diagram przejść
NOWY
admit
(ready)
ZAWIESZONY
suspend
(suspended)
OCZEKUJĄCY
(blocked)
timeout
AKTYWNY
(running)
release
event
occurs
(new)
GOTOWY
dispatch
ZAKOŃCZONY
(exit)
Planista długoterminowy
Planista krótkoterminowy najważniejszy i występujący w każdym systemie.–
Rozstrzyga problem któremu procesowi w stanie gotowym przydzielić procesor
Planista średnioterminowy
7
Planiści i koordynatorzy
Decyzje o tym w jakiej kolejności i które procesy zostaną umieszczone w kolejkach
podejmują mechanizmy systemu operacyjnego nazywane mechanizmami szeregującymi
lub planistami (ang. scheduler). Najważniejsze mechanizmy szeregujące
odpowiedzialne są za przydział procesora procesom gotowym do wykonania. We
współczesnych, głównie interaktywnych systemach operacyjnych istnieje tylko jeden
rodzaj takich planistów. Jest to planista krótkoterminowy. Taki planista wybiera
z kolejki procesów gotowych proces, który jako nastepny otrzyma procesor.
Wywoływany jest on bardzo czesto i musi krótko działac, aby nie tworzyc zbyt duzych
narzutów czasowych. Drugi rodzaj planistów, który był własciwy głównie dla systemów
wsadowych, to planisci długoterminowi. Taki planista był wywoływany wtedy, kiedy
konczył swe działanie jakis proces. Jego zadaniem było wybrac zadanie z puli zadan do
wykonania, które trafiało do kolejki zadan gotowych do wykonania. Planista
długoterminowy dbał o to by w tej kolejce znajdowały sie zarówno procesy
ograniczone przez wejscie-wyjscie jak i procesy ograniczone przez procesor. Dzieki
temu praca tych jednostek była równowazona. Dbał on równiez o zachowanie stopnia
wieloprogramowosci (stałej w czasie liczby procesów w pamieci). W niektórych
systemach operacyjnych stosowano równiez planistów srednioterminowych. Ich zadanie
polegało na podejmowaniu decyzji, który z procesów ma byc wycofany z pamieci
operacyjnej do pamieci pomocniczej, aby umozliwic wykonanie innym procesom.
8
Planiści i koordynatorzy
Planista (ang. scheduler) to mechanizm podejmujący decyzje o tym w jakiej kolejności i
które procesy zostaną umieszczone w kolejkach.
Najważniejsze mechanizmy szeregujące odpowiedzialne są za przydział procesora
procesom gotowym do wykonania.
Planista krótkoterminowy:
- Jedyne rozwiązanie dla współczesnych interaktywnych SO
- Zajmuje się wyborem z kolejki procesów gotowych proces, który otrzyma procesor.
- Wywoływany jest on bardzo często i musi krótko działać
Planista długoterminowy
- Charakterystyczny dla systemów wsadowych
- Wywoływany, gdy jakiś proces kończy działanie
- Wybiera zadanie z puli zadań do wykonania i umieszcza w kolejce.
- Równoważy wykorzystanie różnych zasobów komputera
Planista średnioterminowy
- Podejmowanie decyzji o zawieszeniu procesu aby umożliwić wykonanie innym procesom.
9
Blok kontrolny procesu
Blok kontrolny procesu (ang. Process Control Block, PCB) zwany także blokiem kontrolnym
zadania – jest to obszar pamięci operacyjnej, zarezerwowany przez jądro systemu
operacyjnego na potrzeby przechowywania wielu ważnych i mniej istotnych informacji o
każdym, aktualnie istniejącym i zarejestrowanym w tym systemie procesie.
PCB jest reprezentacją procesu w systemie operacyjnym.
– Stan procesu
– Identyfikator procesu
– Licznik rozkazów
– Rejestry procesora
– Informacja o przydzielonej pamięci
– Informacja o otwartych plikach
– Informacja o połączeniach sieciowych
– Informacja niezbędna do tworzenia systemowych struktur danych.
System operacyjny posługuje się różnymi kolejkami procesów. Jeżeli kolejki są
implementowane jako listy z dowiązaniami, PCB może zawierać dowiązanie (wskaźnik) do
10
następnego elementu w kolejce
Kolejki
Podstawowa struktura danych wykorzystywana w zarządzaniu procesami są
opisane wcześniej deskryptory procesów. Bloki kontrolne wszystkich procesów,
które są gotowe do wykonania powiązane są w kolejkę procesów gotowych.
Wyraz kolejka w tym kontekście nie oznacza konkretnej struktury danych, a
miejsce w którym procesy oczekują na przydział procesora.
Taka kolejka może być stosem, kolejką FIFO lub innym rodzajem listy, a nawet
innym rodzajem struktur danych (tablica, drzewem).
System operacyjny utrzymuje również kolejki zadań dla urządzeń wejścia-wyjścia.
Te kolejki tworzą deskryptory procesów będących w stanie oczekiwania.
Często upraszczając nie mówimy, ze deskryptor procesu jest w kolejce lecz, że
proces znajduje się w kolejce.
11
Wykorzystanie kolejek w systemie
operacyjnym
Ready queue – kolejka
procesów w stanie gotowym.
Proces jest przenoszony
pomiędzy kolejkami
Kolejki procesów w stanie
zablokowanym (oczekujących
na wystąpienie zdarzenia).
– Z każdym typem zdarzenia
związana jedna kolejka.
– Dzięki temu system
wydajnie implementuje
przejścia 4 oraz 5
W rzeczywistym systemie mogą być
setki kolejek dla procesów w stanie
oczekującym.
12
Kontekst procesu
Informację niezbędną do wstrzymania lub wznowienia procesu nazywamy kontekstem
procesu.
W skład kontekstu procesu wchodzi blok sterujący oraz kontekst pamięci.
Kontekst pamięci to obszar pamięci, w którym wykonuje się proces.
Przełączanie kontekstu jest to proces zachowywania i odtwarzania stanu kontekstu, tak by
wiele procesów mogło dzielić zasoby pojedynczego procesora.
Polega na przydzielaniu procesorowi kolejnych zadań i jest ważną cechą wielozadaniowego
systemu operacyjnego.
Przełączanie kontekstu jest zadaniem intensywnym obliczeniowo.
Za przełączanie kontekstu odpowiedzialny jest dyspozytor, koordynator (ang. dispatcher).
Zadania dispatchera to:
- przełączeniu kontekstu procesów,
- przełączeniu procesora w tryb użytkownika
- wykonaniu skoku do odpowiedniego adresu w programie użytkownika
13
Przełączanie kontekstu procesu
14
Przyczyny przełączania procesów
Przełączanie procesów może być wynikiem
– jawnego wywołania w programie funkcji systemu operacyjnego np. w
celu uruchomienia nowego procesu – Win32API – Windows CreateProcess;
– obsługi wyjątków i wówczas mówimy o implikowanym przełączaniu
procesów;
– zdarzenia zewnętrznego – przerwania
W systemach z podziałem czasu najczęstszą przyczyną przełączania
procesów jest przerwanie działania procesu ze względu na upływ
czasu, co powoduje wywołanie procesu nadzoru.
Czas, który jest potrzebny na przełączenie procesów jest z punktu
użytkownika stracony.
Przełączenie kontekstu a przełączenie trybu
Przełączenie kontekstu (context switch) to
zmiana procesu.
Przełączenie trybu (mode switch) to zmiana
trybu pracy procesora (jądra ↔ użytkownika)
W większości systemów (Unix,Windows) przyjęto model, w którym funkcje
systemu wykonują się w kontekście procesu użytkownika.
W uproszczeniu model ten zakłada, że system operacyjny jest kolekcją procedur
wywoływanych przez procesy w celu wykonania pewnych usług.
Przejście od programu użytkownika do programu jądra w wyniku wywołania
funkcji systemowej (przerwanie programowe) lub przerwania sprzętowego wiąże
się z przełączeniem trybu.
Zmiana trybu jest znacznie mniej kosztowna niż zmiana kontekstu.
16
Utworzenie procesu
Proces rodzicielski (macierzysty) tworzy proces potomny, który z kolei może
stworzyć kolejne procesy. Powstaje drzewo procesów (np. w systemie Unix).
17
Utworzenie procesu
Proces macierzysty może rozdzielać własne zasoby między procesy potomne tak,
że proces rodzicielski i potomny mogą:
współdzielić część zasobów
współdzielić wszystkie zasoby
nie współdzielić żadnych zasobów
Kiedy proces powołuje do życia nowy proces może w zależności od systemu:
kontynuować działanie współbieżnie ze swoimi potomkami;
oczekiwać, póki wszystkie jego procesy potomne nie zakończą działania.
Przestrzeń adresowa
– Odrębna przestrzeń adresowa dla procesu potomnego
– Proces potomny i rodzicielski wykonują się w tej samej przestrzeni
adresowej
18
Tworzenie procesu – funkcja fork
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int pid;
pid = fork();
if (pid < 0)
{ /* Błąd !!! */
fprintf(stderr, "Blad Fork");
exit(-1);
}
else
if (pid == 0)
{ /* proces potomny */
execlp("/bin/ls","ls",NULL);
}
else {
/* proces rodzicielski */
wait(NULL);
printf("Child Complete");
exit(0);
}
}
W UNIX każdemu procesowi
przyporządkowany jest jednoznaczny
identyfikator PID, będący liczbą całkowitą.
Proces potomny tworzy się za pomocą
funkcji systemowej fork.
Proces potomny zawiera kopię przestrzeni
adresowej procesu macierzystego, co
ułatwia procesowi macierzystemu
komunikację z procesem potomnym.
Oba procesy kontynuują działanie od
instrukcji następnej po fork, z tą różnicą że
wartość zwracana przez funkcję fork do
procesu potomnego wynosi zero,
natomiast proces macierzysty otrzymuje
19
niezerowy identyfikator swojego potomka.
Tworzenie procesu - Unix
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int pid;
pid = fork();
if (pid < 0)
{ /* Błąd !!! */
fprintf(stderr, "Blad Fork");
exit(-1);
}
else
if (pid == 0)
{ /* proces potomny */
execlp("/bin/ls","ls",NULL);
}
else {
/* proces rodzicielski */
wait(NULL);
printf("Child Complete");
exit(0);
}
}
vfork działa bardzo podobnie jak fork
zakładając, że proces potomny
natychmiast wywoła exit lub którąś z
funkcji z rodziny exec
Rodzina funkcji exec dokonuje wymiany
pamięci aktualnie wykonywanego
programu na wskazany w parametrze
plik programu, który następnie zostanie
załadowany do pamięci.
proces wołający nigdy nie wraca z exec
(chyba że powstanie błąd)
wait – blokuje proces do momentu
zakończenia procesu potomnego
20
Tworzenie procesu – Win32 API
CreateProcess
BOOL CreateProcess(
LPCTSTR lpApplicationName, // wskaźnik do nazwy wykonywalnego modułu
LPTSTR lpCommandLine,
// wskaźnik do łańcucha polecenia (linia poleceń)
LPSECURITY_ATTRIBUTES lpProcessAttributes,
// wskaźnik do process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// wskaźnik do thread security attributes
BOOL bInheritHandles,
// flaga dziedziczenia uchwytów
DWORD dwCreationFlags,
// flagi tworzenia
LPVOID lpEnvironment,
// wskaźnik do new environment block
LPCTSTR lpCurrentDirectory, // wskaźnik do aktualnej nazwy katalogowej
LPSTARTUPINFO lpStartupInfo,// wskaźnik do struktury STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation
// wskaźnik do struktury ROCESS_INFORMATION
);
21
Zakończenie procesu
Proces kończy swoje działanie wówczas gdy wykona ostatnią instrukcję.
Proces sam podejmuje decyzję o zakończeniu pracy – wywołując odpowiednie wywołanie
systemowe. (system Unix: exit ).
W programie w języku C jest to robione automatycznie po zakończeniu funkcji main
Proces może zostać zakończony w wyniku akcji innego procesu
– Unix: proces otrzymał sygnał SIGKILL.
– Polecenie kill w shellu, funkcje systemowe raise oraz kill.
Proces został zakończony przez system operacyjny
– Naruszenie mechanizmów ochrony
– Przekroczenie ograniczeń na przyznany czas procesora.
– Proces rodzicielski się zakończył
Wiele systemów nie pozwala na istnienie potomka po zakończeniu procesu macierzystego.
W takich systemach, jeśli proces macierzysty kończy działanie, to również wszystkie jego
procesy potomne muszą zostać zakończone. Zjawisko takie jest nazywane zakończeniem
22
kaskadowym i jest zazwyczaj inicjowane przez system operacyjny.
Sieroty i zombi
Program tworzy proces-sierotę, który będzie istniał przez około 30 sekund.
#include <stdio.h>
main(){
if (fork() == 0){
sleep(30);
exit(0);
}
exit(0);
}
Metodą fork tworzymy proces potomny, który
wykonuje warunek if (idzie spać na 30 sekund a
następnie kończy się dzięki funkcji exit).
Współbieżnie działający proces macierzysty kończy
swoje działanie zaraz po utworzeniu potomka,
osierocając go w ten sposób.
Po zakończeniu działania proces potomny kończy się
i przekazuje status zakończenia.
Status ten może zostać pobrany przez jego przodka w wyniku wywołania funkcji
systemowej wait.
23
Sieroty i zombi
Do czasu wykonania funkcji wait przez przodka status potomka przechowywany jest w
tablicy procesów na pozycji odpowiadającej zakończonemu procesowi.
Proces taki istnieje zatem w tablicy procesów pomimo, że zakończył już wykonywanie
programu i zwolnił wszystkie pozostałe zasoby systemu (pamięć, procesor, pliki).
Proces potomny, który zakończył swoje działanie i czeka na przekazanie statusu
zakończenia przodkowi, określany jest terminem zombi.
Program tworzy proces-zombi, który będzie istniał przez około 30 sekund.
#include <stdio.h>
main(){
if (fork() == 0)
exit(0);
sleep(30);
wait(NULL);
}
Metodą fork tworzymy proces potomny, który
natychmiast kończy swoje działanie przez
wywołanie funkcji exit przekazując przy tym status
zakończenia.
Proces macierzysty zwleka z odebraniem tego
statusu śpiąc przez 30 sekund, a dopiero później
wywołuje funkcję wait, co usuwa proces-zombi.
24
Literatura
Ważniak – laboratorium z systemów operacyjnych
http://wazniak.mimuw.edu.pl/index.php?title=Systemy_operacyjne#Laboratorium
Wojciech Kwedlo, Wykład z Systemów Operacyjnych Wydział Informatyki Politechniki Białostockiej
http://aragorn.pb.bialystok.pl/~wkwedlo/OS-Slides-new.html
dr inż. Jerzy Ułasiewicz Programowanie aplikacji współbieżnych – Sygnały i ich obsługa
http://www.zak.ict.pwr.wroc.pl/ulasiewicz/
dr Anna Kobusińska, Politechnika Poznańska. Materiały dydaktyczne
http://www.cs.put.poznan.pl/akobusinska/
dr inż. Paweł Paduch, Katedra Informatyki Politechniki Świętokrzyskiej w Kielcach Wykład z
Programowania współbieżnego
http://achilles.tu.kielce.pl/Members/ppaduch/
Beej's Guide to Unix IPC
http://beej.us/guide/bgipc/
Robert Love: Linux. Programowanie systemowe. Helion 2008
Stevens R.W.: Programowanie w środowisku systemu UNIX. WNT, 2002
Havilland K., Gray D., Salama B.: Unix - programowanie systemowe. ReadMe, 1999
25