5.5. Klasicke problemy synchronizace

5.5.1. Problem omezeneho bufferu

5.5.2. Problem zapisovace a snimace

	repeat
		   ...
		vytvor polozku do nova_polozka
		   ...
		cekej(prazdny);
		cekej(vzajed);
		   ...
		uloz nova_polozka do buffer
		   ...
		signal(vzajed);
		signal(plny);
	until false;
Obr. 60 Kod producenta v problemu omezeneho bufferu
	repeat
		cekej(plny);
		cekej(vzajed);
		   ...
		odeber polozku z buffer do nova_polozka
		   ...
		signal(vzajed);
		signal(prazdny);
		   ...
		zpracuj polozku v nova_polozka
		   ...
	until false;
Obr. 61 Kod prijemce v problemu omezeneho bufferu
	var vzajed, zps : semafor;
	    citac_cteni : integer;
	cekej(zps);
	   ...
	zapis je vykonan
	   ...
	signal(zps);
Obr. 62 Struktura zapisovace
	cekej(vzajed);
	  citac_cteni := citac_cteni + 1;
	  if citac_cteni = 1 then cekej(zps);
	signal(vzajed);
		...
		cteni je vykonano
		...
	cekej(vzajed);
	  citac_cteni := citac_cteni - 1;
	  if citac_cteni = 0 then signal(zps);
	signal(vzajed);
Obr. 63 Struktura snimace

5.5.3. Problem hladovych filozofu (The Dining-Philosophers Problem)

Obr. 64 Problem hladovych filozofu

	repeat
		cekej(tycka(i));
		cekej(tycka(i+1 mod 5));
			...
      		       jedeni
			...
		signal(tycka(i));
		signal(tycka(i+1 mod 5));
			...
		     premysleni
			...
	until false
Vypis 1 Struktura i-teho filozofa

    1. Pustit ke stolu maximalne 4 filozofy.

    2. Dovolit filozofovi vzit tycku pouze tehdy, ma-li k dispozici obe.

    3. Resit problem asymetricky, tj. Lisi filozofove by nejdrive sebrali levou tycku a potom pravou. Sudi filozofove naopak nejdrive pravou a potom levou.

    4. Reseni za uziti monitoru si ukazeme v patricne kapitole.

5.6. Kriticke oblasti

    1. Uvazujme, ze by nektery proces volal funkce cekej a signal v opacnem poradi, tj.:
      		signal(vzajed);
      		       ...
      		kriticka sekce
      		       ...
      		cekej(vzajed);
      
      
      Diky teto chybe muze nastat situace, ze vice procesu sdilejicich semafor vzajed bude soucasne ve sve kriticke sekci. Odhaleni teto chyby je mozne pouze v pripade, ze takova situace nastane (tj. ze vice procesu bude soucasne aktivni ve svych kritickych sekcich).

    2. Necht jeden proces obsahuje tuto sekvenci prikazu:
      		cekej(vzajed);
      		       ...
      		kriticka sekce
      		       ...
      		cekej(vzajed);
      
      V tomto pripade muze nastat zablokovani (deadlock) procesu.

    3. Uvazme, ze nektery proces vynecha bud funkci cekej nebo signal nebo obe dve. V tom pripade nastava bud poruseni vzajemne jednoznacnosti nebo deadlock.
	var p: shared T;
	region p when B do S;
	region p when true do S1;
	region p when true do S2;
	var buffer: shared record
			pool: array (0..n-1) of polozka;
			citac, in, out : integer;
		    end;
	region buffer when citac < n
	do begin
		pool(in) := nova_hodnota;
		in := in + 1 mod n;
		citac := citac + 1;
	end;
	region buffer when citac > 0
	do begin
		prijata_hodnota := pool(out);
		out := out + 1 mod n;
		citac := citac - 1;
	end;
	var vzajed, prvni_cekani, druhe_cekani : semafor;
	    prvni_citac, druhy_citac : integer;
	cekej(vzajed);
	while not B do begin
		prvni_citac := prvni_citac + 1;
		if druhy_citac > 0
			then signal(druhe_cekani)
			else signal(vzajed);
		cekej(prvni_cekani);
		prvni_citac := prvni_citac - 1;
		druhy_citac := druhy_citac +1;
		if prvni_citac > 0
			then signal(prvni_cekani)
			else signal(druhe_cekani);
		cekej(druhe_cekani);
		druhy_citac := druhy_citac - 1;
	end;
	S;
	if prvni_citac > 0
		then signal(prvni_cekani)
			else if druhy_citac > 0
				then signal(druhe_cekani)
				else signal(vzajed);
Vypis 2 Implementace kriticke oblasti
Zpet Obsah Vpred