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
2.1. Notions sur les procédures
2.2. Notions sur les interruptions
2.3. Programmation des entrées-sorties
2.4. Les processus sous Unix
2.4.1. Principes généraux
2.4.2. Réalisation
2.4.3. Les threads
Chapitre 3. Gestion des activités parallèles
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

2.4.1. Principes généraux

Dés sa création un processus est doté d'un environnement de travail spécifique. Il est le fils du processus qui l'a créé. Tout processus possède donc un père sauf le premier, créé au démarrage du système, qui est donc le père de tous les autres. Il est créé par le noyau du système que l'on ne peut pas assimiler à un processus. Il exécute le programme initd.  

Un processus n'a pas autorité pour exécuter n'importe quelle fonction du système d'exploitation. En mode système il accède à des ressources privilégiées, en mode utilisateur il ne peut pas employer certaines instructions. Les droits sont définis dans l'environnement et un processus fils hérite des droits de son père. La notion de droits sera éclaircie au chapitre 4. Un processus est identifié par un numéro unique ou identificateur.

La création d'un nouveau processus est l'un des mécanismes fondamentaux d'Unix. Le processus père exécute une instruction appelée fork qui crée le processus fils. Le père et le fils exécutent alors simultanément les mêmes instructions du même code. Si le code est prévu pour distinguer le père du fils  on peut les obliger à exécuter des parties de code différentes. Une primitive, exec, permet de charger un nouveau code. Ainsi le fils peut-il exécuter un programme différent de celui de son père. Si de plus on modifie l'environnement du fils on aura créé un processus nouveau tout à fait différent de son père. Des mécanismes de sécurité interdisent normalement à un processus d'acquérir des droits qui dépasseraient le niveau de privilèges de son père. Ce schéma de création est résumé dans la figure 3.12.

Mécanisme fork

figure 3.12 - Création d'un processus

Le démarrage d'un nouveau processus passe donc par les étapes suivantes:

  1. création du nouveau processus au moyen de la fonction fork
  2. test pour distinguer le fils du père
  3. dans la branche suivie par le fils, chargement d'un nouveau code par la fonction exec ou une autre équivalente
  4. modification éventuelle de l'environnement du fils par la fonction setenv.

Unix permet de gérer l'exécution parallèle du père et du fils. Le père peut attendre la "mort" du fils avant de continuer son travail (fig. 3.13a). Il est alors mis en attente: c'est le cas, le plus souvent, lorsqu'un utilisateur lance  une commande. La fenêtre dans laquelle la commande a été lancée est gelée jusqu'à la fin de son exécution. Si la réponse est rapide et la durée de vie du fils courte, ce gel peut être difficile à remarquer.

Par exemple,  lister un ensemble de fichiers par la commande ls correspond aux actions suivantes :

  1. création d'un processus fils
  2. mise en attente du père (le shell de commande)
  3. chargement du code correspondant à ls dans le processus fils
  4. exécutiondestruction du processus fils à la fin de son travail
  5. redémarrage du père. Le prompt du shell réapparaît à l'écran.

Unix peut également exécuter les deux codes simultanément (fig. 3.13b). Lorsqu'on emploie une fenêtre unique pour les deux processus, l'affichage des résultats présente une confusion certaine puisque les différents processus inscrivent leurs résultats dans un écran unique. Cela ne présente alors pas un grand intérêt. Par contre, dans l'environnement X-Window le processus fils peut être prévu pour commencer par créer sa propre fenêtre. Le père et le fils peuvent alors dialoguer avec l'utilisateur simultanément sans confusion. Imaginons, par exemple, que l'on veuille lancer un butineur comme Firefox. Si on se contente de taper la commande d'activation "firefox" la fenêtre dans laquelle on a lancé la commande se trouvera gelée. Le père est bloqué en attente de la fin de vie de son fils qui exécute firefox. Tant que ce processus existera il sera impossible de réutiliser cette première fenêtre.

On obéit au schéma décrit précédant . Par contre si on prend soin de taper la commande suivie de "&", la suite des actions est modifiée comme suit :

  1. création du processus fils comme auparavant
  2. Le père n'est pas bloqué : il exécute la suite du code et le prompt du shell réapparaît à l'écran.
  3. Parallèlement chargement du code du processus fils : une nouvelle fenêtre est créée par le code du navigateur et il affiche ses informations.
  4. Exécution parallèle des deux processus : on peut taper des commandes dans les fenêtres du père et du fils, et en voir le résultat.
  5. Lorsqu'on détruira le processus fils sa fenêtre disparaîtra.

concurrence père et fils

figure 3.13 - Modes de fonctionnement du père et du fils

La primitive exit termine la vie d'un processus: c'est donc la dernière instruction du code vue par un processus. La primitive wait indiquée dans la figure 3.13a place le père en attente jusqu'à la mort de son fils. Il ne reprendra son activité qu'après sa disparition.


Copyright Yves Epelboin, université P.M. Curie, 1998 MAJ 30 janvier, 2006

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