Semafor (programmeerimine)

Semafor on informaatikas andmestruktuur, mis võimaldab piirata määratud koodi sektsiooni väärtustamist nii, et seda saab korraga teha kuni n lõime. Semafore kasutatakse programmi protsesside sünkroonimises, kus ülesanne vajab kindlat ülemist piirarvu kindlatele protsessidele, mis võivad kõrvuti joosta.

Tegemist on klassikalise meetodiga jagatud ressursside juurdepääsu piiramisel, nagu seda on jagatud mälu multiprogrammeeritavas keskkonnas (süsteem, kus mitmed programmid võivad olla käivitatud samaaegselt või olla kordamisi käivitusjärjekorras käivitatud samaaegselt). Semafore eksisteerib mitmes variandis, kuigi tavaliselt mõeldakse selle all semaforide loetelu, kuna binaar (n=1) semafore tuntakse paremini ingliskeelse lühendiga mutex (Mutual exclusion) ehk mõlemapoole välistus (st lõim lukustab objekti/väärtuse, väärtustab selle ja avab luku. Kuni lukk on peal, teised lõimed objekti väärtustada ei saa.).

Semaforid on klassikaline lahendusviis hoidmaks ära lõimede võistlusmomenti ressursi pärast probleemis, nagu seda on Einestavad filosoofid, kuigi nad ei hoia ära kõigi lõimede lukustumist.

Dijkstra lahendus muuda

Semaforid kui protsesside sünkroonimise mehhanism on kavandatud Edsger Dijkstra poolt ja esmakordselt tutvustatud 1965. aastal tema artiklis Cooperating sequential processes (Koostöötavad järjestikulised protsessid).

Semafor on andmestruktuur, kus on üks algväärtustamise(initsialiseerimise) operatsioon ja kaks kasutusoperatsiooni. Andmestruktuur koosneb loendurist ja järjekorra rivist, kuhu kantakse blokeeritud protsessid.

/* andmestruktuur */
 struct Semafor {
    int loendur;
    Queue rivi;             /* järjekord */
 }
/* algväärtustamine */
void init (Semafor s, int v) {
   s.loendur = v;
   s.rivi.empty ();
}
/* kaks kasutus operatsiooni */
void P (Semafor s) {
  s.loendur = s.loendur - 1;
  if (s.loendur < 0)
     rivi_blokeeritud(s.rivi);    /* Blokeerin protsessi, lisan oote järjekorra rivvi */
}

void V (Semafor s) {
  s.loendur = s.loendur + 1;
  if (s.loendur <= 0)
     rivu_blokeeritud_vabasta_yks(s.rivi);  /* Vabastan protsessi oote järjekorra rivist */
}

Semaforid on tihti juba programmeerimiskeeles olemas, nt javas:

//Semafori klass
import java.util.concurrent.Semaphore; 

// tüüpiline deklaratsioon objektis
private Semaphore s;
private int SmaxSuurus;

// tüüpiline algväärtustamine objekti konstruktoris või mingis meetodis
this.SmaxSuurus=value;
this.s= new Semaphore(this.SmaxSuurus); 

//kontroll, kui kohti on vaba ehk vähem, kui this.SmaxSuurus oli elemendi loomise hetkel, siis jätkatakse 
if( s.tryAcquire()){

//kui lõim on lõpetanud oma töö, peab ta vabastama oma koha
s.release(1);

Vaata Ka muuda