==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