==Question 1== //variables globables //autorisations de passer la barrière (données par lot de 3) Semaphore passage = 0 //un seul processus à la fois devra vérifier s'il peut passer Semaphore verif = 1 //nombre de processus en attente à la barrière Entier nbAtt=0 Fonction waitBarrier(){ wait(verif) nbAtt++ //si on est pas le 3ème process : on laisse les autres vérifier et on attend le droit de passage //remarque : entre le moment où on laisse les autres vérifier et le moment où on attend le passage, 3 autres processus peuvent passer, ce programme n'est donc pas toujours FIFO Si(nbAtt<3){ signal(verif) wait(passage) afficher("l'élément est passé !") } //si on est le 3ème : on laisse passer les 2 en attente (qu'on va suivre juste après) //remarque : là aussi, les processus ne sortent pas forcement en ordre FIFO, mais toujours par multiple de 3 Sinon{ signal(passage, 2) nbAtt = nbAtt - 3 afficher("l'élément est passé !") signal(verif) } } ==Question 2 (version 1, sans utiliser waitBarrier)== //1) variables globales //nombre de chaque élément nécessaire pour former une molécule Entier nbHydroRequis = 2 Entier nbOxyRequis = 1 Entier n = nbHydroRequis + nbOxyRequis //nombre de chaque élément en attente à la barrière Entier nbAttHydro = 0 Entier nbAttOxy = 0 //autorisations de passage de chaque élément Semaphore passageHydro = 0 Semaphore passageOxy = 0 //un processus qui vérifie prend n verif (nombre total d'éléments requis pour former une molécule) //le dernier processus qui libère les autre relâche une verif //les processus qu'il libère relâchent chacun une verif aussi //afin de vérifier que tous les processus de la molécule sont passé avant de libérer les suivants Semaphore verif = n //2) code pour Hydrogène Fonction waitBarrierHydro(){ wait(verif, n) nbAttHydro++ //s'il y a assez d'Hydro et d'Oxy en attente, on les libère et on met à jour les compteurs if(nbAttHydro>=nbHydroRequis && nbAttOxy>=nbOxyRequis){ nbAttHydro = nbAttHydro - nbHydroRequis nbAttOxy = nbAttOxy - nbOxyRequis signal(passageHydro, nbHydroRequis-1) //remarque : le "-1" sert à ignorer le processus courant signal(passageOxy, nbOxyRequis) } //sinon, on attend qu'un autre Hydro ou Oxy vienne nous libérer else{ signal(verif, n) wait(passageHydro) } afficher("Hydrogène a passé la barrière !") signal(verif) } //3) code pour Oxygène Fonction waitBarrierOxy(){ wait(verif, n) nbAttOxy++ //s'il y a assez d'Hydro et d'Oxy en attente, on les libère et on met à jour les compteurs if(nbAttHydro>=nbHydroRequis && nbAttOxy>=nbOxyRequis){ nbAttHydro = nbAttHydro - nbHydroRequis nbAttOxy = nbAttOxy - nbOxyRequis signal(passageHydro, nbHydroRequis) signal(passageOxy, nbOxyRequis-1) //remarque : le "-1" sert à ignorer le processus courant } //sinon, on attend qu'un autre Oxy ou Hydro vienne nous libérer else{ signal(verif, n) wait(passageOxy) } afficher("Oxygène a passé la barrière !") signal(verif) } ==Question 3 (version 1)== pour passer de H2O à H2O2, il faut remplacer la ligne Entier nbOxyRequis = 1 par Entier nbOxyRequis = 2 ==Question 2 (version 2, en utilisant waitBarrier de la question 1)== //1) variables globales //autorisations de passage de chaque élément Semaphore hydro = 2 Semaphore oxy = 1 //2) code pour Hydrogène Fonction waitBarrierHydro(){ wait(hydro) //au max 2 Hydrogenes passent waitBarrier() //puis attendent un 3ème élément dans waitBarrier (qui sera donc forcement 1 Oxygene) signal(hydro) } //3) code pour Oxygène Fonction waitBarrierOxy(){ wait(oxy) //au max 1 Oxygene passe waitBarrier() //puis attend 2 autres éléments dans waitBarrier (qui seront donc forcement 2 Hydrogenes) signal(oxy) } ==Question 3 (version 2)== pour passer de H2O à H2O2, il faut remplacer la ligne Semaphore oxy = 1 par Semaphore oxy = 2