5. Synchronizace procesu

5.1. Pozadi

		repeat
			{vytvor dalsi polozku do nova_hodnota}
			while citac = n do nic_nedelej;
			buffer(in) := nova_hodnota;
			in := in + 1 mod n;
			citac := citac + 1;
		until false;
		repeat
			while citac = 0 do nic_nedelej;
			prijata_hodnota := buffer(out);
			out := out + 1 mod n;
			citac := citac - 1;
			{zpracuj prijatou polozku v prijata_hodnota}
		until false;
T0	producent	spousti		registr1 := citac		{registr1 = 5}
T1	producent	spousti		registr1 := registr1 + 1	{registr1 = 6}
T2	prijemce	spousti		registr2 := citac		{registr2 = 5}
T3	prijemce	spousti		registr2 := registr2 - 1	{registr2 = 4}
T4	producent	spousti		citac := registr1		{citac = 6}
T5	prijemce	spousti		citac := registr2		{citac = 4}

5.2. Problem kriticke sekce

	repeat

		vstupni sekce

		kriticka sekce

		ukoncovaci sekce

		zbyvajici sekce

	until false

    1. vzajemnou jedinecnost (mutual exclusion): Jestlize proces Pi vykonava svou kritickou sekci, zadny jiny proces ji vykonavat nesmi.

    2. progress: Jestlize u zadneho procesu neprobiha jeho kriticka sekce a existuji nejake procesy, ktere chteji svou kritickou sekci spustit, pak pouze ty procesy, ktere vykonavaji zbyvajici sekci se mohou ucastnit rozhodnuti ktera kriticka sekce ktereho procesu bude spustena a tento vyber nesmi byt neomezene odlozen.

    3. omezene cekani (bounded waiting): Musi existovat omezeni v poctu casovych kvant mezi odeslanim pozadavku na vykon kriticke sekce procesem a umoznenim tohoto vykonu.

5.2.1. Reseni pro dva procesy

Algoritmus 1

	repeat
		while otacka <> i do nic_nedelej;
		
		kriticka sekce

		otacka := j;

		zbyvajici sekce
	
	until false;
Obr. 52 Struktura procesu Pi v algoritmu 1

Algoritmus 2

	var priznak: array (0..1) of
boolean;
	repeat

		priznak(i) := true;
		while priznak(j) do nic_nedelej;

		kriticka sekce

		priznak(i) := false;

		zbyvajici sekce

	until false;
Obr. 53 Struktura procesu Pi v algoritmu 2

Algoritmus 3

	var	priznak: array (0..1) of boolean;
		otacka: 0..1;
	repeat

		priznak(i) := true;
		otacka := j;
		while (priznak(j) and otacka = j) do 
			nic_nedelej;

		kriticka sekce

		priznak(i) := false;

		zbyvajici sekce

	until false;
Obr. 54 Struktura procesu Pi v algoritmu 3

5.2.2. Reseni pro vice procesu

	var	vyber: array (0..n-1) of boolean;
		cislo: array (0..n-1) of integer;
	repeat

		vyber(i) := true;
		cislo(i) := max(cislo(0), ... cislo(n-1))+ 1;
		vyber(i) := false;
		for j = 0 to n - 1 do begin
			while vyber(j) do nic_nedelej;
			while cislo(j) <> 0 and (cislo(j),j) < (cislo(i),i) do 
				nic_nedelej;
		end;

		kriticka sekce
		
		cislo(i) := 0;

		zbyvajici sekce
	
	until false;
Obr. 55 Pekaruv algoritmus pro proces Pi
Zpet Obsah Vpred