3. cvičenie – Vypínač, P – K, Č – Z 💡

Zdrojové súbory na cvičenie, ktoré vidíte vo výpisoch nižšie, si môžete stiahnuť spoločne ako archív.

1. Vypínač

Podľa pseudokódu uvedeného v prednáške implementujte ADT Lightswitch. ADT Lightswitch nech poskytuje dve metódy: enter() a leave() podľa nasledovnej špecifikácie:

  1. enter(semaphore)
  2. leave(semaphore)

Interný stav ADT Lightswitch je daný počítadlom counter a mutexom mutex, ktorý chráni integritu počítadla.

Správanie ADT Lightswitch:

  1. Ak vlákno zavolá metódu enter(), a toto vlákno je prvým, ktoré sa pokúša „dostať do miestnosti“, nech vyvolá nad semaforom, ktorý je argumentom metódy enter(), operáciu wait().
  2. Ak vlákno zavolá metódu leave, a toto vlákno je posledným, ktoré sa pokúša „dostať z miestnosti“, nech vyvolá nad semaforom, ktorý je argumentom metódy leave(), operáciu signal().

Na jednoduchom príklade nižšie overte funkčnosť svojej implementácie. Sledujte výpisy. Pokiaľ vojde do miestnosti niektoré vlákno typu A, žiadne iné vlákno (ani typu A) nesmie do miestnosti vojsť, pokým vlákno z miestnosti nevyjde von. Ak vojde do miestnosti vlákno typu B, žiadne vlákno typu A nesmie do miestnosti vojsť. Iné vlákna typu B však do miestnosti môžu ľubovoľne vchádzať. Až keď vyjde z miestnosti posledné vlákno typu B, môže do miestnosti vstúpiť vlákno typu A (alebo aj vlákno typu B).

2. Úprava testovacieho programu

Časť A

Upravte funkcionalitu vlákien typu A tak, aby mohli byť v miestnosti súčasne viaceré vlákna typu A. Zároveň musíte zachovať invariant, že pokiaľ je v miestnosti vlákno typu A, nesmie s ním byť v miestnosti vlákno typu B a naopak.

Sledujte výstup simulácie. Skontrolujte, či sa simulácia správa podľa vyššie uvedeného očakávania.

Riešenie uložte ako samostatný súbor s identifikátorom v mene súboru „2a“.

Časť B (viď problém UniWC)

Zvýšte počet vlákien typu B na hodnotu 20 v počet vlákien typu A na hodnotu 3. Spustite simuláciu. Z pozorovania výstupu vyvoďte záver.

V tejto časti chceme dosiahnuť odstránenie vyhladovenia vlákien. Do riešenia doplňte mechanizmus, ktorý zabezpečí, že:

  1. Ak sa v miestnosti nachádzajú vlákna typu A (hoc čo i len jedno) a vlákno typu B chce vstúpiť do miestnosti, vláknam typu A bude do miestnosti vstup zakázaný. To znamená, že ďalšie vlákna typu A už nemôžu do miesnosti vchádzať. Vlákno typu B bude čakať, pokým všetky vlákna typu A neopustia miestnosť, potom do nej vstúpi.
  2. Ak sa v miestnosti nachádzajú vlákna typu B (hoc čo i len jedno) a vlákno typu A chce vstúpiť do miestnosti, vláknam typu B bude do miestnosti vstup zakázaný. To znamená, že ďalšie vlákna typu B už nemôžu do miesnosti vchádzať. Vlákno typu A bude čakať, pokým všetky vlákna typu B neopustia miestnosť, potom do nej vstúpi.

Pozorujte výstup. Ako často sa stáva, že sa v miestnosti budú nachádzať všetky tri vlákna typu A?

Riešenie uložte ako samostatný súbor s identifikátorom v mene súboru „2b“.

Časť C (priorita vlákien)

Nakoniec zvýhodnite vlákna typu A, aby mali prednosť pri vstupe do miestnosti pred vláknami typu B. To znamená, že ak bude chcieť vlákno typu A vstúpiť do miestnosti, žiadnemu vláknu typu B nebude umožnené do miestnosti vojsť, aj keď sa v miestnosti nachádza nejaké vlákno typu B. Zároveň musíte zachovať invariant, že pokiaľ sa v miestnosti nachádza vlákno typu A, môže do miestnosti vstúpiť iné vlákno typu A, ale nesmie sa v miestnosti nachádzať žiadne vlákno typu B.

Pozorujte výstup simulácie. Mali by ste vidieť, že vláknam typu A sa častejšie darí zotrvať v miestnosti spoločne. To znamená, že pokiaľ sa v miestnosti nachádza nejaké vlákno typu A, ostatným vláknam typu A, ktoré chcú do miestnosti vstúpiť, sa darí „obiehať“ vlákna typu B čakajúce na vstup do miestnosti.

Riešenie uložte ako samostatný súbor s identifikátorom v mene súboru „2c“.

3. Producent – Konzument

Model synchronizačného problému Producent – Konzument (PK) v sebe zahŕňa niekoľko parametrov, ktoré môžu mať zásadný vplyv na efektivitu modelovaného systému (meranú priepustnosťou, čiže počtom výrobkov vyrobených/spracovaných za jednotku času). Okrem priepustnosti systému je možné zvažovať aj iné kritériá optimality, napríklad latenciu (dobu, ktorú strávi výrobok v systéme, pokým nie je prevzatý na spracovanie). Parameter latencie je obzvlášť zaujímavý v modeloch, ktoré požadujú, aby sa výrobok dostal čo najskôr na spracovanie (odbyt). Príkladom môžu byť typy potravín s krátkou životnosťou (surové mäso) či technologické postupy, kde nasledujúci stupeň spracovania výrobku musí prebehnúť do presne limitovaného času, inak ďalšie spracovanie nebude možné. Zaujímavou optimalizačnou úlohou môže byť zadanie, v ktorom sa požaduje latencia v nejakom špecifikovanom intervale, ktorý nezačína od nuly. Napríklad v hrnčiarstve je to tak, že po vymodelovaní tvaru nádoby nie je možné okamžite nalepiť ucho nádoby. Je potrebné istý čas počkať, až potom sa dá uško prilepiť. Zároveň však platí, že nie je možné čakať príliš dlho.

V nami modelovanom probléme PK nebudeme venovať pozornosť latencii, iba efektivite v závislosti od počtu producentov/konzumentov a veľkosti úložiska (skladu). Čas produkcie a čas spracovania výrobku konzumentov budú mať rovnaké parametre. Rôznu rýchlosť činnosti môžeme modelovať rôznym počtom producentov či konzumentov. Napríklad dvojnásobnú rýchlosť konzumentov vieme modelovať ich dvojnásobným počtom voči počtu producentov.

Nech Np označuje počet producentov, Nc počet konzumentov. Nech Tp označuje čas výroby jedného kusu výrobku a Tc čas spracovania jedného výrobku. Potom Np/Tp je počet výrobkov vyprodukovaných za jednotku času a Nc/Tc je počet výrobkov spracovaných za jednotku času. Celková maximálna teoretická produkcia (efektivita) systému za jednotku času je potom daná ako minimum z týchto dvoch hodnôt: min(Np / Tp, Nc / Tc).

Ak platí, že Np / Tp = Nc / Tc, hovoríme, že systém je vyvážený. V opačnom prípade je systém nevyvážený.

Veľkosť úložiska neovplyvňuje dlhodobý priemer produkcie v ustálenom stave. Úlohou úložiska je eliminovať výkyvy v systéme, ak sú časy Tp a Tc stochastické (náhodné). V prípade, že časy Tp a Tc sú konštantné, úložisko nemá žiaden vplyv na produkciu systému.

V tejto časti cvičenia použite nižšie pripravený programový kód pre simuláciu synchronizačného problému PK.

Časť A

Doplňte programový kód metód producer() a consumer(). Spustite program a analyzujte výstupné grafy.

Časť B

V experimente 2 zmeňte stochastické správanie modelu na konštantné. Spustite program a porovnajte výstupný graf tohto experimentu s grafom stochastického experimentu. Pre lepšiu predstavu môžete meniť počty producentov/konzumentov, systém však ponechajte vyvážený. Aká je optimálna veľkosť úložiska pre vyvážený systém PK s daným počtom producentov/konzumentov? Vyvoďte poučenie.