Page professionnelle – Thomas Robert

Maître de Conférence

Correction Tolérance aux Fautes I

Correction

L’exercice est organisé en 3 étapes :

1) une étape d’observation

2) une étape d’élimination de faute

3) une étape sur la tolérance aux fautes

Étape 1)

Si vous utilisez le premier jeu de paramètres recommandés dans le tp vous devez observer :

S-> Démarrage de la simulation…

X : 0.862412; Y : 0.506206; R : 1.000000;
X : 0.761466; Y : 0.648205; R : 1.000000;
X : 0.637406; Y : 0.770528; R : 1.000000;
X : 0.493999; Y : 0.869463; R : 1.000000;
X : 0.335596; Y : 0.942006; R : 1.000000;
X : 0.167008; Y : 0.985956; R : 1.000000;                            (si vous faites Ctrl – C )
^CS-> Salut !

***********
Dernier etat connu (X,Y):(-0.006651,0.999978)

En utilisant la commande make testhighfail, vous produire un code qui exécutera l’affichage toutes les 2 seconde avec d’abord la consultation de X puis celle de Y et le calcul de R au carré. En parallèle (et grâce à l’exécution sur multi coeurs), le code faisant les calculs lui s’exécute avec une période de 0.9 secondes et une pause entre la mise à jour de x et celle de y de 0,4 secondes. Ceci crée un contexte favorable à l’entrelacement de la mise à jour de x avec l’affichage puis la mise à jour de y. Ceci donnerai :

S-> Démarrage de la simulation…

X : -0.768645; Y : 0.000000; R : 0.590815;
X : -0.645957; Y : -0.763374; R : 1.000000;
X : -0.503661; Y : -0.863901; R : 1.000000;
X : -0.346077; Y : -0.938206; R : 1.000000;
X : 0.495869; Y : -0.868397; R : 1.000000;
X : 0.639063; Y : -0.769154; R : 1.173553;
X : 0.762860; Y : -0.646564; R : 1.163678;
X : 0.937930; Y : -0.346824; R : 1.000000;
X : 0.983890; Y : -0.178772; R : 1.000000;
^CS-> Salut !

***********
Dernier etat connu (X,Y):(0.983890,-0.178772)

Si la distance au point (0,0) n’est pas égale à 1,  c’est le signe d’un état d’exécution erroné.

Étape 2

Pour corriger ce problème il faut procéder en deux étapes :

introduire un sémaphore initialisé à 1, puis positionner dans les fonctions afficheur et simu_systeme les appels à sem_wait et sem_post. Attention, les fonctions sem_init, sem_post et sem_wait attendent un pointeur vers une structure de sémaphore que vous avez déclaré (i.e. c’est à vous avant le init d’avoir une structure sem_t en mémoire). La solution choisie est de déclarer une variable globale vue que la variable sera accédé dans différents thread (autre solution passer l’adresse en paramètre vers un contenu sur le tas ….

Le code de solution est fourni dans l’archive de solution dans systeme-q2.c.

Étape 3

Pour cette dernière phase, il faut tout d’abord constater que si vous exécuter en parallèle votre programme et « bash benchit.sh » avec pour paramètre le nom de l’exécutable que que vous avez créé à l’étape 2, R peut toujours être différent de 1…

En regardant les modes de défaillances  de sem_wait, vous constaterez que le semaphore peut défaillir et donc ne pas maintenir le processus bloqué.

L’ensemble des fichiers de solution aux étapes 2 et 3 se trouvent ici

Commentaires Clos.