Cours : Processus

 
 
Nous commençons à présent l'étude du fonctionnement d'un système multiprogrammé. Dans ce cours, nous nous intéressons à la fonction d'exécution : elle recouvre principalement deux notions : celle de processus ,qui correspond à l'image d'un programme qui s'exécute et celle d' ordonnancement qui correspond au problème de l'allocation du processeur et donc du partage du processeur entre différents processus .

1 Notion de processus

1.1 Rappel sur la chaine de production d'un programme exécutable.

 
 
La chaine de production de programme (figure 1) transforme un programme écrit dans un langage de haut niveau en un programme dit exécutable, écrit en langage machine. Cette transformation s'effectue à l'aide de plusieurs étapes : L'utilisateur saisit son programme à l'aide de l'éditeur de texte qui crée un fichier sur le disque que l'on appelle le fichier source. Ce fichier source est ensuite compilé à l'aide d'un compilateur dépendant du langage de programmation utilisé et dont le rôle est de vérifier que la syntaxe du langage est respectée et de générer alors l'équivalent du programme source en langage machine : on obtient alors sur disque le fichier objet. Ce fichier objet est ensuite soumis à l'éditeur de liens dont le rôle est de résoudre les références externes, c'est-à-dire par exemple, d'associer les appels système inclus dans le programme à leur adresse dans le système. L'éditeur de liens produit sur disque le fichier exécutable. Lorsque l'utilisateur demande l'exécution de son programme, le fichier exécutable est alors monté en mémoire centrale : c'est l'étape de chargement. Le système alloue de la place mémoire pour placer le code et les données du programme.
Fig 1 : Chaine de production de programme
 
Exemple sur Unix :
Pour le système d'exploitation Unix, les étapes suivantes permettent de passer d'un fichier source à un processus
  • saisie du fichier source avec un éditeur tel que vi : programme.c
  • compilation et production du fichier programme.o : cc -c programme.c <return>
  • édition des liens et production du fichier exécutable programme : ld -o programme programme.o <return>
  • chargement et création du processus : programme <return>

1.2 L'exécution d'un programme

 
 
La figure 2 représente l'exécution du programme à un niveau qui est celui de l'architecture matérielle de la machine. Le programme à exécuter est placé en mémoire centrale à partir de l'emplacement d'adresse 102. Le processeur a commencé l'exécution du programme : la première instruction de celui-ci a été chargée dans le registre instruction (RI) et le Compteur Ordinal (CO) contient l'adresse de la prochaine instruction à exécuter soit 103. Lorsque l'instruction courante aura été exécutée, le processeur chargera dans la registre RI l'instruction pointée par le CO, soit add Imm R1 5 et le compteur ordinal prendra la valeur 104. L'exécution de l'instruction add Imm R1 5 va modifier le contenu du registre PSW puisque c'est une instruction arithmétique : les flags de signe, de nullité etc... sont mis à jour. On voit donc qu'à chaque étape d'exécution du programme, le contenu des registres du compteur ordinal évolue. De même le contenu de la mémoire centrale peut être modifié : écriture, lecture dans la pile (Push, Pop), modification des données par une instruction Store. On appelle processus l'image de l'état du processeur et de la mémoire au cours de l'exécution d'un programme. Le programme est statique et le processus représente la dynamique de son exécution. Lors de l'étape de chargement, le système alloue de la place mémoire pour placer le code et les données du programme et crée la pile d'exécution de ce qui est en train de devenir un processus. Il alloue alors une structure de donnée descriptive du processus destinée à regrouper toutes les informations du contexte du processus : le bloc de contrôle du processus. Le processus est alors créé. Il est prêt à s'exécuter.
Fig 2 : Exécution d'un programme

1.3 Le processus

Définition : Processus
  • Un processus est un programme en cours d'exécution auquel est associé un environnement processeur (CO, PSW, RSP, registres généraux) et un environnement mémoire appelés contexte du processus.
  • Un processus est l'instance dynamique d'un programme et incarne le fil d'exécution de celui-ci dans un espace d'adressage protégé (objets propres : ensemble des instructions et données accessibles)
  • Un programme réentrant est un programme pour lequel il peut exister plusieurs processus en même temps
1.3.1 Les états du processus
 
 
Lors de son exécution, un processus est caractérisé par un état :
  • lorsque le processus obtient le processeur et s'exécute, il est dans l'état élu. L'état élu est l'état d'exécution du processus.
  • lors de cette exécution, le processus peut demander à accéder à une ressource (réalisation d'une entrée/sortie, accès à une variable protégée) qui n'est pas immédiatement disponible : le processus ne peut pas poursuivre son exécution tant qu'il n'a pas obtenu la ressource (par exemple, le processus doit attendre la fin de l'entrée/sortie qui lui délivre les données sur lesquelles il réalise les calculs suivants dans son code) : le processus quitte alors le processeur et passe dans l'état bloqué. L'état bloqué est l'état d'attente d'une ressource autre que le processeur.
  • lorsque le processus a enfin obtenu la ressource qu'il attendait, celui-ci peut potentiellement reprendre son exécution. Cependant, nous nous sommes placés dans le cadre de systèmes multiprogrammés, c'est-à-dire qu'il y a plusieurs programmes en mémoire centrale et donc plusieurs processus.. Lorsque le processus est passé dans l'état bloqué, le processeur a été alloué à un autre processus. Le processeur n'est donc pas forcément libre. Le processus passe alors dans l'état prêt. L'état Prêt est l'état d'attente du processeur.
  • Le passage de l'état prêt vers l'état élu constitue l'opération d'élection. Le passage de l'état élu vers l'état bloqué est l'opération de blocage. Le passage de l'état bloqué vers l'état prêt est l'opération de déblocage.
 
 
Un processus est toujours crée dans l'état prêt. Un processus se termine toujours à partir de l'état élu (sauf anomalie).
Fig 3 : Etats d'un processus
 
Exemple sous Unix
La figure ci-dessous présente le graphe d'états simplifié pour un processus Unix. Un processus évolue entre trois modes au cours de son exécution : le mode utilisateur qui est le mode normal d'exécution, le mode noyau en mémoire qui est le mode dans lequel se trouve un processus prêt ou bloqué (endormi) et le mode swappé qui est le mode dans lequel se trouve un processus bloqué (endormi) déchargé de la mémoire centrale. En effet, le système Unix décharge de la mémoire centrale les processus endormis depuis trop longtemps (ils sont alors dans l'état Endormi swappé). Ces processus réintègrent la mémoire centrale lorsqu'ils redeviennent prêts (transition de l'état prêt swappé vers l'état prêt). Un processus qui se termine passe dans un état dit zombi. Il y reste tant que son PCB n'est pas entièrement démantelé par le système.
Etats d'un processus Unix -graphe simplifié-
1.3.2 Le bloc de contrôle du processus (PCB)
 
 
Le bloc de contrôle d'un processus (PCB) contient les informations suivantes :
  • un identificateur unique du processus (un entier) : le PID
  • l'état courant du processus (élu, prêt, bloqué)
  • le contexte processeur du processus : la valeur du CO, la valeur des autres registres du processeur
  • le contexte mémoire : ce sont des informations mémoire qui permettent de trouver le code et les données du processus en mémoire centrale
  • des informations diverses de comptabilisation pour les statistiques sur les performances système
  • des informations liées à l' ordonnancement du processus. Le PCB permet la sauvegarde et la restauration du contexte mémoire et du contexte processeur lors des opérations de commutations de contexte .

Fig 4 : Bloc de contrôle d'un processus
 
Exemple sous Unix
Nous prenons en exemple la structure du bloc de contrôle de processus dans le système d'exploitation Unix. Le bloc de contrôle du processus est divisé en deux parties :
  • chaque processus dispose d'une entrée dans une table générale du système, la table des processus. Cette entrée contient les informations sur le processus qui sont toujours utiles au système quel que soit l'état du processus : l'identificateur du processus (pid), l'état du processus, les informations d'ordonnancement, les informations mémoire, c'est-à-dire l'adresse des régions mémoire allouées au processus.
  • chaque processus dispose également d'une autre structure, la Zone U. Cette Zone U contient d'autres informations concernant le processus, mais ce sont des informations qui peuvent être temporairement "swappées" sur le disque.

Bloc de contrôle d'un processus Unix
Processus Processus