PDA

Voir la version complète : function semaphore


Page : [1] 2

minen
16/02/2007, 12h50
expliquez moi ça svp :redface:

initialisation d'un semaphore

function Init(semaphore sem, int val)
{
disable_interrupt;
sem.K:= val;
sem.L:= NULL;
enable_interrupt;
}

wait(semaphore)

function P(semaphore sem)
{
disable_interrupt;
sem.K = sem.K-1;
if (sem.K < 0)
{
L.suivant = processus_courant;
processus_courant.state= bloque;
reordonnancement = vrai;
}
enable_interrupt;
}

et le dernier

signal(semaphore)

function V(semaphore sem)
{
disable_interrupt;
sem.K=sem.K+1;
if (sem.K <= 0)
{
processus_reveille= L.tete;
processus_reveille.state = prêt;
reordonnancement = vrai;
}
enable_interrupt;
}

minen
16/02/2007, 12h59
alors?? :redface:

minen
16/02/2007, 13h49
mais pourquoi personne ne me repond??? en plus c quoi la difference entre mutex et enable(disable)_interrupt

samira12
16/02/2007, 16h07
Salut Minen,

mais pourquoi personne ne me repond???

Tu pense pas que c'est peu être normal vu que tu n'est pas dans un forum informatique.
Y'a des personnes qui savent meme pas de quoi tu parles.
Sur wikipedia y'a quelques explications.-->
http://fr.wikipedia.org/wiki/S%C3%A9maphore_(informatique)#Op.C3.A9ration_Init. 28sem.2C_val.29

Moi j'ai pas encore utilisé les Sémaphores donc je peux pas t'aider dsl !

Quasard
16/02/2007, 17h29
Désolé minen je ne la connais pas :x
Mais voila un site l'expliquant en détail il est en anglais par contre:
http://snap.nlc.dcccd.edu/learn/fuller3/chap12/chap12.html

minen
16/02/2007, 18h57
merci pour vos reponses

samira12
17/02/2007, 00h12
Alors finalement t'as trouvé ?
Ca à l'air interessent ca sert à quoi ?

L!nK0r
17/02/2007, 00h19
Bonjour!
et bien je penes que je peux aider vu que je suis informaticien, et oui les semaphores je connais!
alors ton semaphore sem a deux proprieté:
***K qui est le nombre de processus max pouvant s'executer en meme temps avant de se bloquer (ex: seul 2voitures peuvent traverser en meme temps)
a K+1 processu le k+1 est bloqué!
***L est la liste des processus

au debut initialise tu a sem.K reçoit une valeur(selon le probléme), lecteur redacteur si les lecteurs peuvent lire en meme temps c'est N par exemple si il ya une lecture a la fois c'est 1.
et sem.L est vide... au debut c'est normal.

pour les instructions :disable_interrupt; et enable_interrupt; et bien ca permet de délimiter ce qu'on appel une section critique je crois bien, ca bloque toute interruption systeme avant la fin!

la fonction P est appelé quand un processus veux passer, il "demande autorisation" alors dabbord on bloc les interruptions ensuite K=K-1, vu qu'un pss viens d'entrer.
si K<0 alors le nombre autorisé est atteint donc on empile le processus et on met son etat a bloqué (en attente) le réordonnancement je pense qu'il met le dernier bloqué en bas ca forme une file (first in first out).
on ferme la section critique.


la fonction V est appelé quand un pss va finir: on incremente K pour autoriser un autre a entrer, si K<=0 ca veux dire qu'il ya un pss bloqué alors on le libére, pss courant =L.tete (le premier a être entré en mode bloqué)
son etat (state) deviens prêt, et le reordonnancement je crois que tu l'utilise dans une autre fonction mais pas sure... si ta la suite tu peux la mettre!!
apres on reactive les interruption....


je sais pas si c'est clair ou pas tu eux poser tes kestions je vais essayer d'être plus explicite ;)

samira12
17/02/2007, 00h34
Petite question :mrgreen:

Mais les semaphores on les utilises quand et pourquoi ?

***K qui est le nombre de processus max pouvant s'executer en meme temps avant de se bloquer (ex: seul 2voitures peuvent traverser en meme temps)
a K+1 processu le k+1 est bloqué!
***L est la liste des processus

Si c'est juste pour faire ca on peut faire un algo nous meme.Pas besoin d'utiliser les semaphores.

Merci d'avance. :razz:

L!nK0r
17/02/2007, 00h49
samira j'etais en mode edit!
tu dis qu'elle est l'utilité des semaphore ???
la protection des ressources, eviter l'inter bloquage la famine et pleins d'autres problémes!
tu dit un simple algo haaaaaaaa! lamport et ses confréres ont bien refléchis la dessu et les semaphores et moniteurs sont la seule solution, dans la literature tu trouvera pleins d'astuces mais faudrait que je sorte mes cahiers pour être plus précis!

minen
17/02/2007, 08h05
je crois que c'est tres clair maintenant ;) je te remercie du fond du coeur

pour les question j'en ai tjr :mrgreen:

pourquoi le wait et signal sont executé avec disable(enable)_interrupt (section critique) est-ce pour assurer une exclusion mutuelle entre l'incrementation et la decrementation du semaphore? :redface:

L!nK0r
17/02/2007, 08h32
Bonjour, je t'en prie ^^

et bien le wait et le signal sont executé avec enable et diable pour proteger toute variable en commun, le K oui comme tu dis mais aussi la Liste, L.tete ou bien L.liste.

je pense que vous devez utiliser parbegin et parend (parallel begin; end) pour "simuler" une execution en simultané des pss, donc tout peux arriver au meme instant, c'est pourquoi le enable, disable sont mis autour des variables du semaphore :)

euh pour repondre clairement a ta question je dirais OUI. "c'est ce que je pense"
pour assurer l'exclusion mutuelle mais pas seulement entre inrementation et decrementation, entre decrementation ou décremetation aussi ou incr et inr..., il faut voir l'exclusion entre deux ou plusieurs pss, utilisant ces fonctions, non pas entre les fonctions

A+

minen
17/02/2007, 08h37
merci

est ce que je peux poser une autre question? :redface:

L!nK0r
17/02/2007, 08h38
:D j'etais en mode edit comme dab lol,
oui bien sure va y mais n'oublie pas de lire ma réponse modifiée ;)

minen
17/02/2007, 08h53
pour le probleme du producteur consommateur

producteur consommateur

repeat repeat
..... .....
wait(empty) wait(full)
wait(mutex) wait(mutex)
créer un element nextC:=buffer[out]
signal(mutex) signal(mutex)
signal(full) signal(empty)
..... consommer l'element nextC
Until false Until false

mutex: semaphore d'EM init a 1
empty: semaphore de comptage initialisé a N
full: semaphore de blocage initialisé a 0

je ne comprends pas l'utilité du semaphore empty puisque le buffer est utilisé en exclusuion mutuelle?

L!nK0r
17/02/2007, 09h05
mutex: semaphore d'EM init a 1
empty: semaphore de comptage initialisé a N
full: semaphore de blocage initialisé a 0

je pense que tu n'a pas de probléme avec mutex.

bien dans ce probléme, les consommateurs ne peuvent commencer a consommer que si il y a quelque chose dans le buffer, dans ce cas les producteur sont prioritaires, alors tu remarquera un wait(full) avant uun signal(full).
tu trouvera la meme "astuce" dans le sema rendez vous, ou la bariere ne peux se lever que si on a N pss, qui font signal...je sais pas si j'ai eté assé clair !!

Empty c'est le contraire! quand le buffer est plein empty passe a 0, et chaque fois qu'un consomateur lit du buffer il vide une case et donc redonne l'acces a un producteur, le but n'est pas de proteger les variables, car mutex s'en charge mais de s'assurer que pour ecrire il faut y a voir un vide :)

minen
17/02/2007, 09h16
j'ai tout compris :10:

merci

donc c'est le producteur qui commence!!

L!nK0r
17/02/2007, 09h22
oui c'est le producteur qui commence (a travailler) car meme si c'est le consommateur qui essai de consommer il sera bloqué par le wait(full) :D
content d'avoi pu t'aider, je dois y aller!

a ce soir ;) pour d'autres questions

minen
17/02/2007, 09h29
merci je crois que j'en ai fini avec ces semaphore ;)

samira12
17/02/2007, 19h03
Salut tout le monde, ;)

C'est super genial si t'as compris Minen !

Parcontre j'ai pas encore vu les semaphores mais je crois d'apres ce que j'ai lu que ca ressemble beaucoup aux Threads avec les producteurs, consommateurs, wait,......

On le voit quand ca les semaphores ? Ca date ou on l'utilise toujours aujourd’hui? Tu l'utilise dans quels langage ?

Merci pour vos reponses :D