Naprogramujte sadu skriptu pro jednoduche rizeni pristupu k nejakemu exkluzivnimu prostredku v ramci systemu. (Napr. GPU na graficke karte, ktere si muzeme preprogramovat, aby pocitalo neco uzitecnejsiho nez stiny na kosmicke lodi. Na GPU se ale vice nezavislych vypoctu najednou vtesna obtizne.) Chceme, aby v ramci systemu bezel v jednu chvili pouze jeden vypocet; pritom mame N uzivatelu, kteri chteji na systemu sem tam nezavisle na sobe spustet ruzne kratsi ulohy. Muzeme predpokladat, ze s nami budou pri spousteni vypoctu spolupracovat. Uzivatelske rozhrani bude poskytovat spolecny skript: /tmp/semafor.sh Tento skript si v systemu spusti uzivatel ve chvili, kdy si chce neco spocitat. Skript ceka, az dobehnou stavajici vypocty, pak oznami uzivateli, ze muze zahajit vypocet - prisel jeho "slot". Ve chvili, kdy vyprsi cas na jeden slot, oznami uzivateli, ze je nutne vypocet ukoncit, a poskytne mu nekolik sekund na ukonceni - "grace time". Pak skript skonci, v pripade, ze chce uzivatel spustit dalsi vypocet, zaradi se do fronty opetovnym spustenim skriptu. Mohou tedy nastat tri pripady - fronta je prazdna, nedeje se nic; semafor spustil jediny uzivatel, je mu obratem povolen start vypoctu; semafor spousti prubezne vice uzivatelu, pak jsou jim prirazovany sloty priblizne v poradi spousteni, musi byt zajisteno, aby nikdy nedostaly dva semafory najednou jeden slot, kazdy drive ci pozdeji dostal svuj slot a mezi sloty byla pauza pro ukonceni vypoctu. Nezapomente korektne osetrit pripad preruseni semaforu pomoci Ctrl-C (jak ve fronte, tak behem slotu). Take se pokuste nejak vyresit pripad, kdy je poskozena fronta semaforu (napr. nebyly semafory korektne ukonceny, nekdo vypnul proud). Muzete si zvolit bud "emergentni" reseni, ve kterem se semaforove skripty koordinuji samy mezi sebou (lepsi), nebo reseni, ve kterem je jejich fronta spravovana centralnim koordinacnim skriptem (konceptualne snazsi). V takovem pripade musi tento skript (ktery pobezi neustale a bude spusteny prave jednou) mit rozhrani: semafor-manager.sh [-s SLOTTIME] [-g GRACETIME] [-p POLLTIME] Vsechny intervaly jsou v sekundach. Polltime vyuzijte, pouzivate-li ve skriptech aktivni cekani (periodicky kontrolujete obsah nejakeho adresare ci souboru). Nevyuzijete-li manazersky skript, mely by byt intervaly konfigurovatelne treba v ramci nejakeho konfiguracniho souboru. Poznamky: (i) Vyhnete se zbytecnym prodlevam delsim nez nekolik sekund. (ii) Jeden uzivatel muze spustit vice semaforu, kdyz chce pocitat vice ulozek. (iii) Skript nespousti/neukoncuje vypocet samotny, pouze instruuje uzivatele. Na letisti by byl skript ridici vez, nikoliv pilot, ktery startuje motory. (iv) Chcete-li uzivatele upozornit intenzivneji nez jen hlasenim, zkuste echo -e '\a'. Nemusi fungovat na vsech druzich terminalu. (v) Pro komunikaci mezi semafory muze byt uzitecne pouzit spolecny adresar, ve kterem si kazdy semafor vytvori unikatni soubor, diky tomu semafory mohou videt, ktere dalsi chteji pocitat, prip. si uvnitr svych souboru predavat zpravy. (vi) Muze (a nebo nemusi) byt uzitecne misto obycejnych souboru vytvaret pojmenovane pipes; viz man mkfifo. (vii) Nejjednodussi konfiguracni soubory jsou obycejne shellove skripty, ktere si pak nasourcujete.