semaforji nazaj naprej dijkstra je uvedel koncept semaforjev in takoimenovanih operacij p in v oznake teh operacij izhajajo iz holandskih besedic vhod in izhod semafor je scitena spremenljivka pravzaprav podatkovna struktura ki jo lahko inicializiramo ter dosezemo le z operacijami p in v binarni semaforji lahko zavzamejo le vrednosti in stevni semaforji pa poljubne nenegativne vrednosti operacijo p na semaforju s zapisemo kot p s in deluje tako if s then s s else pocakaj na s v ustrezni vrsti operacijo v na semaforju s pa zapisemo kot v s in deluje tako if eden ali vec procesov caka v vrsti na s then naj vstopi en proces else s s procesi naj cakajo na zakljucek p s v cakalni vrsti tipa fifo first in first out zato je vsak semafor podatkovna struktura ki vsebuje en integer in eno vrsto v literaturi oznacujejo operaciji p s in v s tudi z imeni wait semaphore in signal semaphore ki imata v bistvu enak pomen podobno kot test and set morata biti tudi operaciji p in v nedeljivi same konkretne implementacije semaforjev so lahko razlicne ce imamo na voljo instrukcije tipa test and set jih uporabimo sicer pa ne dovolimo prekinitev disable interrupts med samim izvajanjem operacij wait in signal zgled varovanja kriticne sekcije s semaforji program example var active semaphore procedure process a begin repeat wait active kriticna sekcija signal active until false end procedure process b begin repeat wait active kriticna sekcija signal active until false end begin initsemaphore active parbegin process a process b parend end sinhronizacija procesov s semaforji naslednji zgled uporabe semaforjev je sinhronizacija procesov vzemimo za primer vhodno izhodne racunalniske operacije proces ki sprozi vhodno izhodno operacijo se obicajno sam blokira da bi tako pocakal na njen zakljucek blokirani proces kasneje obudi nek dogodek v nekem drugem procesu pri taki interakciji imamo torej protokol blokiranje bujenje ta je uporaben kadarkoli zelimo nek proces sinhronizirati z danim dogodkom v drugem procesu zgled je podoben prejsnjemu program sinhronizacija var dogodek semaphore procedure process a begin predhodne operacije wait dogodek proces a caka na dogodek v procesu b nadaljevanje procesa end procedure process b begin predhodne operacije signal dogodek nadaljevanje procesa end begin initsemaphore dogodek parbegin process a process b parend end semaforji in problem proizvajalec porabnik oglejmo si se uporabnost semaforjev za resevanje problema proizvajalec porabnik proces a tvori podatke ki jih proces b uporablja hitrost izvajanja posameznih procesov a in b se v splosnem ne ujema zagotoviti moramo da ne prihaja niti do izgube podatkov niti do veckratnega branja in izpisa istega podatka oba procesa moramo torej sinhronizirati kot to kaze naslednji zgled program proizvajalec porabnik var zasedeno semaphore vpisano semaphore buffer integer procedure proizvajalec var rezultat integer begin repeat racunaj rezultat wait zasedeno vstop v kriticno sekcijo buffer rezultat signal vpisano sinhronizacija until false end procedure porabnik var podatek integer begin repeat wait vpisano blokiran proces ce podatka se ni wait zasedeno vstop v kriticno sekcijo podatek buffer signal zasedeno sprostitev kriticne sekcije izpis podatek until false end begin initsemaphore zasedeno initsemaphore vpisano parbegin proizvajalec porabnik parend end stevni semaforji stevne semaforje s pridom uporabimo ce zelimo alokacijo enega sredstva resource iz zaloge enakih sredstev semafor inicializiramo na stevilo sredstev v zalogi vsaka operacija p oziroma wait zmanjsa semafor za in tako pokaze da se je zaloga zmanjsala vsaka operacija v oziroma signal poveca semafor za in tako nakaze povecanje zaloge za ce uporabimo operacijo wait potem ko je semafor dosegel mora tak proces pocakati da se vsaj eno sredstvo sprosti z ustrezno operacijo signal semaforji so zelo primitivni in z njimi tezko izrazimo zelo kompleksne konkurencne probleme tako si tezko zapomnimo kateri sciteni strukturi smo priredili dani semafor mimogrede pozabimo uporabiti kaksno instrukcijo wait in prezgodaj vstopimo v kriticno sekcijo procesi lahko tudi ostanejo neomejeno blokirani ker morda zaman cakajo na odresilno operacijo signal ki bi jo moral uporabiti nek drug proces