Sémaphore -- Qu'est ce que c'est???

Résolu/Fermé
Spaki Messages postés 45 Statut Membre -  
 abdi-samad -
Bonjour,

Je n'arrive pas à comprendre c'est quoi une sémaphore??A quoi sa sert?? Qu'est ce que
signifie les champs P() et V()? Comment s'en servir????

J'ai bientot un examen sur ça , mais je ne comprends rien. Meme les exos basiques, j'arrive pas à les comprendre . Quelqu'un pourrait-il m'aider à répondre à ces questions???
J'ai fait des recherches sur le net , mais ça ne m'aide pas trop.

De plus, est ce que vous pouvez m'expliquer ce exercice:
il y a une imprimante sur le réseau. Elle est accessible directement. Le papier est à déroulement continue , on peut imprimer une ligne geâce à la procédure ImprimeLigne() et passer à la page suivante grâce à NouvellePage().
1 ) Ecrire un prog qui imprime un fichier donnée.


voici la réponse:
Init(Mutex,1);
P(Mutex);
Repeter :
ImprimeLigne();
NouvellePage();
V(Mutex);

C quoi Mutex ?? Pourquoi on place P(Mutex) avant d'imprimer et V(Mutex ) après l'impression?? A quoi ils servent??

Merci de m'éclaircir sur ce sujet , car ce exo est le plus simple, et je n'y arrive pas. J'ai des exos encore plus difficile.




A voir également:

4 réponses

tatou_38 Messages postés 1937 Date d'inscription   Statut Membre Dernière intervention   121
 
Un sémaphore (Mutex en anglais pour MUTual EXclusive) est un objet permettant de protéger l'accès à une ressource.

Par exemple ton imprimante. Si plusieurs utilisateurs ou processus envoient des données à l'imprimante en même temps, l'impression risque de ne pas être lisible !.

Pour éviter cela on met en place un sémaphore. Un processus teste le sémaphore avant d'imprimer : fonction P(mutex). Si le sémaphore est libre, alors P(mutex) lève le sémaphore et rend la main, si le sémaphore est levé, alors P(mutex) attend que le sémaphore soit libre, lève le sémaphore et rend la main.

Charge à toi de libérer le sémaphore avec V(mutex) après ton impression, sinon plus personne ne pourra imprimer, tu vas te faire appeler Arthur !

Compris ?
23
Spaki Messages postés 45 Statut Membre 2
 
Doncci g compris , le sémaphore permet à un processus à la fois d'accéder à la ressource .

Ainsi on initialise le sémaphore à 1 car on a 1 seul imprimante.
Ensuite le processus teste le sémaphore, s'il est à 1 , alors il est libre donc on peut imprimer. Sinon on attend que la sémaphore soit libre. Mais comment on sait que le sémaphore est libre???
Une fois le sémaphore utilisé , on doit le libérer. C sa???

Une autre question mais si on a 4 imprimante alors comment faire????
0
Ma7moo7 Messages postés 72 Statut Membre 10
 
Bonjour,

Je reprend ce qu'a dit tatou en reformulant :

P(Mutex) décrémente la valeur de la variable Mutex jusqu'à atteindre 0.

En d'autres termes, initialement,
Mutex = 1

Suite à P(Mutex), Mutex = Mutex - 1 et donc 0
si un autre processus vient et trouve la valeur de Mutex égale à Zéro, il se bloque et attend que Mutex > 0

L'opération V(Mutex) incémente Mutex, donc si Mutex = 0, après V(Mutex), Mutex = 1.
et donc le processus bloqué auparavant va pouvoir passer.
(et s'il y'a plusieurs processus qui viennent et se bloquent par P(Mutex), ils se placent en file d'attente)

Donc avant tout opération d'accès exclusif, on place P(Mutex), ainsi si la ressource est libre (ressource est libre équivaut à Mutex > 0), le processus va pouvoir la réserver pour lui grace à P(Mutex).
Une fois qu'il a terminé son travail, il dit que la ressource à libre en incrémentant Mutex avec V(Mutex).

Voila.
C'est clair ?
17
Spaki Messages postés 45 Statut Membre 2
 
Merci beaucoup, jvien de comprendre mtn !!!
Jvé esayé de faire les exos à présent .
0
soso
 
mRc bcp
0
survivor
 
merci à tous
0
Hello
 
Merci !
0
saad
 
Merci beaucoupp
0
tatou_38 Messages postés 1937 Date d'inscription   Statut Membre Dernière intervention   121
 
Le sémaphore est unique et accessible à tous les processus voulant imprimer au travers des fonctions P(Mutex) et V(Mutex).

Initialement le Mutex est libre.

Pour le fonctionnement, relis ma première réponse qui était claire je pense.

En interne de P(Mutex) est de la forme :

P(Mutex) {
Si Mutex Libre alors
je marque le mutex
je sors
Sinon
J'attends que le mutex soit libre
je marque le mutex
je sors
fin
}

et V(Mutex)

V(Mutex) {
Je libère le mutex
}

Avec cela s tu n'as pas compris, je te conseille de changer d'orientation :=)

PS : Je ne suis pas 24H/24 sur mon micro pour te répondre !


tatou_38
Angers
8
Hicham
 
Merci pour les explications, vos explications m'ont beaucoup aider à comprendre!
0
Spaki Messages postés 45 Statut Membre 2
 
Quelqi'un pourrait maider???
3