Pages 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.

On notera que nous avons encadré au plus juste les accès à x,y au pus juste afin de ne pas altérer la logique de la simulation qui repose sur la répétition du code d’affichage et de mise à jour de position de manière périodique ( dernière ligne de la boucle dans chaque fonction).

On notera en particulier le contenu des lignes 29, 36, 45,53,64. (Ce sont les lignes contenant les appels au service de sémaphore).  Le code de solution est fourni plus bas.

É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…

Pour corriger ce problème il faut récupérer le code de retour de sem_wait et analyser sa valeur, si il vaut -1 sem_wait n’a pas modifier le sémaphore et a priori ne bloque plus le processus correctement. Cependant, cela ne veut pas dire que l’on puisse régler le problème systématiquement par rééxécution de sem_wait. Ce n’est vrai que dans le cas où la fonction a défailli dans le cas EINTR. Pour analyser l’origine de la défaillance, vous devez inclure le header errno.h qui permet de consulter une variable globale : errno qui mémorise le code d’erreur de la dernière fonction défaillance exécutée.

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

Commentaires Clos.