Correction
Exercice 1

Question 1
 
 
On identifie un schéma producteur/consommateur sur chacun des tampon. On utilise pour chacun de ces schéma un couple de sémaphores : MVIDE initialisé à M et MPLEIN initialisé à 0 (tampon requête) NVIDE initialisé à N et NPLEIN initialisé à 0 (tampon avis)

Question 2
 
 
Il faut maintenant gérer les accès concurrents aux tampons avis et requête. En effet :
  • les différents processus Acquisition se partagent l'index i
  • les différents processus exécution se partagent l'index j et k
  • les différents processus Impression se partagent l'index k les variables i, j, k, l sont maintenant globales et les accès à ces variables doivent se faire en exclusion mutuelle. On ajoute donc quatre sémaphores d'exclusion mutuelle initailisés à 1 (un sémaphore par index).

remarque : l'ordre d'appel des sémaphores d'exclusion mutuelle par rapport à ceux du schéma producteur consommateur n' pas d'importance.
Exercice 2
Question 1
Lorsque l'employé saisit une commande, l'écriture sur disque d'une ligne à la fois, implique que, à un instant donné, le disque ne contient qu'une partie de la commande. Si le processus de facturation est lancé, il ne trouvera pas toutes les lignes de la commande pour éditer la facture, qui sera donc partielle. Au moment où on crée une commande, il faut donc interdire au processus de facturation d'accéder aux commandes.
 
 
Par ailleurs, l'employé édite les commandes saisies sur la même imprimante que le processus de facturation. Ces éditions se font ligne par ligne, mais toutes les lignes concernant le même bon de commande ou la même facture doivent se trouver regroupées, et non entremêlées. Il faut donc que l'imprimante soit en exclusion mutuelle entre les deux processus.
Question 2 - question 3
La solution proposée garantit bien l'accès en exclusion mutuelle à l'imprimante par les deux processus. Le processus de facturation réserve l'imprimante pendant le traitement des factures d'une période. Ces factures seront donc bien éditées de manière consécutive. Par ailleurs, comme le processus réserve également le fichier des commandes, aucune commande ne peut être en cours de saisie pendant l'édition des factures.
Question 4
L' interblocage est une situation où un ensemble de processus sont bloqués en attente d'une ressource possédée par un autre processus de l'ensemble. Chacun attend qu'un autre veuille bien libérer la ressource qu'il attend. Ceci ne peut se faire sans une intervention extérieure, puisqu'ils sont tous bloqués. Or on ne peut débloquer un processus qu'en lui donnant toutes les ressources nécessaires, et donc en réquisitionnant celle qu'il attend et qui est possédée par un autre processus de l'ensemble.
 
 
Dans la solution proposée, on peut imaginer que le processus employé réserve le fichier COM et commence à saisir la commande. A ce moment le processus de facturation est activé, et réserve l'imprimante, puis se bloque en attente du fichier COM. Lorsque l'employé a terminé la saisie, il réserve l'imprimante, mais comme celle-ci est déjà réservée par le processus de facturation, il se bloque en attente de la libération. Nous avons alors deux processus qui attendent mutuellement la libération d'une ressource possédée par un autre processus de l'ensemble : ces deux processus sont en interblocage.
Question 5
Pour ne plus avoir d'interblocage, une des solutions est de réserver les ressources dans le même ordre, puisque, dans ce cas, il ne peut plus y avoir de circularité dans les attentes de ressources. Dans le processus de facturation, il faut donc réserver le fichier COM en premier.

Exercice 3

Question 1
Deux processus P1 et P2 exécutent chacun de leur côté, la même opération CredDeb_Compte(10, Crediter,100). le déroulement de ces opérations peut être le suivant. le solde final sera finalement de 1100 à la place de 1200.

Question 2
Il suffit de placer l'exécution de la procédure CredDeb_Compte en exclusion mutuelle, soit avec ACCES sémaphore initialisé à 1 :

Question 3
Cette fois, il faut mettre en place un schéma lecteurs/rédacteurs. La procédure CredDeb_Compte reste comme en Q2. La procédure Donner_Solde devient :

Exercice 4
Lors de l'utilisation d'une ressource critique par une tâche, il est habituel d'ajouter aux paramètres de description de la tâche ceux supplémentaires suivant : 
  • Cia : séquence d'instructions précédant l'appel de la ressource,
  • Cig : séquence d'instruction suivant la libération de la ressource avec Ci = Cia + Cib + Cig.
 
 
Toute tâche en cours d'utilisation d'une ressource critique peut être préemptée par une tâche plus prioritaire qu'elle, et qui n'a pas besoin de cette ressource. On considère l'exemple d'une configuration de trois tâches périodiques. Les tâches Tp1 et Tp3.

Question 1
Comme le montre la figure, à l'instant t=8, la tâche 3 est bloquée par la tâche 2 parce qu'elle est plus prioritaire qu'elle. Mais comme la tâche 1 est en attente de la ressource critique (occupée par la tâche 3) depuis l'instant t=7, on observe donc que la tâche 2 est exécutée avant la tâche 1 : c'est le phénomène d'inversion de priorité.

  Question 2
Pour éviter ce problème d'inversion de priorité, à l'instant t=7, lorsque la tâche 1 se met en attente de la ressource occupée par la tâche 3, la tâche 3 prend la priorité de la tâche 1. Par conséquent, à l'instant t=8, la tâche 3 est plus prioritaire que la tâche 2 et continue à s'exécuter. L'exécution de la tâche 2 se trouve ainsi repoussée à l'instant t=10 après la tâche 1 (cf. figure 3.15).

Synchronisation entre processus Exercices dirigés