“ Programmation Système
”
2- Processus
Pr. Abdelhay HAQIQ (ahaqiq@[Link])
2
Définition des processus
Entité dynamique représentant l'exécution d'un programme sur un
processeur
Du point de vue du système :
Espace d'adressage (mémoire, contient données + code)
Etat interne (compteur d'exécution, fichiers ouverts, etc.)
Un même programme lancé deux fois génère deux processus différents. Un
processus peut créer d’autres processus, on les appelle ses « fils ».
Un processus est identifié en mémoire par un numéro unique défini par le
système d’exploitation appelé le PID (Processus IDentifier).
Pr. Abdelhay HAQIQ ESI Programmation Système
3
Programme vs Processus
Programme :
Code + données (passif)
Processus :
Programme en cours d’exécution
Pr. Abdelhay HAQIQ ESI Programmation Système
4
Etats d'un processus
Initialement, un processus est à l’état prêt. Il passe à l’état en cours d’exécution,
lorsque le processeur entame son exécution.
Un processus passe de l’état en cours d’exécution à l’état prêt, lorsqu’il est
suspendu provisoirement afin de permettre l’exécution d’un autre processus.
Un processus passe de l’état en cours d’exécution à l’état bloqué, lorsqu’il est
attendu d’un événement de l’E/S. Lorsque l’événement survient, il passe à l’état
prêt.
En plus des trois états principaux, le processus peut se trouver dans l’un des états
suivants :
Stopped: N’utilise pas le CPU, mais il consomme la RAM.
Zombie: processus qui a été achevé, mais il consomme des ressources.
Pr. Abdelhay HAQIQ ESI Programmation Système
5
Etats d'un processus
Pr. Abdelhay HAQIQ ESI Programmation Système
6
Processus
Processus père et processus fils: le processus fils est un processus qui a été créé
par un autre processus qui prend le nom de processus père.
Il est possible de distinguer deux types de processus: les processus système et les
processus utilisateurs:
Les processus système (daemons: ils ne sont sous le contrôle d’aucun terminal
et ont propriétaire l’administrateur du système. Ils assurent des tâches d’ordre
général et ne sont d’habitude stoppés qu’à l’arrêt du système d’exploitation.
Exemple: init (le processus numéro 1)
Les processus utilisateurs: ils correspondant à chaque exécution d’un
programme par l’utilisateur.
Pr. Abdelhay HAQIQ ESI Programmation Système
7
Création d’un processus
Les processus des utilisateurs sont lancés par un
interprète de commande (shell). Ils peuvent eux
même lancer ensuite d’autres processus
Ces processus doivent ensuite pouvoir
communiquer entre eux
Le processus créateur = le père
Les processus crées = les fils
Les processus peuvent se structurer sous la forme
d’une arborescence
Pr. Abdelhay HAQIQ ESI Programmation Système
8
Arbre des processus d'un système Unix
$ pstree
Pr. Abdelhay HAQIQ ESI Programmation Système
9
Destruction d’un processus
3 possibilités pour l’arrêt d’un processus
Normal : par lui même en ayant terminé ses opérations
Autorisé : par son père qui exécute une commande appropriée
Anormal : par le système
temps d’exécution dépassé
mémoire demandée non disponible
instruction invalide
etc.
Le processus créateur est le seul à pouvoir exécuter l’arrêt de ses fils
Dans plusieurs systèmes, la destruction d’un processus père entraîne la destruction de tous
ses fils
Pr. Abdelhay HAQIQ ESI Programmation Système
10
Mise en œuvre
Pour mettre en œuvre le modèle des processus, le système d’exploitation construit une
table, appelé table des processus, dont chaque entrée correspond à un processus
particulier
Chaque entrée comporte des informations sur:
l’état du processus
son compteur ordinal : contient l’adresse de la prochaine instruction à extraire de la
mémoire
son pointeur de pile : contient l’adresse courante du sommet de pile en mémoire
son allocation mémoire
l’état de ses fichiers ouverts
tous ce qui peut être sauvegardé lorsqu’un processus passe de l’état élu à l’état prêt
Pr. Abdelhay HAQIQ ESI Programmation Système
11
Structure d’un processus
L’environnement d’un processus comprend :
un numéro d’identification unique appelé PID(Process IDentifier)
le numéro d’identification de l’utilisateur qui a lancé ce processus, appelé UID(User
IDentifier), et le numéro du groupe auquel appartient cet utilisateur, appelé GID(Group
IDentifier)
le répertoire courant
les fichiers ouverts par ce processus
le masque de création de fichier, appelé umask
la taille maximale des fichiers que ce processus peut créer, appelé ulimit
la priorité
les temps d’exécution
le terminal de contrôle, c’est à dire le terminal à partir duquel la commande a été lancée,
appelé TTY
Pr. Abdelhay HAQIQ ESI Programmation Système
12
Un exemple : schéma d’un processus Unix
Ce processus a le numéro 36.
Il a été lancé par l’utilisateur qui a 106 pour UID.
Il est en train d’exécuter le programme ‘cmd1’.
Il a consommé 0.3 seconde, avec une priorité de 19.
Son masque de création est 027.
Son terminal de contrôle est /dev/term/c4.
Son répertoire courant est /usr/c1.
Il a 4 fichiers ouverts : 0, 1, 2, et 3.
Pr. Abdelhay HAQIQ ESI Programmation Système
13
Structure d’un processus Unix
Le PPID est le PID du processus père
Le processus fils hérite de tout
l’environnement du processus père,
sauf bien sûr du PID, du PPID et des
temps d’exécution
Le père du processus 36 est le
processus 27, et celui de 27 est le
processus 1
Seul le fils 36 a ouvert le fichier
/tmp/toto
Pr. Abdelhay HAQIQ ESI Programmation
Système
14
Les processus : la commande ps
La commande ps donne un ensemble de renseignements sur les processus en court
d’exécution
Syntaxe : ps options
Options :
-a: affiche des renseignement sur tous les processus attachés à un terminal
-l: donne, pour chaque processus, le nom de l’utilisateur (user), le pourcentage de cpu
(%cpu), la taille totale du processus dans la mémoire (size), la mémoire réservée (rss)
en Ko …
-x: affiche également des informations sur les processus non liés au terminal
-w: affiche sur 132 colonnes, utile pour voir le nom complet de la commande associée
à chaque processus
Pr. Abdelhay HAQIQ ESI Programmation Système
15
Les processus : la commande ps
$ ps man
Pr. Abdelhay HAQIQ ESI Programmation Système
16
Les processus : la commande ps
PID : le numéro d’identification du processus
TTY : le terminal depuis lequel le processus a été
lancé $ ps
STAT : l’état du processus au moment du
lancement de la commande
R : le processus est en cours d’exécution
T : le processus est stoppé
S : le processus dort depuis moins de 20
secondes
Z : le processus en attente d’un message du
noyau (zombie)
TIME : le temps d ’exécution de la commande
CMD : le libellé de la commande lancée
Pr. Abdelhay HAQIQ ESI Programmation
Système
17
Arrêt d’un processus : kill
La commande kill permet d’envoyer un signal au processus
Syntaxes :
kill -signal pid
kill -l
Options :
-9: demande l’arrêt du processus désigné par son pid
-l: affiche la liste des signaux disponibles
$ kill -l
1) HUP 2) INT 3) QUIT …
7) EMT 8) FPE 9) KILL …
$ kill -9 1635
Cette commande tue le processus dont le numéro PID est 1635
Pr. Abdelhay HAQIQ ESI Programmation Système
18
Les signaux
Chaque processus peut recevoir des
signaux
Chaque signal a une signification
particulière
Pour envoyer un signal on utilise la
commande kill
Exemple kill -9 2345
Pr. Abdelhay HAQIQ ESI Programmation
Système
19
Clonage de processus
Appel système fork()
#include <unistd.h>
pid_t fork();
duplique le processus courant
retourne le pid du processus fils créé dans le processus père
retourne 0 dans le processus fils
retourne -1 en cas d’erreur
Pr. Abdelhay HAQIQ ESI Programmation Système
20
Récupérer des informations
#include <unistd.h>
getpid(); retourne le PID du processus appelant
getppid(); retourne le PID du père de processus
getgid(); retourne le GID réel du processus appelant.
getpgid(); renvoie l'ID du groupe de processus auquel appartient le
processus indiqué par pid. Si pid vaut zéro, le PID du processus
appelant est utilisé.
Pr. Abdelhay HAQIQ ESI Programmation Système
21
exit()
La primitive exit() est une fonction qui ne retourne aucune valeur, puisqu’elle
termine le processus qui l’appelle
#include <stdlib.h>
void exit(int status)
L’argument status est un entier qui indique au shell (ou au père de façon
générale) qu’une erreur s’est produite. On laisse à zéro pour indiquer une fin
normale
Pr. Abdelhay HAQIQ ESI Programmation Système
22
sleep()
La primitive sleep() bloque le processus durant le nombre de secondes
spécifié, sauf s’il reçoit entre temps un signal.
#include <unistd.h>
int sleep(int secondes)
Pr. Abdelhay HAQIQ ESI Programmation Système
23
Wait()
La primitive wait() permet de récupérer les informations de terminaison et de
supprimer les processus zombie.
Si l'appelant possède au moins un fils non zombie l'appel est bloquant
Si l'appelant ne possède aucun fils (ni en exécution ni zombie) le retour
est immédiat et vaut –1
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int * status);
Le retour est le PID du processus fils qui a été récupéré.
Pr. Abdelhay HAQIQ ESI Programmation Système
24
Clonage de processus : Fork()
Pr. Abdelhay HAQIQ ESI Programmation Système
#include <stdio.h> 25
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t mon_pid;
mon_pid = fork();
printf("%d ", mon_pid);
if (mon_pid) Fork()
printf("Je suis le père\n");
else
printf("Je suis le fils\n");
return 0;
}
Pr. Abdelhay HAQIQ ESI
ESI Programmation Système
#include <stdio.h>
#include
#include
<stdlib.h>
<unistd.h>
26
#include <errno.h>
int main()
{
pid_t status;
printf("debut\n");
status = fork();
switch (status)
{
case -1:
perror("Creation processus");
exit(EXIT_FAILURE); Exemple
case 0:
printf("[%d] fils\n", getpid());
break;
default:
printf("[%d] pere\n", getpid());
}
printf("[%d] fin\n", getpid());
exit(EXIT_SUCCESS);
}
Pr. Abdelhay HAQIQ ESI
ESI Programmation Système
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 27
#include <errno.h>
int main()
{
pid_t status;
printf("[%d] Je vais engendrer\n", getpid());
status = fork();
switch (status)
{
case -1:
perror("Creation processus");
exit(EXIT_FAILURE);
case 0:
Exemple
printf("[%d] Je viens de naitre\n", getpid());
printf("[%d] Mon pere est %d\n", getpid(), getppid());
break;
default:
printf("[%d] J’ai engendre\n", getpid());
printf("[%d] Mon fils est %d\n", getpid(), status);
}
printf("[%d] Je termine\n", getpid());
exit(EXIT_SUCCESS);
} ESI
Pr. Abdelhay HAQIQ ESI Programmation Système
28
switch(fork())
{
case -1: // Erreur
// Gestion de l'erreur
break;
case 0: // Fils
// Code du fils
/* Eventuellement "exit()" pour que le processus fils
se termine (impératif si le "fork()"
est dans une boucle)*/
Exemple
break;
default: // Père
// Code du père
}
Pr. Abdelhay HAQIQ ESI
ESI Programmation Système