# Zadanie 1 ``` binary semaphore mutex; semaphore wolne_drukarki = K; int ile_wolnych = K; binary semaphore drukarki[K]; int ile_osob[K]; int ktora_drukarka[N]; int ile_czeka[N]; semaphore firmy[N]; process Pracownik{ int firma; while(true){ P(mutex); if(ktora_drukarka[firma] == -1 || ile_wolnych == 0){ ile_czeka[firma] += 1; if(ile_czeka[firma] == 1){ if(ile_wolnych == 0) V(mutex); P(wolne_drukarki); for(int i = 0; i < K; i++){ if(ile_osob[i] == 0){ ile_wolnych--; ktora_drukarka[firma] = i; break; } } }else{ V(mutex); P(firmy[firma]); } ile_czeka[firma]--; } ile_osob[ktora_drukarka[firma]]++; if(ile_czeka[firma] > 0){ V(firmy[firma]); }else{ V(mutex); } P(drukarka[ktora_drukarka[firma]]); drukuj(ktora_drukarka[firma]); ile_osob[ktora_drukarka[firma]] -= 1; V(drukarka[ktora_drukarka[firma]]); P(mutex); if(ile_osob[ktora_drukarka[firma]] == 0){ ile_wolnych++; ktora_drukarka[firma] = -1; V(wolne_drukarki); }else{ V(mutex); } } }; ``` # Zadanie 2 ``` binary semaphore mutex = 1; semaphore liderzy = 1; semaphore czekaj_na_przeciwnika = 0; sempahore druzyny[N] = {0, ..., 0}; int ile_gotowych_druzyn = 0; int ile_czeka[N] = {0, ..., 0}; int ile_gra[N] = {0, ..., 0}; int z_kim_gra[N] = {-1, ..., -1}; int kim_jestem = -1; process Zawodnik{ int druzyna; while(true){ P(mutex); ile_czeka[druzyna]++; if(ile_czeka[druzyna] == K){ ile_gotowych_druzyn++; V(mutex); P(liderzy); if(kim_jestem == -1){ kim_jestem = druzyna; V(liderzy); P(czekaj_na_przeciwnika); }else{ z_kim_gra[druzyna] = kim_jestem; z_kim_gra[kim_jestem] = druzyna; kim_jestem = -1; V(czekaj_na_przeciwnika); } ile_gotowych_druzyn--; }else{ V(mutex); P(druzyny[druzyna]); } ile_czeka[druzyna]--; ile_gra[druzyna]++; if(ile_czeka[druzyna] > 0){ V(druzyny[druzyna]); } if(ile_czeka[druzyna] == 0 && ile_czeka[z_kim_gra[druzyna]] == 0) V(mutex); mecz(z_kim_gra[druzyna]); P(mutex); ile_gra[druzyna]--; if(ile_gra[druzyna] == 0 && ile_gra[z_kim_gra[druzyna]] == 0){ V(liderzy); if(ile_gotowych_druzyn == 0) V(mutex); }else{ V(mutex); } }; }; ``` # Zadanie 4 ``` binary semaphore mutex = 1; semaphore reszta[2] = {0, 0}; semaphore grupa[2] = {0, 0}; semaphore lider = 0; int suma_wag[2] = {0, 0}; int ile_czeka[2] = {0, 0}; int ile_reszty[2] = {0, 0}; bool gotowi[2] = {false, false}; process P(int typ, int waga){ while(true){ wlasneSprawy(); P(mutex); if(suma_wag[typ] + waga > 3*K){ ile_reszty[typ]++; V(mutex); P(reszta[typ]); ile_reszty[typ]--; } if(suma_wag[typ] + waga < 2 * k){ ile_czeka[typ]++; suma_wag[typ] += waga; if(ile_reszty[typ] > 0) V(reszta[typ]); else V(mutex); P(grupa[typ]); }else{ gotowi[typ] = true; if(gotowi[1 - typ]){ V(lider); }else{ V(mutex); P(lider); } suma_wag[typ] = 0; gotowi[typ] = false; } ile_czeka[typ]--; if(ile_czeka[typ] > 0){ V(grupa[typ]); }else if(ile_czeka[1-typ] ==0){ V(mutex); } zadanie(); } } ``` # Zadanie 5 ``` binary semaphore mutex = 1; semaphore klient_czekaj = 0; int ile_klientow = 0; semaphore pracownik_czekaj = 0; semaphore pracownik_czekaj_na_id = 0; binary semaphore gotowy = 0; int ile_pracownikow = 0; int ile_czeka_na_id = 0; int suma_doswiadczen = 0; int doswiadczenie_grupy = 0; int id_grupy = -1; int id_klienta = -1; bool klient_wyszedl = false; process Klient(){ int id; while(true){ P(mutex); if(suma_doswiadczen < M){ ile_klientow++; V(mutex); P(klient_czekaj); }else{ V(pracownik_czekaj); } ile_klientow--; P(gotowy); id_klienta = id; V(pracownik_czekaj_na_id); obsluga(id_grupy); klient_wyszedl = true; if(ilu_pracownikow == 0) id_klienta = -1; klient_wyszedl = false; V(mutex); } } process Pracownik(){ int id; int doswiadczenie; while(true){ P(mutex); suma_doswiadczen += doswiadczenie; if(suma_doswiadczen < M || ile_klientow == 0){ V(mutex); P(pracownik_czekaj); }else{ V(klient_czekaj); } suma_doswiadczen -= doswiadczenie; doswiadczenie_grupy += doswiadczenie; ile_czeka_na_id++; ile_pracownikow++; if(ile_pracownikow == 1){ init(id, id_grupy); }else{ dodaj(id_grupy, id); } if(doswiadczenie_grupy < M){ V(pracownik_czekaj); }else{ V(gotowy); } P(pracownik_czekaj_na_id); ile_czeka_na_id--; if(ile_czeka_na_id > 0) V(pracownik_czekaj_na_id); praca(id_klienta); ile_pracownikow--; if(ile_pracownikow == 0 && czy_klient_wyszedl) id_klienta = -1; klient_wyszedl = false; V(mutex); } } ``` # Zadanie 6 ``` process Goral(){ int numer_gorala; while (true) { czekam_na_turystow(numer_gorala); czekam_na_wysiadajacych(numer_gorala); } } process Turysta(){ while (true) { int ktorym_jade; czekam_na_woz(ktorym_jade); wysiadam(ktorym_jade); } } Monitor MOKO(){ condition turysta; condition woz[k]; int ile_turystow = 0; int ile_w_wozie[K] = {0, ..., 0}; int moj_woz = -1; condition goral; void czekam_na_woz(int &ktorym_jade){ ile_turystow++; if(ile_turystow < MIN || empty(goral)){ wait(turysta); }else{ signal(goral); } ktorym_jade = moj_woz; ile_turystow--; ile_w_wozie[ktorym_jade]++; if(ile_turystow > 0 && ile_w_wozie[ktorym_jade] < MAX) signal(turysta); } void wysiadam(int &ktorym_jade){ ile_w_wozie[ktorym_jade]--; if (ile_w_wozie[ktorym_jade] == 0) signal(woz[ktorym_jade]) } void czekam_na_turystow(int n){ if(ile_turystow < MIN){ wait(goral); } moj_woz = n; signal(turysta); } void czekam_na_wysiadajacych(int n){ if(ile_w_wozie[n] > 0) wait(woz[n]); } } ``` # Zadanie 7 ``` process Turysta(){ int id; while(true){ wlasne_sprawy(); int lewy = 0, prawy = 0; int przewodnik = 0; chce_isc(przewodnik, lewy, prawy, id); wycieczka(przewodnik, lewy, prawy); } } process Przewodnik(){ int id; while(true){ wlasne_sprawy(); int ile_turystow; chce_turystow(ile_turystow, id); prowadze_wycieczke(ile_turystow); } } monitor Wycieczka{ int ile_turystow = 0; condition turysta; condition przewodnik; int przewodnik_grupy = 0; int ile_w_grupie = 0; int lewy = 0; int prawy = 0; void chce_isc(int *_przewodnik, int *_lewy, int *_prawy, int _id){ ile_turystow++; if(ile_turystow < min || empty(przewodnik)){ wait(turysta); }else{ signal(przewodnik); } _przewodnik = przewodnik_grupy; _lewy = lewy; lewy = _id; ile_turystow--; ile_w_grupie++; if(ile_w_grupie < max && ile_turystow > 0){ signal(turysta); } _prawy = prawy; prawy = id; if(_lewy == 0){ lewy = 0; prawy = 0; ile_w_grupie = 0; przewodnik_grupy = 0; } } void chce_turystow(int *_ile_turystow, int _id){ if(ile_turystow < min){ wait(przewodnik); } przewodnik_grupy = _id; _ile_turystow = ile_turystow > max ? max : ile_turystow; } } ```