Onyest dossier - Le problème des lecteurs-rédacteurs Ajouter à mes favoris
Sommaire
Systèmes parallèles
Cours
Atomicité et processus
Exclusion mutuelle
Les sémaphores
Mise en œuvre
Producteur(s) – Consommateur(s)
Allocation de ressources (priorités)
Le problème des lecteurs-rédacteurs
Approche "langage"
TDs
TPs
Probabilités appliquées aux systèmes
Théorie des langages et compilation
VHDL
Suite : Approche "langage"

Le problème des lecteurs-rédacteurs

Des lecteurs et des rédacteurs doivent utiliser un même fichier. On a pas de conflit RR mais des conflits WW, RW et WR, ce qui doit engendrer une exclusion mutuelle.

rédacteur

 

lecteur

...
P(mutexF)
ECRITURE
V(mutexF)
...

sema mutexR init 1
mutrexF init 1

P(mutexR)
nbl++
si nbl = 1 alors P(mutexF)
V(mutexR)
LECTURE
P(mutexR)
nbl--
si nbl=0 alors V(mutexF)
V(mutexR)

Afin de paralléliser les lectures, on a ajouté une variable et un sémaphore. On a ainsi construit une priorité faible des lectures (une lecture en cours favorise les lectures qui arrivent). Donc, si on a plein de lecture, l'écriture pourrait ne jamais passer.

Pour obtenir une priorité forte des rédacteurs (lorsqu'un rédacteur se termine, on favorise les lecteurs en attente s'il y en a), on doit créer une deuxième file d'attente. Pour cela on ajoute un autre sémaphore ; prioL init 1.

le rédacteur devient :
... ;
P(prioL) ;
P(mutexF) ;
ECRITURE ;
V(mutexF) ,
V(prioL) ; ...

Pour obtenir une priorité faible des rédacteurs (une écriture en cours favorise les écritures qui arrivent), on reprend l'algorithme précédent en ajoutant deux sémaphores.

rédacteur

 

lecteur

P(mutexE)
nbr++
si nbr = 1 alors P(mutexBL)
V(mutexE)
P(mutexF)
ECRITURE
V(mutexF)
P(mutexE)
nbl--
si nbr=0 alors V(mutexBL)
V(mutexE)

sema mutexE init 1
mutrexBL init 1
(BL = bloque lecteur)

P(mutexBL)
P(mutexR)
nbl++
si nbl = 1 alors P(mutexF)
V(mutexR)
V(mutexBL)
LECTURE
P(mutexR)
nbl--
si nbl=0 alors V(mutexF)
V(mutexR)

Dans le problème lecteurs / rédacteurs, la solution du double tampon permet d'éviter les conflits entre lectures et écritures. On va supposer que l'on a un seul rédacteur et un ou plusieurs lecteur(s). On a un tampon de deux case ; tp[0] et tp[1]. La variable dernier indique la case ou la dernière valeur à été produite. Pour accéder à ce tampon, on a 2 primitives : lire(tp[j],d) et ecrire(tp[j],d). Les lecteurs accèdent à la dernière case écrite alors que le rédacteur utilise l'autre.

Rédacteur Lecteur
var locale je,d

repeat

calculer une donnée d
je := (dernier +1) mod 2
ecrire(tp[je],d)
dernier := je

until ...

var locales jl,d

repeat

jl := dernier
lire(tp[jl],d)
utiliser(d)

until ...

Suite : Approche "langage"
Onyest dossier - cours ingénieur informatique et électronique : SPAR, PAS, TLC, VHDL - http://www.onyest.free.fr/dossier/cours - webmaster : novis@chez.com

-