Laboratorium z systemów operacyjnych Sterowanie procesami I

Transkrypt

Laboratorium z systemów operacyjnych Sterowanie procesami I
Laboratorium
z systemów operacyjnych
Sterowanie procesami I - funkcje systemowe
Anna Wojak
1
Zagadnienia do samodzielnego przygotowania:
•
proces, identykator u»ytkownika i procesu,
•
rozgaª¦zienie procesu,
•
proces
1
sierota,
proces
zombi,
Sterowanie procesami I - funkcje systemowe Linux
Proces - zwany zadaniem, jest egzemplarzem wykonuj¡cego si¦ programu, kontrolowanym przez
system. Proces ma przydzielone zasoby typu pami¦ci (segment kodu, segment danych, segment
stosu, segment danych systemowych), procesor, urz¡dzenia zewn¦trzne itp. Cz¦±¢ przydzielonych
zasobów jest do wyª¡cznej dyspozycji procesu (np. segment danych, segment stosu), cz¦±¢ jest
wspóªdzielona z innymi procesami (np. procesor, segment kodu w przypadku wspóªbie»nego wykonywania tego samego programu w ramach kilku procesów). Ka»dy proces mo»e zacz¡¢ inne procesy, co powoduje hierarchiczn¡ struktur¦ ±rodowiska. Do najwa»niejszych funkcji systemowych
zwi¡zanych z tworzeniem i manipulowaniem procesami nale»¡:
•
fork - u»ywana do tworzenia nowych procesów,
•
exec - pozwala w ramach jednego procesu uruchomi¢ inny proces,
•
wait - zapewnia elementarn¡ synchronizacj¦ procesów,
•
exit - u»ywana do zako«czenia procesu.
2
Opis funkcji
fork()
int
fork(void)
•
poprawne wywoªanie funkcji - utworzenie procesu potomnego.
•
funkcja zwraca procesowi macierzystemu (pid) id procesu potomnego, natomiast procesowi
potomnemu zwraca O,
•
w przypadku wyst¡pienia bª¦du funkcja fork zwróci warto±¢ -1 i nie utworzy nowego procesu,
•
mo»liwe kody bª¦dów
EAGAIN - bª¡d alokacji wystarczaj¡cej ilo±ci pami¦ci na skopiowanie stron rodzica i
zaalokowanie struktury zada«,
ENOMEM - nie mo»na zaalokowa¢ niezb¦dnych struktur j¡dra z powodu braku pami¦ci.
Algorytm fork()
•
przygotowanie struktury, która b¦dzie zawiera¢ informacj¦ o nowo utworzonym procesie,
przydzielaj¡c jej odpowiedni¡ ilo±¢ pami¦ci;
•
przydzielenie pami¦¢ dla stosu j¡dra nowego procesu;
•
sprawdzenie dost¦pno±ci zasobów j¡dra, czyli warunków na ograniczenia systemowe na liczb¦
procesów w systemie i dla danego u»ytkownika;
2
•
znalezienie wolnej pozycji w tablicy procesów;
•
skopiowanie stosu j¡dra procesu macierzystego do przygotowanego w pami¦ci miejsca na stos
j¡dra potomka, by nowy proces mógª poprawnie powróci¢ z forka;
•
zaznaczenie, »e proces jest w stanie tworzony;
•
skopiowanie danych ze struktury opisuj¡cej proces macierzysty do struktury procesu potomnego - pó¹niej zmienimy jedynie warto±ci tych pól, które w procesie potomnym s¡ inne ni»
w procesie macierzystym;
•
ustalenie unikatowego identykatora nowego procesu (pid);
•
skopiowanie od ojca informacji o deskryptorach otwartych plików;
•
skopiowanie informacji o katalogu procesu oraz masce praw dost¦pu nadawanych nowo tworzonym plikom;
•
skopiowanie informacji o obsªudze sygnaªów;
•
skopiowanie informacji dotycz¡cej struktur pami¦ci procesu;
•
ustalenie rodzinnych dowi¡zania mi¦dzy nowym procesem a innymi procesami z drzewa
zada«;
•
wstawienie struktury opisuj¡cej nowy proces do tablicy procesów;
•
rozwidlenie zyczne procesów ojca i syna;
•
if (wykonywany proces jest procesem macierzystym)
{
zmie« stan potomka na gotowy do wykonania;
return (pid potomka);
}
else
{
return (0);
}
W przypadku bª¦du w którejkolwiek z cz¦±ci funkcji, spowodowanej przekroczeniem ogranicze«
systemowych b¡d¹ brakiem pami¦ci, struktury zainicjowane do tej pory s¡ kaskadowo niszczone.
getopt
int
getopt(int argc, char * const* argv, const char* opcje)
•
biblioteka
•
przetwarza krótkie wersje argumentów procesu,
•
zwraca kod opcji,
•
w przypadku bª¦du zwraca -1 (bª¦dny parametr),
• opcje
int
getopt.h,
- opis krótkich parametrów np. dla "hfv"b¦dzie je przetwarza¢ -h, -f, -v,
getpid(); int getppid();
3
•
funkcje zwracaj¡ odpowiednio identykator procesu oraz identykator przodka,
•
w przypadku bª¦du zwraca -1
int
getuid(); int getgid();
•
funkcje zwracaj¡ odpowiednio rzeczywisty identykator u»ytkownika oraz id grupy
•
w przypadku bª¦du zwraca -1
exit
void
exit( int status )
•
funkcja ko«czy dziaªanie procesu, który j¡ wykonaª,
•
przekazuje w odpowiednie miejsce tablicy procesów warto±ci status, która mo»e zosta¢ odebrana i zinterpretowana przez proces macierzysty,
•
w przypadku bª¦du zwraca -1,
•
funkcja
exit
zdeniowana jest w pliku stdlib.h.'
wait
wait( int *status )
waitpid( int pid int *status, int opcje )
int
int
•
funkcja zwraca identykator procesu potomnego, który sie zako«czyª,
•
w przypadku bª¦du funkcja zwraca -1,
•
mo»liwe kody bª¦dów:
ECHILD - je±li proces o zadanym identykatorze
pid nie istnieje lub nie jest potomkiem
procesu wywoªuj¡cego,
EINVAL - je±li argument
opcje
jest niepoprawny,
W N OHAN G nie byªa ustawiona, a zostaª przechwycony niezabloSIGCHLD,
EINTR - je±li opcja
kowany sygnaª lub
• status
- status zako«czenia procesu (liczba caªkowita), numer sygnaªu w przypadku zabicia
potomka lub warto±¢ NULL w przypadku gdy informacja o stanie zako«czenia procesu nie
jest istotna,
• opcje
- WNOHANG (natychmiastowe zako«czenie je±li potomek si¦ nie zako«czyª), WUN-
TRACED (zako«czenie tak»e dla procesów potomnych, które si¦ zatrzymaªy, a których status
jeszcze nie zostaª zgªoszony),
3
Literatura
•
Havilland K., Gray D., Salama B., Unix - programowanie systemowe,1999
•
Stevens R.W., Programowanie w rodowisku systemu UNIX, WNT, 2002.
•
Rochkind M.J., Programowanie w systemie UNIX dla zaawansowanych, WNT, 1997.
4

Podobne dokumenty