Kódování:  ASCII - ISO Latin 2 - MS Windows - Kameníci - Jiné

Ukolem tohoto cviceni je:

Problem producent-konzument

V minulem cviceni jsme se seznamili s problemem kriticke sekce a s jeho resenim pomoci semaforu.

Problem kriticke sekce nastava v situacich, kdy procesy pristupuji ke zdroji (nejcasteji ke sdilene pameti), ktery nemuze byt v danem okamziku sdilen vice nez jednim procesem. V mnoha pripadech by kazdy z procesu mohl existovat samostatne - komunikace mezi procesy slouzi pouze pro synchronizaci pristupu ke zdroji.

Odlisna situace nastava, spolupracuji-li dva nebo vice procesu na reseni spolecne ulohy. V tomto druhem pripade procesy o svoji existenci vedi a potrebuji spolu komunikovat. Mnohe ulohy tohoto typu spadaji do kategorie producent-konzument: Jeden proces (producent) vytvari bloky dat a druhy (konzument) je spotrebovava. Jako priklad si muzeme predstavit program generujici tiskove sestavy a druhy program, ktery tyto sestavy tiskne na tiskarnu.

Problem producent-konzument (nazyvany nekdy take problem ohranicene vyrovnavaci pameti) byva obvykle formulovan takto: Dva procesy sdileji spolecnou vyrovnavaci pamet pevne velikosti. Producent vytvari nove bloky dat a vklada je do vyrovnavaci pameti, odkud je konzument vyjme a zpracuje. Oba procesy bezi paralelne a o jejich vzajemne rychlosti nelze nic predpokladat.

Pri reseni musime pocitat se situaci, kdy producent chce vlozit do vyrovnavaci pameti polozku, ale pamet je jiz plna. Resenim je pozastavit producenta na dobu, nez konzument nekterou polozku vyjme. Podobne musi byt pozastaven konzument, pokud by chtel vyjmout polozku z vyrovnavaci pameti v dobe, kdy zadnou polozku neobsahovala. Spravne reseni musi take zabranit vsem casovym soubehum.

Reseni problemu producent-konzument pomoci semaforu

Problem producent-konzument lze vyresit pomoci dvou citajicich semaforu. Semafor nazvany full bude citat pocet plnych polozek, semafor empty pocet prazdnych polozek. Semafor full je na pocatku nulovy, semafor empty obsahuje pocet polozek vyrovnavaci pameti. Tyto semafory slouzi pro synchronizaci - zabranuji tomu, aby producent zapisoval do plne nebo konzument cetl z prazdne vyrovnavaci pameti.

Nize uvedene reseni pouziva jeste treti semafor mutex, ktery zajistuje, aby do sdilene vyrovnavaci pameti v danem okamziku pristupoval pouze jeden proces.

var 
    empty, full, mutex: semaphore;

    empty:=N;  { pocet prazdnych polozek vyrovnavaci pameti }
    full :=0;  { pocet plnych slotu vyrovnavaci pameti }
    mutex:=1;  { semafor pro vzajemne vylouceni }

proces producent:
    while true do
    begin
        vytvor dalsi polozku;
        P(empty);
        P(mutex);
        vloz polozku do vyrovnavaci pameti;
        V(mutex);
        V(full);
    end;

proces konzument:
    while true do
    begin
        P(full);
        P(mutex);
        vyjmi polozku z vyrovnavaci pameti;
        V(mutex);
        V(empty);
        zpracuj polozku;
    end;

Zadani zapoctove ulohy

Prostudujte vyse uvedene reseni problemu producent-konzument pomoci sdilene pameti a semaforu.

Semafor mutex nebude zapotrebi, je-li vyrovnavaci pamet implementovana pomoci pole. Toto tvrzeni overte.

S pouzitim modulu podpory "procesu" a vlastni implementace semaforu (viz minule cviceni) implementujte reseni problemu producent-konzument s temito vlastnostmi:

Implementaci ulohy popiste. Dokumentace musi obsahovat:

Dokumentace musi byt odevzdana na papire formatu A4.

Pred odevzdanim si zapoctovou ulohu pripravte pro predvedeni v nektere katedralni laboratori (nejlepe v UL409).

Upozorneni: Uloha musi byt vypracovana samostatne, jinak ztracite pravo na ziskani zapoctu.


Lukas Petrlik
luki@kiv.zcu.cz