---
# System prepended metadata

title: Zadanie 1

---

# 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;
  }
}
```