Systemy Operacyjne Ćwiczenia Wies law P laczek Wydzia l Fizyki, Astronomii i Informatyki Stosowanej, Uniwersytet Jagielloński ul. Reymonta 4, 30-059 Kraków 4 lutego 2009 Streszczenie Praca ta zawiera materia ly do ćwiczeń w ramach kursu,,systemy operacyjne dla studiów Informatyki Stosowanej oraz Fizyki Komputerowej na Wydziale FAIS Uniwersytetu Jagiellońskiego w Krakowie. W pierwszych siedmiu rozdzia lach omawiane sa podstawowe zagadnienia dotyczace tworzenia, inicjowania, synchronizacji procesów oraz komunikacji mi edzyprocesowej w systemie operacyjnym UNIX. Natomiast rozdzia l ósmy poświ econy jest problematyce tworzenia i synchronizacji watków standardu POSIX. Każdy rozdzia l zakończony jest ćwiczeniem do samodzielnego wykonania przez studentów. Na ogó l polega ono na napisaniu krótkiego programu w j ezyku C, implementujacego określone zadanie przy użyciu odpowiednich funkcji systemowych i/lub bibliotecznych.
c Wies law P laczek 1 Spis treści 1 Obs luga b l edów 2 2 Procesy 2 2.1 Identyfikatory zwiazane z procesami...................... 2 2.2 Tworzenie procesów potomnych funkcja systemowa fork.......... 3 2.3 Kończenie dzia lania procesu funkcja systemowa exit............ 3 2.4 Czekanie na procesy potomne funkcja systemowa wait........... 4 2.5 Uruchamianie programów funkcja systemowa exec............. 6 3 Sygna ly 7 3.1 Opis sygna lów.................................. 7 3.2 Wysy lanie sygna lów.............................. 8 3.3 Obs luga sygna lów................................ 9 4 Potoki 11 4.1 Wprowadzenie.................................. 11 4.2 Potoki nienazwane............................... 13 4.3 Potoki nazwane (potoki FIFO)......................... 14 5 Semafory 15 5.1 Poj ecia ogólne.................................. 15 5.2 Semafory w Uniksie (System V)........................ 16 5.2.1 Podstawowe w lasności......................... 16 5.2.2 Realizacja................................ 17 6 Pami eć dzielona 21 6.1 Wprowadzenie.................................. 21 6.2 Tworzenie (uzyskiwanie dost epu do) pami eci dzielonej............ 21 6.3 Sterowanie pami eci a dzielona......................... 22 6.4 Operacje na pami eci dzielonej......................... 22 7 Kolejki komunikatów 24 7.1 Wprowadzenie.................................. 24 7.2 Tworzenie kolejek komunikatów........................ 24 7.3 Sterowanie kolejkami komunikatów...................... 25 7.4 Operacje na kolejkach komunikatów...................... 25 8 Watki 28 8.1 Wprowadzenie.................................. 28 8.2 Tworzenie watków............................... 29 8.3 Kończenie dzia lania watków.......................... 30 8.4 Podstawowe operacje zarzadzania watkami.................. 31 8.5 Synchronizacja watków............................. 31
c Wies law P laczek 2 1 Obs luga b l edów W wi ekszości przypadków funkcja systemowa (wywo lanie systemowe) lub funkcja biblioteczna, która zakończy si e b l edem zwraca wartość 1 (czasami NULL) i przypisuje zmiennej zewn etrznej errno wartość wskazujac a rodzaj b l edu. Kody b l edów oraz odpowiadajace im komunikaty b l edów znajduja si e w pliku nag lówkowym <sys/errno.h>. UWAGA: Pliki nag lówkowe podaje si e wzgl edem katalogu /usr/include/. Funkcja biblioteczna perror <stdio.h> Prototyp void perror(const char *s); wartość Nie Funkcja perror wypisuje komunikat b l edu poprzedzony napisem *s i znakiem :. 2 Procesy PROGRAM: Nieaktywny, statyczny zbiór z lożonych w odpowiedniej kolejności instrukcji oraz towarzyszacych im danych. PROCES: Podstawowe poj ecie w Uniksie. Abstrakcyjny twór sk ladaj acy si e z wykonywanego (dzia laj acego) programu oraz bieżacych danych o jego stanie i zasobach, za pomoca których system operacyjny steruje jego wykonywaniem. Proces jest jednostka dynamiczna. W Uniksie procesy moga być wykonywane równolegle (na jednym procesorze prze l aczanie kontekstu) wielozadaniowość. 2.1 Identyfikatory zwiazane z procesami Podstawowe identyfikatory zwiazane z procesami oraz funkcje systemowe s luż ace do ich uzyskiwania: Nazwa Funkcja systemowa Opis UID uid t getuid(void); identyfikator użytkownika (rzeczywisty) GID gid t getgid(void); identyfikator grupy użytkownika (rzeczywisty) PID pid t getpid(void); identyfikator procesu PPID pid t getppid(void); identyfikator procesu macierzystego (przodka) PGID pid t getpgid(pid t pid); identyfikator grupy procesów (=PID lidera grupy) pid t getpgrp(void); getpgid(0); PGID procesu bieżacego Powyższe identyfikatory przyjmuja wartości liczb ca lkowitych nieujemnych. Jedynie funkcja getpgid może zakończyć si e b l edem wówczas zwraca wartość -1 i ustawia zmienna errno.
c Wies law P laczek 3 Pliki nag lówkowe niezb edne dla wywo lania powyższych funkcji: <sys/types.h> <unistd.h> Z poziomu pow loki podstawowe informacje o bieżacych procesach można uzyskać przy pomocy komendy ps, np. ps -el podaje wykaz wszystkich bieżacych procesów w tzw. d lugim formacie (wi ecej szczegó lów w podr eczniku systemowym man). Podglad najbardziej aktywnych procesów w czasie rzeczywistym można uzyskać za pomoca komendy top. 2.2 Tworzenie procesów potomnych funkcja systemowa fork <sys/types.h>, <unistd.h> Prototyp pid t fork(void); wartość 0 w procesie potomnym 1 Tak PID procesu potomnego w procesie macierzystym Funkcja systemowa fork tworzy proces potomny, który jest kopia procesu macierzystego. Typowe wywo lanie funkcji fork switch (fork()) { case -1: perror("fork error"); exit(1); case 0: /* akcja dla procesu potomnego */ default: /* akcja dla procesu macierzystego, np. wywolanie funkcji wait */ }; 2.3 Kończenie dzia lania procesu funkcja systemowa exit <stdlib.h> Prototyp void exit(int status); wartość Nie Jednym ze sposobów zakończenia procesu jest wywo lanie funkcji systemowej exit. Funkcja ta wykonuje operacje zakończenia dzia lania procesu i zwraca do procesu macierzystego ca lkowitoliczbow a wartość status, oznaczajac a status zakończenia procesu. Zgodnie
c Wies law P laczek 4 z konwencja, w przypadku poprawnego zakończenia procesu zwracana jest wartość 0, a w przypadku b l edu wartość niezerowa 1. Do oznaczania sukcesu czy porażki można użyć sta lych: EXIT SUCCESS i EXIT FAILURE, zdefiniowanych w pliku <stdlib.h>. Można zdefiniować w lasne procedury zakończenia procesu i zerejestrować je przy pomocy funkcji bibliotecznej atexit. Takie procedury zostana wywo lane przez funkcj e exit w kolejności odwrotnej do kolejności ich rejestracji. 2.4 Czekanie na procesy potomne funkcja systemowa wait W systemie UNIX na każdy proces, za wyjatkiem procesu init (o identyfikatorze PID = 1), powinien czekać jakiś proces macierzysty. Proces, który si e zakończy l, ale na który nie czeka l żaden inny proces nazywa si e zombi. Proces-zombi nic nie robi, ale zajmuje miejsce w systemowej tabeli procesów. Aby uniknać powstawania procesów-zombi, w Uniksie procesy,,sieroty sa,,adoptowane przez proces init, który w odniesieniu do nich wykonuje operacje czekania. <sys/types.h>, <sys/wait.h> Prototyp pid t wait(int *stat loc); wartość PID procesu potomnego 1 Tak Do oczekiwania na proces potomny s luży funkcja systemowa wait. Zawiesza ona dzia lanie procesu macierzystego do momentu zakończenia si e pierwszego procesu potomnego 2. Informacje o stanie potomka zwracane sa przez parametr stat loc (tylko dwa m lodsze bajty sa używane). Jeśli proces potomny zakończy l si e normalnie, to najm lodszy bajt b edzie równy 0, a nast epny b edzie zawiera l kod powrotu. W przypadku zakończenia procesu potomnego na skutek sygna lu, najm lodszy bajt b edzie zawiera l numer sygna lu, a nast epny wartość 0 (w przypadku wygenerowania zrzutu pami eci core, najstarszy bit najm lodszego bajtu b edzie ustawiony na 1). Gdy parametr funkcji wait b edzie ustawiony na NULL, to stan procesu potomnego nie zostanie zwrócony. Jeżeli dany proces nie ma procesów potomnych, to funkcja kończy si e b l edem i ustawia zmienna errno na ECHILD. <sys/types.h>, <sys/wait.h> Prototyp pid t waitpid(pid t pid, int *stat loc, int options); wartość PID procesu potomnego lub 0 1 Tak Lepsza funkcjonalność niż funkcja wait dostarcza funkcja waitpid. Funkcji tej można wskazać konkretny proces czy też grup e procesów, na które ma czekać. Jeżeli argument 1 Faktycznie zwracanych jest tylko pierwszych osiem bitów, zatem zwracane wartości należa do przedzia lu [0,255]. 2 Uwaga: Funkcja wait czeka na zakończenie tylko jednego procesu potomnego tego który zakończy si e najwcześniej. W celu oczekiwania na zakończenie kolejnego procesu, trzeba ja wywo lać ponownie.
c Wies law P laczek 5 pid > 0 i argument options = 0, to funkcja zablokuje wywo luj acy ja proces do czasu zakończenia procesu potomnego o PID = pid. Znaczenie parametru stat loc jest takie jak dla funkcji wait. Wi ecej szczegó lów można znaleźć w podr eczniku systemowym man. ĆWICZENIE 1: Procesy Potomne: fork (1) Napisać program wypisujacy identyfikatory UID, GID, PID, PPID i PGID dla danego procesu. (2) Wywo lać funkcj e fork 3 razy (np. w p etli) i wypisać powyższe identyfikatory dla wszystkich procesów potomnych. (3) Wstawić funkcj e sleep tak, aby procesy pojawia ly si e na ekranie grupowane pokoleniami od najstarszego do najm lodszego. (4) Na podstawie wyników programów narysować,,drzewo genealogiczne tworzonych procesów (z zaznaczonymi identyfikatorami). Ile powstaje procesów i dlaczego? Funkcja sleep: <unistd.h> Prototyp unsigned sleep(unsigned seconds); wartość Liczba nieprzespanych sekund Nie
c Wies law P laczek 6 2.5 Uruchamianie programów funkcja systemowa exec Funkcja systemowa exec s luży do ponownego zainicjowania procesu na podstawie wskazanego programu. Jest 6 odmian funkcji exec zgrupowanych w 2 rodziny (po 3 funkcje). Rodziny różnia si e postacia argumentów: litera l w nazwie oznacza argumenty w postaci listy, a litera v w postaci tablicy (ang. vector). Poniżej omawiamy po jednym przedstawicielu każdej z rodzin. <unistd.h> Prototyp int execl(const char *path, const char *arg0,..., const char *argn, char *null); int execv(const char *path, char *const argv[ ]); wartość Nic nie zwraca 1 Tak (,,pope lnia samobójstwo ) Argumenty funkcji exec: path ścieżkowa nazwa pliku (wykonawczego) zawierajacego program; arg0 argument zerowy: nazwa pliku (wykon.) zawierajacego program; arg1,...,argn argumenty wywo lania programu; null wskaźnik NULL; argv[ ] adres tablicy wskaźników na ciagi znaków b ed ace argumentami przekazywanymi do wykonywanego programu (ostatnim elementem powinien być NULL). Najcz eściej funkcj e exec wywo luje si e w po l aczeniu z funkcja fork. Typowe wywo lanie fork i exec switch (fork()) { case -1: perror("fork error"); exit(1); case 0: /* proces potomny */ execl("./nowy_program.x","nowy_program.x",null); perror("execl error"); exit(2); default: /* proces macierzysty */ }; ĆWICZENIE 2: Uruchamianie Programów: exec Zmodyfikować poprzedni program tak, aby komunikaty procesów potomnych by ly wypisywane przez program uruchamiany przez funkcj e exec. Ile teraz powstaje procesów i dlaczego?