Semafor (programovanie): Rozdiel medzi revíziami

Smazaný obsah Přidaný obsah
Bez shrnutí editace
Riadok 11:
==Úvod==
 
K semaforu môže byť pristupované len pomocou nasledovných operácii. Tie, ktoré sú označené ako atomické, nemôžu byť prerušené (t.j. ak sa systém rozhodne, že je čas "zmeniť" proces, nemôže ho zmeniť uprostred týchto inštrukcií). Dôvod je popísaný nižšie.
 
 
Riadok 31:
}
 
Všimnime si, že zvyšovanie premennej ''s'' nesmie byť prerušené a procedúra ''P'' nesmie byť prerušená, ak ''s'' je väčšie od 0. Toto sa dá dosiahnuť pomocou špeciálnej inštrukcie [[test-and-set]] (ak to v danej architektúre [[inštrukčná sada]] podporuje) alebo (ak to je [[jednoprocesorový systém]]) sa dá zakázať [[prerušenie]] na zabránenie prepnutia procesu.
 
 
 
Hodnota semafora je počet jednotiek, ktoré sú v našom zdroji voľné. (Ak je tam iba jedna jednotka, "[[Binárna sústava|binárny]] semafor" s hodnotami 0 alebo 1 je použitápoužitý.) Procedúra ''P'' používa [[činné čakanie]] (vo svojom čase nerobí nič) alebo spí (povie systému, nech ju neplánuje), kým zdroj nie je dostupný, keď pri zobudení ho hneď získa pre seba. ''V'' je opak; jednoducho urobí zdroj dostupný znova po skončení jeho používania procesom. ''Init'' je použitý len na inicializovanie semaforu pred tým, ako sa použije. Procedúry ''P'' a ''V'' musia byť [[atomické (programovanie)|atomické]], čo znamená, že nesmie byť prepnuté na iný proces uprostred týchto procedúr na beh iného procesu, ktorý používa ten istý semafor.
 
 
Riadok 43:
 
 
V [[programovací jazyk|programovacom jazyku]] [[ALGOL 68]], v [[Linux jadro|Linuxovom jadre]],<ref>[http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html#ss5.3 Kernel hacking howto na linuxgrill.com]</ref> a v niektorých anglických knihách, procedúry''P'' a ''V'' sú nazývané ''down'' a ''up''. V niektorých príručkách zasa ''wait'' a ''signal'', ''acquire'' a ''release'' alebo ''pend'' a ''post''. Niektoré texty ich nazývajú ''procure'' a ''vacate'', aby sedeli s originálnymi dánskymi iniciálkami.
 
 
 
Aby sme sa vyhli činnému čakaniu, semafor môže mať priradenú [[radefrontafronta (dátová štruktúra)|frontafrontu]] procesov (obyčajne [[FIFO|first-in, first-out]]). Ak proces vykoná procedúru ''P'' na semafore, ktorý má hodnotu 0, proces je pridaný do tejto fronty. Ak iný proces zvýši semafor vykonaním procedúry ''V'' a aspoň jeden proces je vo fronte semaforu, jeden z nich je vybratý a pokračuje vo svojom behu.
 
 
Riadok 71:
 
 
Predpokladajme, že by si chceli dva procesy alokovať zásobníky. Jeden by chcel K zásobníkov a druhý L, kde K + L > N. Primitívna implementácia by volala K, resp. L, krát procedúru P na semafore v cykle. Avšak toto môže viesť k deadlocku: ak prvý proces dostane Z < K zásobníkov tak, že Z + L > N a operačný systém prepne na druhý proces, ktorý si začne tiež alokovať zásobníky, ten ich potom dostane N - Z (čo je menej ako L), semafor bude mať už 0 a teda druhý proces začne čakať. Prvý proces sa obnoví a pokúsi sa alokovať ďalší zásobník, ale semafor je stále 0 a teda aj on začne čakať. Žiaden s procesov teda nebude mať dostatok zásobníkov na pokračovanie činnosti a teda sa ani žiadne zásobníky uvoľnia. Teda sú zaseknutýzaseknuté v deadloku.
 
 
Riadok 79:
 
 
Za povšimnutie stojí, že nie je nutné mať číslo na semafore rovné hodnote počtu voľných zásobníkov. Testovanie a čakanie na podmienke s >= 0 v P je nutné na zabezpečenie toho, aby pri pridávaní sa do čakacej fronty procesy nerušili ostatným požiadavky: proces nezmení hodnotu na semafore, pokiaľ nie je prvý vo fronte. V reálnej implementácii je to robené bez zobudenia procesu iba na zmenšenie hodnoty.
 
==Semafory v dnešnej dobe používané programátormi==