Un processus est une exécution d'un programme à un instant donné. Le programme lui-même est un objet inerte rangé sur disque sous forme d'un fichier ordinaire exécutable. Plusieurs caractéristiques sont associées à un processus, dont :
![]() | une identification ou Process IDentifier ou PID (entier) ; |
![]() | un propriétaire réel ou Real User IDentifier (entier) ; |
![]() | un propriétaire effectif ou Effective User IDentifier (entier) ; |
![]() | un groupe propriétaire réel ou Real Group IDentfifier (entier) ; |
![]() | un groupe propriétaire effectif ou Effective Group ID (entier) |
![]() | un terminal d'attachement (le terminal du login). |
Lors du lancement d'un processus, le programme qu'il doit exécuter est chargé en mémoire centrale en vue de son exécution.
Un processus système est un processus créé lors du lancement du système pour exécuter des tâches à l'intérieur du noyau :
![]() | Gestion des pages de mémoire, |
![]() | Transferts des processus suspendus sur disque ... |
![]() | créé lors du démarrage . |
Un démon est un processus chargé d'une tâche d'intérêt général :
![]() | Gestion d'impression, gestion réseau, gestion du courrier ... |
![]() | Il n'est pas attaché à un terminal. |
![]() | créés au démarrage ou par l'administrateur |
![]() | interrompus que par l'administrateur ou lors de l'arrêt du système . |
Un processus utilisateur est lancé par un utilisateur particulier depuis un terminal donné. Lors du login sur un terminal, un processus est lancé (shell en général , mais ce peut être un autre programme).
La mémoire allouée à un processus (ou image mémoire) est constitué à partir du fichier qui contient le programme.
C'est un espace d'adresses virtuelles (0 à 232 ) propre à chaque processus
Seules les parties utilisées correspondent a des zones de la mémoire physique. Des zones physiques peuvent être partagées.
![]() | la zone utilisateur : en zone système, contient les données de gestion du processus : tables des fichiers ouverts, paramètres des E/S ... |
![]() | le segment de texte contient la séquence d'instructions exécutée; |
![]() | la zone des données statiques (variables globales du programme, ...); |
![]() | la zone de données dynamique pour les objets non permanents. |
![]() | un tas pour les variables accédées par pointeurs. |
![]() | une pile pour les variables locales, les paramètres de fonctions, ...); |
Programmes généralement partageables :
![]() | si plusieurs utilisateurs demandent l'exécution d'un même programme, une seule copie du segment de texte du programme est placée en mémoire centrale, puis elle est partagée par les différents processus correspondants. |
![]() | programmes partageable généralement réentrants : |
![]() | le système affecte des zones mémoire propres pour les données de chacun d'eux => pas d'interférences entre les différentes exécutions d'un même programme. |
table des processus avec une entrée par processus
![]() | contient toutes les informations nécessaires pour que le système puisse gérer le processus lorsqu'il n'est pas actif. |
![]() | allouée lors de la création du proc. et libérée lorsqu'il se termine. |
![]() | Création par clonage d'un processus père qui utilise l'appel système fork(). |
![]() | Le processus fils est une copie exacte du processus père avec : |
![]() | le même programme mais |
![]() | des copies des données du père. |
Mécanisme de substitution :
![]() | on remplace l'image mémoire d'un processus par une nouvelle image construite à partir d'un fichier exécutable : |
![]() | nouveau programme et |
![]() | nouvelles données |
Mécanisme de suspension : permet d'attendre (la terminaison d'un fils).
De nombreuses primitives de gestion de processus peuvent être utilisées dans des programmes écrits en C sous UNIX.
int fork();
Crée un processus, le "fils", copie du processus appelant, le "père".
Le processus fils :
![]() | - exécute le même programme que le processus père; |
![]() | - utilise des copies des données du père; |
![]() | - mêmes fichiers ouverts que le père et mêmes pointeurs de position; |
![]() | - mêmes propriétaires réel et effectif que le père; |
![]() | - mêmes réactions aux signaux que le processus père; |
![]() | - même répertoire de travail que le père; |
![]() | - attaché au même terminal que le père; |
![]() | - identificateur de processus (PID) différent de celui du père. |
En cas de succès l'appel système fork renvoie 0 au processus fils, et renvoie le numéro du processus fils nouvellement créé au processus père.
Le processus fils commence son exécution en terminant la fonction fork
=> un seul processus (le père) commence l'exécution de fork,
=> deux processus (le père et le fils) terminent l'exécution de fork.
Une famille de primitives exec permettent le lancement de l'exécution par le processus appelant d'un nouveau programme
execl(char *ref, char *arg0, ..., char *argn, 0).
exit (int n);
Il n'y a pas de retour pour cet appel système.
.
int wait(int *n);
.
.
.
Avertir un processus qu'un événement important s'est produit
=> un processus peut réagir à cet événement sans être obligé de le tester
![]() | Mécanisme utilisé par le système pour informer les processus d'erreurs lors des appels systèmes ou d'une erreur d'instruction : overflow, adresse illégale, etc. |
![]() | Le signal est envoyé par la routine de traitement de l'exception causée par l'erreur. |
![]() | utilisés pour avertir un processus que l'utilisateur a frappé une touche du clavier du terminal auquel il est attaché. |
![]() | Tout processus peut envoyer un signal à un autre processus (moyennant certaines autorisations) par la fonction système kill. |
![]() | La réception d'un signal provoque le plus souvent la fin du processus qui le reçoit, sauf si installation préalable dune fonction de traitement par signal. |
nom numéro signification
SIGHUP 1 (hang up) émis à tous les processus associés à un terminal lorsque celui-ci se déconnecte.
SIGINT 2 (interrupt) signal d'interruption émis à tous les processusassociés à un terminal lorsque le caractère d'interruption (en général <CTRL-C>) est tapé.
SIGQUIT 3 (quit) signal d'interruption émis à tous les processus associés à un terminal lorsque le caractère pour quitter une application (en général <CTRL-\>) est tapé.
SIGILL 4 (illegal) émis en cas d'instruction illégale.
SIGTRAP 5 (trap) émis après chaque instruction en cas de traçage de processus.
SIGIOT 6 (input/output trap) émis en cas d'erreur matérielle.
SIGKILL 9 (kill) tue un processus, quel que soit son état.
SIGSEGV 11 (segmentation violation) émis en cas de violation de la segmentation mémoire.
SIGSYS 12 (system) émis en cas d'erreur de paramètre dans un appel système.
SIGPIPE 13 (pipe) émis en cas d'écriture sur un tube sans lecteur.
SIGALRM 14 (alarm) signal associé à une horloge.
SIGTERM 15 (termination) terminaison normale d'un processus.
* int kill(int pid, int sig);
Renvoie 0 en cas de succès et -1 sinon.
* int (*signal())(int sig, int *() fonction);
Renvoie l'adresse de la fonction de traitement précédemment utilisée en cas de succès et -1 en cas d'échec.
Le programme suivant met en place un traitement pour les signaux SIGINT et SIGQUIT, puis se suspend pendant 120s avant de se terminer. Il réagit aux signaux SIGINT et SIGQUIT mais ne meurt pas .
* int pause();
* int alarm (int sec);
FIN