Les sémaphores1 Sémaphores binaire mis en oeuvre par opérations d'échanges
Soit l'opération d'échange cx(a,b) = si a=b alors reg:=1 sinon { reg:= 0 ; echange a et b } (reg est une variable locale) Cette opération est atomique. Pour le sémaphore binaire, on n'exploite pas la notion de file d'attente, on fait une attente active. L'on souhaite juste créer deux primitives de synchronisation qui soient atomiques.
Init(Valeur) = s = valeur V(S) = s = 1 P(S) = { reg = 1 ; b = 0 ; tant que reg = 1 faire cx(S,b) }
En effet, P(0) attend que s passe à 1 et remet s à 0, P(1) met s à 0. reg = 0 signifie que l'on a permuté les deux variables.
2 Sémaphores binaire mis en oeuvre pour les fichiers (sous UNIX)
P(S) = while (creat(S,0) <0) {} V(S) = unlink S
3 Mise en oeuvre d'un sémaphore classique
On construit dons maintenant le sémaphore classique à l'aide des sémaphores binaires précédents.
Init(valeur) = { S = valeur ; bmutex =Init(1) ; battente = Init(0) } P(S) = { Pbin(bmutex) ; S-- ; si S<0 alors Vbin (bmutex) ; Pbin(battente) sinon Vbin(bmutex) } V(S) = { Pbin(bmutex) ; S++ ; si S <= 0 alors Vbin(battente) ; Vbin(bmutex) }
4 Activation périodique d'un processus
Le principe est de construire un processus horloge qui effectue un V régulier. On peut alors utiliser le P dans d'autre processus. top init 0, asy init 0, intervalle init 100.
H : repeat V(top) ; |
O : i = 0 P(top) ; i++ si i = intervalle alors V(asy) ; i=0 ; |
P(i) i:1..N repeat P(asy[i]) ... until "condition d'arret de la boucle" | |