TP – Commutation inter-processus
Le but de ce TP est d'écrire un petit ordonanceur en espace utilisateur.
Commutation inter-processus
Commencez par télécharger le programme commut.c,
compilez le et vérifiez qu'il s'exécute correctement.
Lisez attentivement le code et essayez de le comprendre.
Dans un premier temps, on souhaite créer une table des processus.
Pour cela, définissez un tableau de NPROC processus (fixez NPROC à 128) dans
la variable globale nommée proc.
Ensuite, remplacez toutes les utilisations de buff
par proc[0] et de bufg par bufg.
On souhaite maintenant savoir si une case du tableau est libre.
Pour cela, ajoutez un attribut state à vos processus
et définissez deux valeurs : SNONE indique que la case est libre
et SRUN indique que la case contient un processus.
Au début de la fonction main, mettez toutes les entrées
à l'état SNONE, puis mettez les entrées 0 et 1 à l'état
SRUN.
On souhaite maintenant mettre en place un mécanisme d'élection.
Écrivez une fonction int election() renvoyant
le processus à l'état SRUN qui suit votre processus
courant (current) dans la table des processus.
Pensez à repasser à la case 0 lorsque vous arrivez au bout du tableau.
Écrivez une fonction commut() utilisant commut_to
et election qui effectue une commutation vers le prochain
processus élu. Remplacez les appels à commut_to
dans f et g par des appels à commut.
En vous inspirant de la fonction commut_to, écrivez une
fonction void fork() qui :
- Trouve un emplacement libre k dans le tableau des processus.
- Duplique l'état du processus courant dans l'entrée k.
- Renvoie 0 si l'appelant est le processus qui a appelé fork et 1 si l'appelant est le processus dupliqué
Au lieu de créer à la main le processus g comme actuellement,
utilisez fork pour créez le processus g.
Faîtes le TP sur les signaux.
Supprimez les appels explicite à commut dans votre code.
A la place, utilisez la fonction alarm pour commuter
chaque seconde.
Attention : pensez à bien initialiser l'attribut flag de votre
structure sigaction à SA_NODEFER.
Créez une dizaine de processus et vérifiez que votre code est correct.
On souhaite maintenant écrire un ordonanceur avancé.
Dans la structure proc, ajoutez un champs
prio.
Cette prio doit être divisée par deux chaque seconde pour tous les processus
prêts. Pour le processus élu, cette priorité doit, en outre, être augmentée
de 1000 chaque seconde.
Modifiez votre fonction election de façon à élire le processus
ayant la valeur prio la plus basse.
On souhaite maintenant gérer la terminaison d'un processus. Écrivez une fonction
void quit() qui quitte un processus. Quitter un processus revient simplement
à marquer que l'entrée du processus courant est inutilisée et à commuter.
Faîtes en sorte que votre programme quitte proprement par la méthode main
quand il n'existe plus de processus prêt.