Université Pierre et Marie Curie

Systèmes d'exploitation des ordinateurs

Chapitre 1. Les systèmes d'exploitation
Chapitre 2. Mécanismes d'exécution et de communication
Chapitre 3. Gestion des activités parallèles
3.1. Activités simultanées : pseudo parallèlisme
3.2. Mécanismes de synchronisation
3.2.1. Synchronisation par moniteur et sémaphores
3.2.2. Synchronisation par messages
3.2.3. Les pipes sous Unix
3.2.4. Etats d'un processus
Chapitre 4. Gestion des fichiers
Chapitre 5. Partage des ressources
Chapitre 6. Au-dessus du système d'exploitation
Chapitre 7. Notions sur les communications
Chapitre 8. Notions sur la sécurité
Bibliographie
Chapitre 9. Exercices et TPs
Examens
Page d'accueilTable des matièresNiveau supérieurPage précédenteBas de la pagePage suivante

3.2.4. Etats d'un processus

Principes généraux

Nous avons jusqu'ici considéré qu'un processus était soit actif soit en attente d'un événement. Nous allons maintenant préciser ces états en nous souvenant que nous nous plaçons dans l'hypothèse d'une machine monioprocesseur qui ne traite qu'une seule instruction à la fois. Bien que ceci soit de moins en moins vrai avec les dernières générations de processeurs multi coeurs, ceci permet de comprendre mieux les mécanismes de base.

Un processus actif est dit élu s'il est en cours d'exécution. S'il ne peut s'exécuter, faute de disponibilité du processeur, mais qu'il présente toutes les qualités pour être exécuté on dit qu'il est éligible. Les états d'un processus sont schématisés dans la figure 3.9.


Etats d'un processus

    figure 3.9 : Etats d'un processus     

Un processus éligible est élu (1) lorsque le processeur devient disponible. Il peut revenir à l'état éligible (2) si le processeur est requis par un processus plus prioritaire ou s'il a consommé la tranche de temps qui lui est allouée, dans le cas d'un système en temps partagé. Un processus est bloqué (3) lorsqu'il est en attente d'une ressource (entrées-sorties...) ou volontairement arrêté et devient éligible lorsqu'il a été réveillé (4).

Comme il existe plus d'un processus dans chaque état il est nécessaire d'associer des files d'attente à chaque cause d'arrêt. De même il est nécessaire de créer une file d'attente des processus éligibles. La politique de gestion de la file peut être simple - on choisit le processus en tête de liste - ou plus sophistiquée, comme sélectionner le processus qui se placera exactement dans un espace libre de la mémoire. Ces stratégies seront discutées au chapitre V. Le scheduler règle la politique d'entrée dans la file d'attente du processeur, le dispatcher alloue le processeur aux processus éligibles. La figure 3.10 schématise cette organisation en files d'attente.

Organisation d'une file d'attente

Lors de sa création un processus se voit allouer une zone de mémoire qui sert à gérer son activité. Il reçoit un numéro qui l'identifie. Dans cette zone de mémoire on range, entre autre :

  • l'adresse de la zone de sauvegarde du mot d'état du processus
  • l'adresse de la zone de sauvegarde des registres du processeur
  • l'état du processus: bloqué, actif ...
  • la priorité du processus
  • les droits du processus. Ceux-ci sont expliqués au chapitre IV.
  • les liens de chaînage dans la hiérarchie des processus

Le scheduler et le dispatcher requièrent les primitives suivantes pour gérer un processus p et la file d'attente f :

  • entrer(p, f) pour que le scheduler introduise p dans la file f en fonction des règles du système.
  • sortir(p, f) pour que le dispatcher extraie p, premier de la file f.
  • extraire(p,f) pour que le dispatcher choisisse p, quelque soit son rang dans la file. Cette dernière primitive peut ne pas être nécessaire s'il existe une file d'attente par priorité.
aa
Figure 3.10 : Files d'attente des processus

Une file d'attente est structurée : elle correspond à un espace réservé dans la mémoire pour inscrire les informations relatives aux entités que gère la file (adresse du mot d'état, identité du processus...). On y ajoute les pointeurs nécessaires à sa gestion. Ils permettent d'ajouter ou d'enlever un élément en modifiant uniquement leurs valeurs sans avoir à réécrire le contenu complet de la structure de la file. La figure 3.11 en présente une organisation possible. Chaque élément est accompagné de deux pointeurs, un sur l'élément rangé devant, l'autre sur celui qui est derrière. On peut ainsi explorer la file du début vers la fin et inversement. On accède à la file par un pointeur qui indique le premier élément.

Pour ajouter un processus dans la file d'attente, il suffit d'introduire les informations le concernant dans un espace disponible de la zone de mémoire et de couper le chaînage (3) entre le premier et le dernier élément. Le pointeur de l'objet de tête devra maintenant pointer sur ce nouvel élément. Celui-ci pointera sur l'ancien dernier élément. Lorsqu'on sort le premier élément de la file d'attente, on coupe le lien (1) sur le deuxième qu'on referme sur le dernier. Pour extraire un élément quelconque il faut parcourir la file jusqu'à le trouver puis utiliser le même procédé. L'existence de deux pointeurs avant et arrière permet de trouver aisément les chaînages. Ceci accroît également la sécurité au cas où la file serait détériorée car il est parfois possible de reconstituer le chaînage au moyen du deuxième pointeur.

aa

Figure 3.11 : Principe de chaînage d'une file d'attente.
(a) Etat initial avec schéma des pointeurs avant et arrière
(b) ajout d'un élément à la fin
(c) extraction du premier élément

 

Ces différents fonctionnements sont résumés dans les figures 3.11b et 3.11c. Seuls les chaînages sont représentés sans indiquer spécifiquement ni le pointeur avant ni l'arrière.

Processus sous Unix


Etats d'un processus

figure 3.12 : Diagramme des états d'un processus

La figure 3.12 résume plus spécifiquement les états d'un processus pour un système Unix.

  1. A sa création il est chargé en mémoire selon un mécanisme qui sera décrit en détail au chapitre VI. Il bascule de l'état initial non prêt à prêt. Il est introduit dans la file d'attente des processus prêts à être exécutés par un processus plus prioritaire appelé scheduler.
  2. En temps voulu, lorsque le processeur devient disponible, il est préempté par un processus appelé dispatcher. Le schéma indique comment il peut basculer du mode utilisateur au mode système où il peut exécuter des instructions privilégiées si ses droits le permettent.
  3. S'il est interrompu par un processus plus prioritaire ou parce que sa tranche de temps est épuisée, dans le cas d'un processus interactif, il est placé à nouveau dans la file d'attente des processus prêts à être exécutés.

Un processus est endormi lorsqu'il attend une ressource indisponible ou si une interruption est ern cours de traitement. Par exemple il nécessite le traitement d'un ordre de lecture et le chargement des données dans la mémoire depuis un disque. Il ne redeviendra éligible et placé dans la file des prêts que lorsque la cause de son arrêt aura était traitée. Les processus prêts et endormis sont placés dans des files d'attente différentes.

Lorsqu'il a terminé son existence un processus est effacé en passant par un état intermédiaire appelé zombie. Les tampons utilisés par les entrées-sorties sont vidés et les fichiers ouverts sont désalloués. Il arrive parfois que le processus ne soit pas complètement effacé des tables du système et qu'il reste dans cet état tant que l'ordinateur n'est pas arrêté.

Unix est un système à mémoire virtuelle: ceci signifie que toute ou partie de la zone mémoire occupée par un processus peut être récupérée au profit d'un autre processus. Dans ce cas il est recopié sur disque dans un fichier spécial appelé swap ou fichier d'échange. Ce mécanisme sera décrit en détail au chapitre V.3. Lorsque la place en mémoire devient insuffisante pour charger le code des processus actifs, un processus endormi ou non préempté peut être placé dans la zone de swap pour libérer sa place en mémoire.

Comme dans tout système temps partagé la priorité d'un processus utilisateur varie au cours du temps: plus il utilise le processeur, plus celle-ci diminue. Ceci n'est généralement pas vrai pour les processus qui participent au fonctionnement de la machine et dont la priorité est toujours plus élevée que celle des utilisateurs.

Les processus sont identifiés par leur nom ou PID (Processus ID) qui est un nombre généré en ordre croissant au fur et à mesure de la vie du système. Ils possèdent un propriétaire, ce qui permet de vérifier la légitimité des opérations qu'ils effectuent. Cet aspect de la protection est développé en détails au chapitre suivant dans la section 4.1.2. On distingue deux classes de processus :

  • ceux qui appartiennent à un usager qui communique conventionnellement avec le sytème au moyen du clavier et de l'écran
  • les daemons qui ne sont pas reliés à ces unités conventionnelles et ne communiquent qu'au travers de fichiers. De nombreux processus du système d'exploitation sont des daemons car ils n'ont pas besoin de dialoguer avec un usager et les communications par fichiers sont plus adaptées. Le nom du programme qu'ils exécutent comporte souvent la lettre d à la fin : httpd, inetd...

Voici, à titre d'exemple, la réponse à la commande ps qui indique l'état de quelques processus sur une machine Linux :

USER       PID  PPID   %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0      0.0  2252  628 ?        S    Jan06   0:04 init [5]                  
root     15366  1      0.7 19524 10872 ?       Ss   Jan30   0:00 /usr/sbin/httpd
apache   15684  15366  0.7 19632 11384 ?       S    Jan30   0:00 /usr/sbin/httpd
benakli  16932  16224  0.1  5108 2648 ?        Ss   10:45   0:00 imapd
root     17360  1      0.1  6848 2128 ?        Ss   12:47   0:00 sshd: epelboin [priv]
epelboin 17362  17360  0.1  6824 2100 ?        S    12:47   0:00 sshd: epelboin@pts/2
epelboin 17363  17362  0.0  2216  492 pts/2    Ss   12:47   0:00 -ash
epelboin 17409  17363  0.0  2376  748 pts/2    R+   12:51   0:00 ps aux


L'information se lit comme suit :

  • La première colonne fournit l'identité du propriétaire du processus (User ID)
  • La seconde celle du processus (Processus ID) qui est un nombre
  • La suivante fourit l'identité du processus père qui l'a généré par un fork (Parent PID). On remarquera, par exemple, qu'un premier processus httpd (gestion d'un serveur Web Apache) est lancé par root (ligne 2) et que ce daemon en lance lui-même un second (ligne 3) : en effet le PPID du deuxième (15366) est le PID du premier.
  • La colonne TTY indique si un terminal est attaché au processus. Seuls les deux derniers processus en possèdent un (pts/2) : ils correspondent à la fenêtre (17363) à partir de laquelle la commande ps a été lancée (17409).

On remarquera que le premier processus du système initd porte le numéro 1. En effet le processus de boot du système dont le numéro est 0, s'arrête après démarrage. Le processus 176409 est en cours d'exécution (R+), les autres sont arrétés (S Suspended) en attente d'une requête.

Pour plus de détails sur la signification des différents champs on se reportera au manuel en ligne de la commande ps (man ps).


Copyright Yves Epelboin, université P.M. Curie, 2000, MAJ 31 janvier, 2006

Page d'accueilTable des matièresNiveau supérieurPage précédenteHaut de la pagePage suivante