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
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ú [[
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ú
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==
|