Les processus
Introduction aux processus
Un processus est un ensemble d'octets (en langage machine) en cours d'exécution, en d'autres termes, c'est l'exécution d'un programme. Un processus UNIX se décompose en :
- un espace d'adressage (visible par l'utilisateur / programmeur)
- Le bloc de contrôle du processus (BCP) lui-même décomposé en :
- une entrée dans la table des processus du noyau
struc procdéfinie dans<sys/proc.h> - une structure
struct userappeléezone udéfinie dans<sys/user.h>
- une entrée dans la table des processus du noyau
Le processus sous UNIX apportent :
- La multiplicité des exécutions, plusieurs processus peuvent être l'exécution d'un même programme
- La protection des exécutions, un processus ne peut exécuter que ses instructions propres et ce de façon séquentielle; il ne peut pas exécuter des instructions appartenant à un autre processus. Les processus sous UNIX communiquent entre eux et avec le reste du monde grâce aux appels système.
Création d'un processus - fork()
Sous UNIX la création de processus est réalisée par l'appel système int fork(void);. tous les processus sauf le processus d'identification 0, sont
créés par un appel à fork. Le processus qui appelle le fork est appelé
processus père. Le nouveau processus est appelé processus fils. Tout processus a
un seul processus père. Tout processus peut avoir zéro ou plusieurs processus
fils. Chaque processus est identifié par un numéro unique, son PID.

Le processus de PID 0 est créé "manuellement" au démarrage de la machine, ce
processus a toujours un rôle spécial pour le système, de plus pour le bon
fonctionnement des programmes utilisant fork() il faut que le PID zéro reste
toujours utilisé. Le processus zéro crée, grâce à un appel de fork, le
processus init de PID 1.
Le processus de PID 1 de nom init est l'ancêtre de tous les autres processus
(le processus 0 ne réalisant plus de fork()), c'est lui qui accueille tous les
processus orphelins de père (ceci a fin de collecter les informations à la mort
de chaque processus).
Format d'un fichier exécutable
Les compilateurs nous permettent de créer des fichiers exécutables. Ces fichiers ont le format suivant qui permet au noyau de les transformer en processus :
- Une en-tête qui décrit l'ensemble du fichier, ses attributs et sa carte des sections
- La taille à allouer pour les variables non initialisées
- Une section TEXT qui contient le code (en langage machine)
- Une section données (DATA) codée en langage machine qui contient les données initialisées
- Eventuellement d'autres sections : Table des symboles pour le débugger, Images, ICONS, Table des chaînes, etc
Chargement / changement d'un exécutable
L'appel système execve change l'exécutable du processus courant en chargeant
un nouvel exécutable. Les régions associée au processus sont préalablement
libérées : int execve(...);
Pour chaque section de l'exécutable une région en mémoire est allouée. Soit au moins les régions :
- le code
- les données initialisées
- des piles
- du tas
La région de la pile : C'est une pile de structure de pile qui sont empilées et
dépilées lors de l'appel ou le retour de fonction. Le pointeur de pile, un des
registres de l'unité centrale, indique la profondeur courante de la pile. Un
processus UNIX pouvant s'exécuter en deux modes (noyau, utilisateur), une pile
privée sera utilisée dans chaque mode. La pile noyau sera vide quand le
processus est en mode utilisateur. Le tas est une zone où est réalisée
l'allocation dynamique avec les fonctions Xalloc().
zone u et table des processus
Tous les processus sont associés à une entrée dans la table des processus qui
est interne au noyau. De plus, le noyau alloue pour chaque processus une
structure appelée zone u, qui contient des données privées du processus,
uniquement manipulables par le noyau. La table des processus nous permet
d'accéder à la table des régions par processus qui permet d'accéder à la table
des régions. Ce double niveau d'indirection permet de faire partager des
régions. Dans l'organisation avec une mémoire virtuelle, la table des régions
est matérialisée logiquement dans la table de pages. Les structures de régions
de la table des régions contiennent des informations sur le type, les droits
d'accès et la localisation (adresses en mémoire ou adresses sur disque) de la
région. Seule la zone u du processus courant est manipulable par le noyau, les
autres sont inaccessibles. L'adresse de la zone u est placée dans le mot
d'état du processus.
fork et exec
Quand un processus réalise un fork, le contenu de l'entrée de la table des
régions est dupliqué, chaque région est ensuite, en fonction de son type,
partagée ou copiée. Quand un processus réalise un exec, il y a libération des
régions et réallocation de nouvelles régions en fonction des valeurs définies
dans le nouvel exécutable
Le contexte d'un processus
Le contexte d'un processus est l'ensemble des données qui permettent de reprendre l'exécution d'un processus qui a été interrompu. Le contexte d'un processus est l'ensemble de :
- son état
- son mot d'état
- les valeurs des variables globales statiques ou dynamiques
- son entrée dans la table des processus
- sa zone u
- les piles user et system
- les zones de code et de données
Le noyau et ses variables ne font partie du contexte d'aucun processus ! L'exécution d'un processus se fait dans son contexte. Quand il y a un changement de processus courant, il y a réalisation d'une commutation de mode d'état et d'un changement de contexte. Le noyau s'exécute alors dans le nouveau contexte.