background image

SYSTEMY OPERACYJNE - LABORATORIUM 
TEMATY PROJEKTÓW 
 
1. fork-exec. 

Napisać program wypisujący identyfikatory UID, GID, PID, PPID dla danego procesu (program1_1). 
Wywołać  funkcję  fork()  3  razy  np.  w  pętli  i  wypisać  powyŜsze  identyfikatory  dla  wszystkich  procesów 
potomnych.  Na  podstawie  wyników  narysować  „drzewo  genealogiczne”  tworzonych  procesów.  Ile  powstaje 
procesów i dlaczego (program1_2). 
Zmodyfikować poprzedni program tak, aby komunikaty procesów potomnych były wypisywane przez program 
uruchamiany przez funkcję exec(). Ile teraz powstaje procesów i dlaczego? (program1_3). 

 
2. wątki. 

Napisać  program  złoŜony  w  2  wątków.  Wątek  główny  losowo  generuje  elementy  tablicy  np.  int  tab[2][10]. 
Wątek  1  liczy  sumę  elementów  pierwszego  wiersza  tablicy.  Wątek  2  liczy  sumę  elementów  drugiego  wiersza 
tablicy. Wątek główny liczy sumę całkowitą z sum cząstkowych wyznaczonych przez wątki. 

 
3. semafory - sekcja krytyczna – wzajemne wykluczanie. 

Przy pomocy mechanizmu semaforów zrealizować zadanie na wzajemne wykluczanie procesów. Czas operacji 
na  zasobie  symulować  uŜywając  np.  funkcji  sleep().  Dla  demonstracji  poprawności  działania  programu  uŜyć 
komunikatów  wypisywanych  przez  poszczególne  procesy  przed,  w  trakcie  i  po  sekcji  krytycznej  (sk)  oraz 
funkcji podających stan semafora. Napisać specjalny program do powielania procesów wykorzystujący funkcje 
fork() i exec(). Nazwę programu do inicjowania procesów oraz liczbę procesów przekazywać przez argumenty 
programu powielacza. 
 
Przykładowe wywołanie „powielacza”. 
     ./program_główny   program_potomny   liczba_pp   liczba_sk 
     gdzie,   

liczba_pp 

- liczba procesów potomnych rywalizujących o sk. 

      

 

liczba_sk 

- liczba wykonań sk przez kaŜdy z procesów potomnych 

    []$ ./prog pogram 3 2  

      
4. semafory - sekcja krytyczna – producent-konsument – (plik lub pamięć dzielona). 

Producent zajmuje się produkcją towaru (np. liczb, znaków) i umieszczaniu ich we wspólnym buforze (np. pliku 
lub pamięci dzielonej), który moŜe pomieścić tylko jedną jednostkę towaru naraz. Konsument pobiera towar (nie 
niszcząc bufora) i konsumuje go. 
Aby panowała harmonia, muszą być spełnione dwa warunki: 

 

KaŜda wyprodukowana jednostka towaru musi zostać skonsumowana, 

 

ś

adna  jednostka  towaru  nie  moŜe  być  skonsumowana  dwa  razy  (nawet  jeśli  konsument  jest  szybszy  niŜ 

producent). 

Wykorzystując mechanizm semaforów zaimplementuj powyŜsze zadanie. Dla zademonstrowania, Ŝe nie doszło 
do  utraty  lub  zwielokrotnienia  towary  niech  producent  pobiera  „surowiec”  (liczby,  znaki)  do  wytwarzania 
towaru z pliku tekstowego, a konsument umieszcza pobrany  towar  w innym pliku tekstowym. Po zakończeniu 
działania  programów  (wyczerpaniu  zasobów  „surowca”)  oba  pliki  tekstowe  powinny  być  identyczne.  Do 
symulacji róŜnych prędkości działania programów uŜyć np. funkcji sleep() (z losową liczbą sekund). 

 
5. kolejki komunikatów – klient-serwer. 

Proces  klient  wysyła  do  procesu  serwera  ciąg  znaków.  Serwer  odbiera  ten  ciąg  znaków  i  przetwarza  go 
zmieniając  w  nim  wszystkie  litery  na  duŜe,  a  następnie  wysyła  tak  przetworzony  ciąg  znaków  z  powrotem  do 
klienta. Klient odbiera przetworzony ciąg znaków i wypisuje go na ekranie. 
Posługując  się  mechanizmem  kolejki  komunikatów,  naleŜy  zaimplementować  powyŜsze  zadanie  typu  klient-
serwer  z  moŜliwością  obsługi  wielu  klientów  jednocześnie.  W  rozwiązaniu  uŜyć  jednej  kolejki  komunikatów. 
Zastosować  odpowiednie  etykietowanie  komunikatów  w  celu  rozróŜniania  w  kolejce  danych  dla  serwera  oraz 
danych dla poszczególnych klientów. 

 
6. semafory – synchronizacja – pięciu filozofów. 

Zadanie zsynchronizowania działań pięciu  filozofów, którzy  siedzą przy okrągłym  stole i  myślą. Co jakiś czas 
głodnieją  i  muszą  się  najeść.  Przed  kaŜdym  filozofem  stoi  talerz,  a  między  kolejnymi  talerzami  leŜy  jeden 
widelec.  Na  środku  stołu  stoi  półmisek  z  rybami.  Ryby  naleŜy  jeść  dwoma  widelcami,  więc  filozof  aby  mógł 
jeść musi mieć do dyspozycji dwa widelce. Podnosząc leŜące przed nim widelce filozof uniemoŜliwia jedzenie 
sąsiadom. Zakłada się, Ŝe filozof w skończonym czasie się naje i odłoŜy widelec. 
Rozwiązanie problemu musi gwarantować spełnienie następujących warunków: 

background image

 

KaŜdy z filozofów będzie w końcu mógł się najeść, 

 

Nie moŜna wyróŜniać Ŝadnego z filozofów (algorytmy wszystkich pięciu filozofów dotyczące podnoszenia i 
odkładania widelców muszą być takie same). 

Zazwyczaj rozwaŜa się 3 rozwiązania problemu pięciu filozofów: 

 

Rozwiązanie  z  moŜliwością  blokady;  zgłodniały  filozof  czeka  aŜ  jeden  z  jego  widelców  (np.  lewy) 
będzie wolny i podnosi go, a następnie czeka aŜ będzie wolny drugi widelec i takŜe go podnosi. Po 
najedzeniu się odkłada widelce na stół. MoŜe zdarzyć się sytuacja kiedy kaŜdy z filozofów podniesie 
jeden  ze  swoich  widelców  i  będzie  czekał  aŜ  jego  sąsiad  skończy  jeść  i  odłoŜy  widelec.  PoniewaŜ 
kaŜdy z filozofów będzie czekał na to samo zdarzenie pojawi się blokada. 

 

Rozwiązanie  z  moŜliwością  zagłodzenia;  zgłodniały  filozof  podnosi  jednocześnie  dwa  widelce 
wtedy,  gdy  tylko  są  wolne.  JeŜeli  jeden  z  filozofów  będzie  miał  Ŝarłocznych  sąsiadów,  którzy 
głównie będą zajmować się jedzeniem, tak Ŝe w kaŜdej chwili przynajmniej jeden z nich będzie jadł,  
to taka sytuacja doprowadzi to do zagłodzenia tego filozofa. 

 

Rozwiązanie poprawne; sami filozofowie nie są w stanie rozwiązać problemu jedzenia, jeŜeli Ŝaden z 
nich  nie  ma  być  wyróŜniony.  Potrzebny  jest  zewnętrzny  arbiter  (lokaj)  decydujący,  którzy 
filozofowie będą mieli pierwszeństwo w spornych przypadkach. Lokaj dba o to, aby w kaŜdej chwili 
co  najwyŜej  czterech  filozofów  konkurowało  o  widelce  podnosząc  je  sekwencyjnie  (jak  w 
rozwiązaniu 1). Wtedy zawsze przynajmniej jeden z filozofów będzie mógł podnieść widelec i jeść. 
Jeśli pięciu filozofów zapragnie jeść naraz, to lokaj powstrzyma jednego z nich do czasu, aŜ któryś z 
pozostałych czterech skończy jeść. 

Zaimplementować  wszystkie  trzy  rozwiązania  problemu  pięciu  filozofów  uŜywając  semaforów. 
Zademonstrować zjawiska blokady i zagłodzenia, jak teŜ ich brak w rozwiązaniu poprawnym. 
 

7. potoki nazwane (mkfifo) i nienazwane (pipe) – producent-konsument. 

Zadanie jak w pkt.4. Uogólnić zadanie na wielu producentów i wielu konsumentów.