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;
}
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 !
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
samira12
17/02/2007, 00h12
Alors finalement t'as trouvé ?
Ca à l'air interessent ca sert à quoi ?
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:
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!
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:
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+
merci
est ce que je peux poser une autre question? :redface:
: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 ;)
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?
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 :)
j'ai tout compris :10:
merci
donc c'est le producteur qui commence!!
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
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
vBulletin® v.3.6.5, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Tous droits réservés - Version française vbulletin-fr.org