Gestion des processus

Les bases

Un processus est un programme en cours d'exécution. Un processus peut générer plusieurs Threads (processus léger). Les Threads partagent le même espace mémoire alors que les processus ont un espace mémoire propre.

Les threads sont des exécutions de commande en parallèle pour le compte d'un même programme.

Un processus est caractérisé par :

  • le propriétaire (UID)
  • le numéro du processus (PID)
  • le numéro du processus père (PPID)
  • la priorité (PRI)
  • la valeur de NICE (NI)
  • l'état (STAT)
  • le nom du device vers lequel il est dirigé (TTY) : nom du fichier connecté à l'entrée standard.
  • le temps passé dans la cpu (TIME)
  • le nom de la commande exécutée (COMMAND)
  • Ces informations sont obtenues à l'aide de la commande ps.
ps -faxl

D'autres informations peuvent aussi apparaître

  • W : le processus a été swappé (le processus a été sorti de la RAM pour être enregistré sur le disque dans la partition de Swap ce qui arrive quand le processus dort depuis longtemps et que d'autres processus ont besoin de mémoire vive)
  • < : le processus possède une priorité haute
  • N : le processus possède une priorité basse
  • L : le processus possède des pages mémoires verrouillées (seuls certains comptes peuvent enregistrer des données dans la mémoire physique)
Les états des processus

Un processus passe par plusieurs états qui sont répertoriés sur le schéma suivant.

Les états d'un processus

Les états d'un processus sont :

  • D : le processus est ininterruptible (mode noyau)
  • R : le processus est en train de s'exécuter
  • S : le processus est endormi
  • T : le processus est stoppé
  • Z : le processus est zombi : il est mort mais son père ne le sait pas
Lancement d'un processus

Lorsque vous tapez une commande (par exemple ls), un processus fils est créé et cette commande s'exécute dans celui-ci. Le processus père attend la fin du processus fils pour se redevenir actif. Deux appels systèmes sont réalisés : fork pour créer un nouveau processus et exec pour exécuter la commande. Le diagramme ci-dessous illustre ce fonctionnement.

Création d'un processus fils pour exécuter une commande

Lorsqu'on appelle un script shell, on peut forcer l'exécution de ce script dans le shell courant en faisant précéder l'appel d'un point :

. ./script.ksh

Dans ce cas :

  • Si script.ksh contient un exit alors le shell courant meurt
  • Si script.ksh ne contient pas d'exit alors le shell courant ne meurt pas
Background et Foreground

Lorsque vous lancez une commande UNIX, vous ne récupérez la main que lorsque l'exécution de cette commande est terminée. Grâce au multi tâche, il est possible de faire exécuter celle-ci en tâche de fond et ainsi de récupérer le prompt immédiatement.

Pour cela, vous utiliserez le caractère & à la fin de la commande. Toutefois, il faudra dans ce cas rediriger la sortie standard dans un fichier :

find /home -name ".bash" profile > resultat.txt &

La commande jobs vous permet d'obtenir la liste des processus en tâche de fond. Il est possible de ramener un processus au premier plan en utilisant la commande fg.

On peut stopper un processus en tapant CTRL+Z ou utiliser la commande bg pour passer un job en background.

./process.ksh > resultat.txt &
jobs
  [1] + Running ./process.ksh > resultat.txt
fg %1

Le paramètre des commandes bg et fg est soit un PID soit un numéro retourné par la commande jobs. Dans ce dernier cas, le numéro sera précédé du symbole %.

Communication entre processus

Les signaux

Les processus communiquent par signaux, Pour obtenir la liste des signaux utiliser la commande kill -l.

Le tableau ci-dessous liste les principaux signaux que nous pouvons utiliser. La majorité des signaux est utilisée par le système d'exploitation uniquement.

SignalDescription
HUPhangup : envoie un signal de réinitialisation
INTInterruption (Ctrl+C)
QUITCore dump : génère un fichier core.
KILLarrête le programme immédiatement
SYSUn mauvais argument est passé en paramètre
TERMEnvoie un signal au programme pour le terminer
CHLD/CLDchild : signal envoyé par un programme lorsqu'un processus fils est achevé
PWRpower : le système subit un problème d'alimentation
STOPsignal demandant au programme de se suspendre
TSTPtty stop : signal envoyé au programme lorsqu'un terminal suspend ses requêtes (CTRL+Z)
CONTRedémarre un programme suspendu par STOP
TTINLe programme tente de lire tty alors qu'il est en arrière-plan
TTOULe programme tente d'écrire sur tty alors qu'il est en arrière-plan

Envoyer un signal à un processus

Pour envoyer un signal, on utilise la commande kill :

kill -codeProcessus pid|codejob

Intercepter un signal

La commande trap permet dans un script d'ignorer un signal ou bien d'effectuer un traitement particulier a la réception du signal.

trap 'instructions' codes
CommandeAction
trap '' 2Ignore le signal 2
trap 2Restaure le traitement par défaut
trapListe les signaux piégés
trap 'echo bonjour' 2Exécute "echo bonjour" à la réception du signal 2

Communication père-fils

Dans un script, chaque commende que l'on tape créé un processus fils. La gestion des processus fils peut être intéressante dans le cas où on appelle un autre script qu'on lance en arrière plan.

A l'aide des variables suivantes, on peut facilement communiquer d'un processus père vers un processus fils et inversement :

  • la variable $! contient le pid du dernier processus fils lancée
  • La variable $$ contient le pid du processus courant
  • La variable $PPID contient le pid du processus père.

Attendre la fin d'un processus

Pour attendre la fin d'un processus, on utilise la commande wait qui prend en paramètre le pid du processus à attendre :

sleep 15 &
wait $!