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.
figure 3.12 - Création d'un processus
Le démarrage d'un nouveau processus passe donc par les étapes suivantes:
- création du nouveau processus au moyen de la fonction fork
- test pour distinguer le fils du père
- dans la branche suivie par le fils, chargement d'un nouveau code par la fonction exec ou une autre équivalente
- 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 :
- création d'un processus fils
- mise en attente du père (le shell de commande)
- chargement du code correspondant à ls dans le processus fils
- exécutiondestruction du processus fils à la fin de son travail
- 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 :
- création du processus fils comme auparavant
- Le père n'est pas bloqué : il exécute la suite du code et le prompt du shell réapparaît à l'écran.
- 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.
- 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.
- Lorsqu'on détruira le processus fils sa fenêtre disparaîtra.
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