Semafor (synchronizace)

Z Wikipedie, otevřené encyklopedie

Semafor je synchronizační primitivum obsahující celočíselný čítač, který si lze představit například jako počítadlo volných prostředků. Poskytuje atomické operace „up“ a „down“. Operace „down“ sníží čítač o jedničku, v případě, že už je nulový (nedostává se prostředků), se proces zablokuje a přidá do fronty procesů čekajících na daný semafor. Operace „up“ zkontroluje frontu, a v případě, že je neprázdná, vybere jeden proces čekající ve frontě a odblokuje jej (ten pak pokračuje za svou operací „down“); je-li fronta prázdná, zvýší hodnotu čítače o jedničku.

Příklad implementace v pseudokódu:

 P(Semaphore s)
 {
   očekávej s > 0 then s = s-1; /* musí být atomické jakmile je zjištěno, že s > 0 */
 }
 
 V(Semaphore s)
 {
   s = s+1;   /* musí být atomické */
 }
 
 Init(Semaphore s, Integer v)
 {
   s = v;
 }

Názvy operací P a V jsou tradiční a pochází od Edsgera Dijkstry, který semafory vymyslel. Jsou odvozeny od dánských slov „prolaag“ (složeno z probeer te verlagen, zkus a sniž) a „verhoog“, zvyš.