Sie sind auf Seite 1von 13

Sommaire

Rappels de cours Les smaphores POSIX Les smaphores System V Squence 1 : Exemple Squence 2 : Rende !Vous
Synchron"sat"on de processus Rende !#ous $ %

Squence & : Producteur'(onsommateur


S"tuat"on 1 S"tuat"on 2

Squence ) : Lecteur!Rdacteur
S"tuat"on 1 S"tuat"on 2

*onus : Le pro+l,me du co"--eur endorm"

Copyright 2011 tv <tvaira@free.fr> Permission is granted to copy, distribute and/or modify this document under the terms of the !" #ree $ocumentation %icense, &ersion 1.1 or any 'ater version pub'ished by the #ree (oft)are #oundation* )ith no +nvariant (ections, )ith no #ront,Cover -e.ts, and )ith no /ac0,Cover. 1ou can obtain a copy of the !" enera' Pub'ic %icense 2 )rite to the #ree (oft)are #oundation, +nc., 34 -emp'e P'ace, (uite 550, /oston, 67 02111,1508 "(7

tp-sys-semaphores.odt 30/12/2011 rev.121 thierry.vaira@orange.fr

Rappels de cours
.n smaphore est un mcan"sme emp/chant deux processus ou plus d0accder s"multanment $ une ressource parta1e2 Sur les voies ferres, un smaphore empche deux trains d'entrer en collision sur un tronon de voie commune. Sur les voies ferres comme dans les ordinateurs, les smaphores ne sont qu'indicatifs : si un machiniste ne voit pas le signal ou ne s'y conforme pas, le smaphore ne pourra viter la collision. 3e m/me s" un processus ne teste pas un smaphore a#ant d0accder $ une ressource parta1e4 le chaos peut en rsulter2 .n smaphore +"na"re n0a que deux tats : 5 #errou"ll 6ou occup74 1 d#errou"ll 6ou l"+re72

.n smaphore 1nral peut a#o"r un tr,s 1rand nom+re d0tats car "l s0a1"t d0un compteur dont la #aleur "n"t"ale peut /tre ass"m"le au nom+re de ressources d"spon"+les2 Par exemple4 s" le smaphore compte le nom+re d0emplacements l"+res dans un tampon et qu0"l y en a"t "n"t"alement 8 on do"t crer un smaphore 1nral dont la #aleur "n"t"ale sera 82 (e compteur : 3cro9t d0une un"t quand "l est acqu"s 6:#errou"ll;72 (ro9t d0une un"t quand "l est l"+r 6:d#errou"ll;72

<uand "l #aut ro4 un processus tentant de l0acqur"r do"t attendre qu0un autre processus a"t au1ment sa #aleur car le smaphore ne peut jamais devenir ngatif2 L0acc,s $ un smaphore se -a"t 1nralement par deux oprat"ons : P : pour l0acqu"s"t"on 6Pro eren4 tester7 ou P6u"s!=e7 accder $ une ressource > V : pour la l"+rat"on 6!erhogen4 "ncrmenter7 ou V6as!y7 la ressource est d"spon"+le

La not"on de smaphore est "mplmente dans la plupart des syst,mes d0explo"tat"on2 Il s0a1"t d0un concept -ondamental car "l permet une solut"on a la plupart des pro+l,mes d0exclus"on2 (e mcan"sme -ourn" par le noyau ncess"te la m"se en oeu#re d0une #ar"a+le 6le smaphore7 et de deux oprat"ons atom"ques assoc"es P et V2

Programmation Systme Les Smaphores POSIX

Les Smaphores POSIX


Les smaphores POSIX sont d"spon"+les dans la l"+ra"r"e standard ( 6?%.72 .t"l"se sur la 1rande ma=or"t des syst,mes L"nux4 la glibc o--re donc une "mplmentat"on des smaphores2 Le smaphore sera de type sem_t2 La l"ste des appels d"spon"+les pour 1rer un smaphore sem@t est la su"#ante : sem@"n"t sem_wait4 sem@tryAa"t4 sem@t"medAa"t sem@post sem@1et#alue4 sem@open sem@close sem@unl"nB sem@destroy

.ne prsentat"on des smaphores POSIX est access"+le en -a"sant :


$ man

sem_overview

Pour la comp"lat"on4 "l su--"t d0"nclure le -"ch"er header semaphore.h :


#include <semaphore.h>

C l0d"t"on de l"ens4 "l ne -audra pas ou+l"er d0ut"l"ser lrt ou lpthread2


$ gcc

exemple.c -lpthread -o exemple

!"opration Init#$
sem_init#$ "n"t"al"se le smaphore non nomm s"tu $ l0adresse po"nte par sem2 L0ar1ument value spc"-"e la #aleur "n"t"ale du smaphore2 Le prototype :
int sem_init(sem_t *sem, int pshared, unsigned int value);

L0ar1ument pshared "nd"que s" ce smaphore sera parta1 entre les threads d0un processus ou entre processus2 S" pshared #aut 54 le smaphore est parta1 entre les threads d0un processus et de#ra"t /tre s"tu $ une adresse #"s"+le par tous les threads 6par exemple4 une #ar"a+le 1lo+ale ou une #ar"a+le alloue dynam"quement dans le tas72

Les smaphores

tp-sys-semaphores.odt 30/12/2011 rev.121 thierry.vaira@orange.fr

// Utilisation d'Init() avec des threads sem_t s; // variable globale void Init(sem_t *s, unsigned int value) { sem_init(&s, 0, value); }

S" pshared n0est pas nul4 le smaphore est parta1 entre processus et de#ra"t /tre s"tu dans une r1"on de mmo"re parta1e2

!"opration P#$
sem_wait#$ dcrmente 6#errou"lle7 le smaphore po"nt par sem2 S" la #aleur du smaphore est plus 1rande que 54 la dcrmentat"on s0e--ectue et la -onct"on re#"ent "mmd"atement2 S" le smaphore #aut ro4 l0appel +loquera =usqu0$ ce que so"t "l de#"enne d"spon"+le pour e--ectuer la dcrmentat"on 6c0est!$!d"re la #aleur du smaphore n0est plus nulle74 so"t un 1est"onna"re de s"1naux "nterrompe l0appel2 sem@tryAa"t67 est pare"l que sem@Aa"t674 except que s" la dcrmentat"on ne peut pas /tre e--ectue "mmd"atement4 l0appel ren#o"e une erreur 6errno #aut EC?CI%7 plutDt que +loquer2 sem@t"medAa"t67 est pare"l que sem@Aa"t674 except que l0on peut spc"-"er une l"m"te sur le temps pendant lequel l0appel +loquera s" la dcrmentat"on ne peut pas /tre e--ectue "mmd"atement2
void P(sem_t *s) { sem_wait(s); }

!"opration V#$
sem_post#$ "ncrmente 6d#errou"lle7 le smaphore po"nt par sem2 S"4 $ la su"te de cet "ncrment4 la #aleur du smaphore de#"ent supr"eure $ ro4 un autre processus ou thread +loqu dans un appel sem@Aa"t67 sera r#e"ll et procdera au #errou"lla1e du smaphore2
void V(sem_t *s) { sem_post(s); }

Programmation Systme

Les smaphores System V


Les smaphores S%stem V 6sem1et4 semop4 etc27 sont une anc"enne CPI de smaphores2 Les smaphores POSIX -ourn"ssent une "nter-ace +"en m"eux conEue que celles de System V2 30un autre cot4 les smaphores POSIX sont 6peut!/tre7 mo"ns lar1ement d"spon"+les 6part"cul",rement sur d0anc"ens syst,mes7 que ceux de System V2 (es smaphores -ont part"e des mcan"smes System V de commun"cat"on entre processus 6IP&7 qu" sont : les files de messages4 les ensem+les de smaphores et les se1ments de mmoire partage2 La commande ipcs -ourn"t des "n-ormat"ons sur les IP(2

Squence 1 : Exemple
(omp"ler et tester l0exemple intro.c qu" met en oeu#re deux taches et un smaphore d0exclus"on mutuelle pour accder $ une sect"on cr"t"que2 '$ ( partir de la trace d"e)cution* dessiner un diagramme temporel.

F part"r de cette exemple4 on #a d-"n"r la sect"on cr"t"que pour ces deux tGches : une "ncrmentera la #ar"a+le parta1e et l0autre la dcrmentera2

.hread '
P6S7 "ncrement #alue V6S7

.hread +
P6S7 decrement #alue V6S7

H1
smaphore S

Variable partage

H2

+$ ,crire le programme semaphores.'.c -ui illustre la s%nchronisation de donne en utilisant un smaphore.

Les smaphores

tp-sys-semaphores.odt 30/12/2011 rev.121 thierry.vaira@orange.fr

Squence 2 : Rendez-Vous
S%nchronisation de processus
On a deux tGches qu" ral"sent chacune leur tra#a"l 6-onct"on tra#a"l6772 On ds"re que la tGche 2 excute une -onct"on nettoyer67 lorsque la tGche 1 a term"n son tra#a"l2 /$ 0n utilisant un smaphore de s%nchronisation* crire la s-uence de pseudo code de .' et .+ permettant d"tablir cette s%nchronisation. 1$ &omplter #les parties notes .O2O$ et tester le source rende3 vous'.c 4$ 2onner la trace d"e)cution mettant en vidence la s%nchronisation entre les deu) t5ches.

Programmation Systme Squence 2 : Rendez- ous

6ende3 vous 7 8
.n processus do"t attendre que n autres processus ou tGches so"ent par#enus $ un endro"t prc"s pour poursu"#re son excut"on2 On ut"l"sera : un smaphore mutex "n"t"al"s $ 1 6pour l0acc,s $ n+7 un smaphore Sattend "n"t"al"s $ 5 6pour la synchron"sat"on7 un ent"er n+ "n"t"al"s $ 5 6pour compter les tGches7

Le pseudo!code de la +arr",re de synchron"sat"on sera le su"#ant :

Fonction rendezVous dbut P(mutex) nb := nb + 1 SI(nb < N) /* tous arrivs ? */ ALORS /* non */ V(mutex) P(Sattend) SINON /* oui */ POUR chaque tche en attente FAIRE V(Sattend) FIN POUR nb := 0 V(mutex) FIN SI
fin

9$ &oder la fonction rende3Vous #la partie note .O2O$ et tester le source rende3 vous+.c :$ 2onner la trace d"e)cution mettant en vidence la s%nchronisation entre les 8 t5ches.

Les smaphores

tp-sys-semaphores.odt 30/12/2011 rev.121 thierry.vaira@orange.fr

Squence & : Producteur'(onsommateur


.n producteur produ"t des "n-ormat"ons et les place dans un tampon 6une -"le de type IIIO72 .n consommateur #"de le tampon et consomme les "n-ormat"ons2 La tGche Producteur ral"se les act"ons su"#antes :

construireRequete(); deposerRequete(requete);
La tGche (onsommateur ral"se les act"ons su"#antes :

retirerRequete(); traiterRequete(requete);
La -"le est 1re comme un tampon c"rcula"re 6L reprsente "c" la capac"t de la -"le 72

La -"le est 1re $ l0a"de de 2 #ar"a+les parta1e "n et out : "n po"nte sur le prem"er emplacement l"+re out po"nte sur la procha"ne requ/te $ ret"rer

Pour ma"nten"r sans d+ordement4 un "nd"ce " sur un tampon c"rcula"re de ta"lle L4 on ut"l"se l0oprateur JO3.LO K2 Pour -a"re La#ancerL l0"nd"ce " dans le tampon c"rcula"re4 on procdera donc de la man",re su"#ante :

i = (i + 1) % L;

Programmation Systme Squence ! : Producteur"#onsommateur

Situation '
On se propose d0exam"ner la s"tuat"on de synchron"sat"on su"#ante : .ne seule tGche produ"t des requ/tes et une seule tGche les ret"re2 La -"le est +orne de ta"lle L2

Le Producteur ne peut dposer que s0"l ex"ste une place l"+re dans la -"le2 Le (onsommateur ne peut prle#er une requ/te que s" elle a t prala+lement dpose2 La -"le est une ressource pu"sa+le ma"s n0est pas une ressource cr"t"que car le Producteur et le (onsommateur n0en man"pulent pas la m/me part"e2 La synchron"sat"on du Producteur #"s $ #"s de la -"le est $ mettre en place2 La synchron"sat"on du (onsommateur #"s $ #"s du Producteur est $ mettre en place2 On ut"l"sera donc deux smaphores qu0"l #ous -audra "n"t"al"ser :

sem_t nbRequetes; sem_t nbCasesVides;


;$ &oder les t5ches producteur et consommateur #les parties notes .O2O$ et tester le source producteur'.c <$ =ournir une trace d"e)cution mettant en vidence la s%nchronisation entre les + t5ches.

Les smaphores

tp-sys-semaphores.odt 30/12/2011 rev.121 thierry.vaira@orange.fr

Situation +
On se propose ma"ntenant d0exam"ner la s"tuat"on de synchron"sat"on su"#ante : Plus"eurs tGches produ"sent des requ/tes2 Plus"eurs tGches les ret"rent2 La -"le est +orne de ta"lle L2

Le Producteur ne peut dposer que s0"l ex"ste une place l"+re dans la -"le2 Le (onsommateur ne peut prle#er une requ/te que s" elle a t prala+lement dpose2 La -"le est une ressource pu"sa+le ma"s elle est auss" une ressource cr"t"que pour les Producteurs qu" do"#ent dposer en exclus"on mutuelle2 La -"le est une ressource cr"t"que pour les (onsommateurs qu" do"#ent prle#er en exclus"on mutuelle2 La synchron"sat"on du Producteur #"s $ #"s de la -"le est $ mettre en place2 La synchron"sat"on du (onsommateur #"s $ #"s du Producteur est $ mettre en place2 On a=outera 2 mutex : un sur "n pour assurer le dpDt en exclus"on mutuelle un sur out pour assurer le prl,#ement en exclus"on mutuelle

On ut"l"sera donc quatre smaphores qu0"l #ous -audra "n"t"al"ser :

sem_t sem_t sem_t sem_t

nbRequetes; nbCasesVides; mutexP; mutexC;

'>$ &oder les t5ches producteur et consommateur #les parties notes .O2O$ et tester le source producteur+.c ''$ =ournir une trace d"e)cution mettant en vidence la s%nchronisation entre les 8 t5ches.

10

Programmation Systme Squence $ : Lecteur-Rdacteur

Squence ) : Lecteur!Rdacteur
% tGches rpart"es en 2 cat1or"es : les Lecteurs et les Rdacteurs4 se parta1ent une ressource commune : le I"ch"er2 Les lecteurs peu#ent l"re s"multanment le -"ch"er2 Les rdacteurs do"#ent a#o"r un acc,s exclus"- au -"ch"er : lorsqu0un Rdacteur cr"t4 aucune Lecture n" aucune Ecr"ture n0est poss"+le2 Les pro1rammes Rdacteur ral"sent les act"ons su"#antes :

ecrireFichier();
Les pro1rammes Lecteur ral"sent les act"ons su"#antes :

lireFichier();

Situation '
On se propose d0exam"ner la s"tuat"on de synchron"sat"on su"#ante dans le cadre du pro+l,me des lecteurs et des rdacteurs : Lorsque aucun rdacteur ne l"t le -"ch"er4 Lecteurs et Rdacteurs ont m/me pr"or"t2 Les Lecteurs ont pr"or"t sur les rdacteurs s" un Lecteur occupe d=$ le -"ch"er2 Le prem"er Lecteur do"t donc +loquer l0acc,s au -"ch"er pour les #entuels Rdacteurs et la"sser les autres Lecteurs accder au -"ch"er2 Le dern"er Lecteur qu" l"+,re le -"ch"er do"t permettre aux #entuels Rdacteurs d0accder au -"ch"er2 Les Lecteurs do"#ent donc se compter 6#ar"a+le n+Lecteurs7 et do"#ent accder $ cette #ar"a+le en exclus"on mutuelle2 On ut"l"sera donc deux smaphores qu0"l #ous -audra "n"t"al"ser :

sem_t mutexL; // pour grer l'accs la variable nbLecteurs


partage

sem_t w; // pour grer l'accs en criture


'+$ &oder les t5ches redacteur et lecteur #les parties notes .O2O$ et tester le source lecteur'.c '/$ =ournir une trace d"e)cution mettant en vidence la s%nchronisation entre les 8 t5ches.

11

Les smaphores

tp-sys-semaphores.odt 30/12/2011 rev.121 thierry.vaira@orange.fr

Situation +
On se propose ma"ntenant d0exam"ner la s"tuat"on de synchron"sat"on su"#ante : Les Lecteurs ont tou=ours pr"or"t sur les rdacteurs2 Le cas oM un lecteur attend est celu" oM un Rdacteur occupe le -"ch"er2 .n Rdacteur n0acc,de au -"ch"er que s" aucun lecture n0est en cours ou en attente2 Hant qu0un Lecteur acc,de au -"ch"er4 aucun Rdacteur ne peut y accder2 Le seul moment oM un Rdacteur peut o+ten"r la pr"or"t sur un Lecteur est le cas oM pendant qu0un Rdacteur acc,de au -"ch"er et a#ant qu0"l ne term"ne d0y accder4 un autre Rdacteur pu"s un Lecteur demandent l0acc,s2 Pour 1arant"r que4 dans cette s"tuat"on4 c0est un Lecteur qu" o+t"endra +"en la pr"or"t4 "l -aut pou#o"r +loquer les Rdacteurs sur un autre smaphore mutexR en amont de leur oprat"on P6A72 On a=outera donc un smaphore :

sem_t mutexR;
'1$ &oder les t5ches redacteur et lecteur #les parties notes .O2O$ et tester le source lecteur+.c '4$ =ournir une trace d"e)cution mettant en vidence la s%nchronisation entre les 8 t5ches.

12

Programmation Systme Squence $ : Lecteur-Rdacteur

*onus : Le pro+l,me du co"--eur endorm"


Il sNa1"t dNun de ces pro+l,mes de synchron"sat"on m"s sous une -orme :pla"sante;2 On en trou#e une appl"cat"on presque d"recte dans certa"ns mcan"smes des syst,mes dNexplo"tat"on 6comme lNordonnancement des acc,s d"sque72 (e pro+l,me class"que de synchron"sat"on est le su"#ant : un co"--eur d"spose dans son salon d0un -auteu"l de co"--ure et de % cha"ses pour les cl"ents en attente2 S0"l n0y a pas de cl"ents4 le co"--eur dort2 F l0arr"#e du prem"er cl"ent4 "l se r#e"lle et s0occupe de lu"2 S" un nou#eau cl"ent arr"#e pendant ce temps4 "l attend sur l0une des cha"ses d"spon"+les2 Ja"s s" toutes les cha"ses sont occupes4 le cl"ent s0en #a2 En-"n lorsque le co"--eur a -"n" de couper les che#eux du dern"er cl"ent4 "l peut se rendorm"r2 Ind"cat"ons : ut"l"ser un smaphore pour 1rer les cl"ents en attente4 et un autre "nd"quant s" le co"--eur est d"spon"+le2 a=outer une #ar"a+le "nd"quant le nom+re de cl"ents en attente2

'9$ =aut il un mute) sur la variable indi-uant le nombre de clients en attente ? ':$ 2essiner le probl@me.

';$ &omplter le programme coiffeur.c fourni en vitant les acc@s concurrents. '<$ =aire une trace de votre programme.

13

Les smaphores

Das könnte Ihnen auch gefallen