Bonjour,

Voilà j'essaie de faire l'exercice suivant :

Ennonce :
On considère NBR robots chargés d’explorer une zonegéographique donnée afin de ramener des
échantillons à un central qui met à leur disposition NBR paniers dans lesquels déposer leurs
échantillons à la fin de leur mission d’exploration. Le central attend d’avoir les échantillons de tous
les robots avant de les transmettre au laboratoire d’analyse. Un robot ne repart en mission
d’exploration qu’après transmission de tous les échantillons au laboratoire.
On représente les robots collecteurs d’échantillonset le central par des processus. L’objectif est de
synchroniser les actions de ces différents processus selon les politiques définies ci-dessous :
• Politique P1. En fin de mission, chaque robot dépose ses échantillons dans le premier des NBR
paniers qu’il trouve vide.

On donne le code suivant à compléter :
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
Moniteur GestionPaniers { 
// Déclaration des variables conditions et variables d’état nécessaires . . . . // Déclaration des opérations fournies par le moniteur void deposerEchantillons (. . . ) ; void obtenirMission ( . . . ) ; void attendreEchantillons ( . . . ) ; void reinitialiserMission (. . . ) ;
} À titre d’information, le comportement des processus Robot et Central est le suivant : Processus Robot ( . . . )
while (1) { // Je rapporte des échantillons // et veux les déposer MPaniers.deposerEchantillons(...); // J’attends que mon panier // soit vidé MPaniers.obtenirMission(...); // pour repartir explorer }
} Processus Central ( . . .) {
while (1) { // J’attends tous les échantillons MPaniers.attendreEchantillons(..); // J’initie la mission suivante MPaniers.reinitialiserMission(..); }
}
Question :
Ecrire le moniteur chargé de la synchronisation demandée. Pour cela, donner les conditions de blocage/déblocage des deux types de processus
puis donner l’algorithme des différentes opérations proposées par ce moniteur.

Je sais ça fait beaucoup de ligne. Désolé.

Voici ce que j'ai fait :

Conditions de blocage/déblocage :
Un robot après avoir déposé ses échantillons est bloqué si aucune transmission n'a eu lieu.
Un robot est débloqué par le central après transmission des échantillons.

Le central est bloqué si les paniers ne sont pas tous remplis.
Le central est débloqué par le dernier robot qui dépose ses échantillons.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
Moniteur GestionPaniers{
 
	int NBR = 5;	
	int paniers[NBR];	// nombre de paniers égale au nombre de robots
	int indiceDepot = 0;
	boolean transmis = false;
	int nbPaniersPleins = 0;
 
	// Conditions
	Condition attenteRobots;
	Condition attenteCentral;
 
	void deposerEchantillons (int echantillons){
		// le robot dépose dans un panier vide
		paniers[indiceDepot] = echantillons;
		indiceDepot++;
		// le dernier robots à déposer ses echantillons réveille le central
		if(indiceDepot == NBR)
			attenteCental.signal();
 
		// si aucune transmisssion n'a eu lieu, on se bloque
		if(!transmis)
			attenteRobot.wait();
	} 
 
	void obtenirMission (){
		if(transmis)
			// repart en mission
	}
 
	void attendreEchantillons (){
		if(nbPaniersPleins == 0)
			attenteCentral.wait();
	}
 
	void reinitialiserMission (){
		// on tranmet les echantillons
		transmis = true;
		// on réveille tous les robots
		attenteRobot.signalAll();
		// réinitialise l'indice de dépôt
		indiceDepot = 0;
	}
}
Votre avis, des critiques, des conseils?

Merci d'avance.