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