Les processus se créent par ``mitose'' à partir d'un processus
donné. Soit un processus A implémentant un programme P1. Ce
processus possède une zone de code, une zone de données, ainsi
qu'une zone de pile. Par ailleurs, une structure Ua lui est
associée. Pour créer un nouveau processus, il suffit que le
processus A fasse appel à l'appel système fork(). Dans ce
cas, le système recopie le code, les données et la pile du process
A, alloue une nouvelle place dans la table des processus à laquelle
correspond le numéro du nouveau processus B créé. Par ailleurs,
la structure U est presque entièrement conservée à l'exception
des données propres au nouveau processus (N du processus).
Le processus qui a lancé la commande fork est appelé processus père, le processus créé est le processus fils. Après appel du fork, le processus père peut récupérer le numéro de PID de son fils et le fils, peut récupérer le numéro de PID de son père par la commande getppid(). Grâce à la valeur retournée par le fork (numéro du PID du fils dans le père, 0 dans le fils), il est possible de savoir quel processus est actif et par conséquent, d'exécuter le code propre au processus. Cependant, cela demande de dupliquer une partie de code (code du fils dans le père et vice-versa). Il est alors possible de remplacer les segments de code, de données et de pile du fils par un autre programme grâce à la commande exec.
En fonctionnement normal, lorsqu'un processus lance un processus fils, il continue de s'exécuter, puis se met à attendre la mort de ce processus fils grâce à la commande wait(&status). Il existe alors deux modes de fonctionnement :
Pour résumer, les différents états d'un processus sont les suivants :
Cependant, il est par ailleurs nécessaire de considérer que les processus ne sont pas tous chargés en zone mémoire et peuvent être swappés sur le disque. Dans ce cas, le graphe des status possibles d'un processus se complexifie et ressemble à celui dessiné figure 5