Previous Up Next

7  Prévention des interblocages

Sur une idée de Gilles Grimaud

On ajoute aux sémaphores introduits précédemment un mécanisme d’exclusion mutuelle sous la forme de simples verrous :

L’interface de manipulation des verrous est la suivante :

void mtx_init(struct mtx_s *mutex);
void mtx_lock(struct mtx_s *mutex);
void mtx_unlock(struct mtx_s *mutex);

Comparés aux sémaphores, l’utilisation des verrous est plus contraignantes : seul le contexte propriétaire du verrou peut le libérer et débloquer un contexte en attente du verrou. De manière évidente, les verrous peuvent être simulés par des sémaphores dont la valeur initiale du compteur serait 1.


Exercice 13
   L’académique et classique problème des philosophes est le suivant : cinq philosophes attablés en cercle autour d’un plat de spaghettis mangent et pensent alternativement sans fin (faim ?). Une fourchette est disposée entre chaque couple de philosophes voisins. Un philosophe doit préalablement s’emparer des deux fourchettes qui sont autour de lui pour manger.

On désire élaborer une solution à ce problème en attachant un contexte à l’activité de chacun des philosophes et un verrou à chacune des fourchettes.

Montrez qu’une solution triviale peut mener à un interblocage, aucun des philosophes ne pouvant progresser.


Exercice 14
   Comment le système peut-il prévenir de tels interblocages ?

On considérera que

Considérez aussi les situations dans lesquelles toutes les activités ne participent pas à l’interblocage. Par exemple, une sixième activité indépendante existe en dehors des cinq philosophes.

On modifie l’interface de manipulation des verrous pour que le verrouillage retourne une erreur en cas d’interblocage :

void mtx_init(struct mtx_s *mutex);
int mtx_lock(struct mtx_s *mutex);
void mtx_unlock(struct mtx_s *mutex);

Exercice 15
   Donner une implémentation de ces primitives détectant les interblocages.

Previous Up Next