Bonjour!
Voilà, je suis entrain de lire le livre d'Andrew Tanenbaum (pour ceux qui connaissent) intitulé "Système d'exploitation" et il est question de trouver une solution au problème des boulangers posé de cette façon :
Dans le livre, pour ne pas être spécifique à un langage, on utilise les primitives Down et Up qui représentent les fonctions de manipulation des sémaphores (WaitForSingleObject et Release respectivement).Dans une boulangerie, on a n boulangers. Les clients arrivent et doivent prendre un numéro. Un seul boulanger peut lire à un moment donné un numéro et servir le client correspondant; de même un client à la fois peut prendre un numéro. Le nombre de numéro est également limité et vaut N. On suppose qu'une fois le client appelé, l'action du boulanger se résume à la fonction ServirClient(). Ecrire en utilisant les sémaphores, des procédures pour les clients et des procédures pour les vendeurs
J'ai déjà cherché des algorithmes pour ce problème mais aucun ne me propose une solution vraiment efficace; de plus ce que j'ai écris ne semble pas marcher
Une boucle infinie parce qu'on suppose qu'on travaille à plein temps (personne ne dort ici )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Semaphore mu=1; //une ressource disponible. mutex pour rendre l'action atomique Semaphore Vendeur=n; //on a n vendeurs Semaphore Client=1; //un client à la fois. NombreNumero = 0; //nombre de numero déjà pris par les clients void Client() { while(1) { down(client); down(mutex); //pour s'assurer qu'un seul client pourra exécuter cette action PrendreNumero(); //action de prendre un numéro NombreNumero--; //le nombre de numéro dispo diminue si(NombreNumero==0) Up(Vendeur); //le nombre de numéro dispo vaut 0 donc on a tout pris alors on demande à un vendeur de lire up(mutex); } } void Vendeur { while(1) { down(Vendeur); down(mutex); // j'utilise le même mutex pour être sûr qu'on ne pourra pas lire un numero pendant qu'un client en prend. LireNumero(); //le vendeur lit un numero NombreNumero++; si(NombreNumero==N) //le nombre de numéro dispo = nombre de numéro total Up(Client); //on "reveille" le client up(mutex); } }
Voilà, j'espère que vous pouvez un peu m'éclairer sur ce problème (des liens vers des cours, n'importe quoi).
Merci.
Partager