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