AISE – Architecture Interne d'un Système d'Exploitation

Portail informatique

TP – Synchronisation entre processus

Le but de ce TP est de mettre en oeuvre les fonctions sleep et wakeup. Vous pouvez soit démarrer avec le code de votre TP précédent, soit démarrer du corrigé type qui se trouve ici,

Sleep et wakeup

De façon à tester vos fonctions sleep et wakeup, nous vous proposons de créer une petite boite au lettre permettant à deux processus de communiquer. Cette boîte au lettre contient deux champs :
  • int hasMessage; vaut vrai si il existe un message;
  • int message; contient le message (donc constitué d'un unique entier.

Écrivez une fonction int recv() qui :
  • Effectue une attente active tant que hasMessage passe est faux;
  • Preserve le message reçu dans une variable locale;
  • Repasse hasMessage à faux;
  • Renvoie le message reçu.

Écrivez une fonction void send(int msg) qui envoie le message. Testez vos fonctions en envoyant dans un processus le message 42 (un unique message) et en le recevant dans un autre. Vous pourrez vérifier que votre attente de message est correcte en endormant pendant 1 seconde l'émetteur avant d'émettre le message.

Mettez en œuvre les méthodes sleep et wakeup sans vous soucier du problème des commutations qui pourraient arriver à n'importe quel instant. Remplacez l'attente active dans send et recv par des appels à sleep et wakeup.

Modifiez votre programme de façon à gérer le masquage des interruptions (des signaux) correctement. Utilisez sigprocmask pour mettre en œuvre spl et gpl.

La frontière du système

On souhaite maintenant mimer une frontière système. Pour cela, nous allons considérer deux types de fonctions :
  • Les fonctions systèmes. Les noms de ces fonctions doivent être précédés de l'identifiant sys_. Ces fonctions doivent s'exécuter en mode système.
  • Les fonctions utilisateurs. Les noms de ces fonctions doivent être précédés de l'identifiant usr_. Ces fonctions doivent s'exécuter en mode utilisateur.

Ajouter le préfixe sys à toutes les fonctions que vous avez écrites, y compris la fonction main. Ajouter une nouvelle fonction main qui appelle sys_main, c'est-à-dire l'ancienne fonction main.

Définissez une variable nommée mode. Cette variable peut prendre les valeurs MODES ou MODEU. Initialement, cette variable doit prendre la valeur MODES puisque le système démarre en mode système.

Nous allons commencer à mettre en œuvre la frontière entre le mode système et le mode utilisateur. Pour cela, écrivez une méthode sysent prenant deux arguments :
  • Un numéro d'interruption;
  • Un pointeur vers une variable de type sysent_arg. Ce type