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

Portail informatique

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.