Vous êtes sur la page 1sur 32

Chapitre 4: Gestion des processus

Version Octobre 2012 N°185

Plan de travail
‰ Qu'est-ce qu'un processus ?
concept, identification
‰ Création de processus
‰ Description d'un processus
‰ Environnement d’un processus
‰ Terminaison d’un processus
‰ Information sur un processus (état…)
‰ Chargement d’un processus

1
Version Octobre 2012 N°186

Qu'est-ce qu'un processus: Définitions

‰ Instruction = indécomposable
p et indivisible
‰ Processeur = ...
‰ Processus = suite temporelle d'exécutions d'instructions
‰ Processus = exécution d'un programme (instructions +
données)
‰ Processus = entité dynamique
(création --> disparition)

Version Octobre 2012 N°187

Les processus (système temps partagé)


Un processeur

Activation: chaque appel système ou interruption


‰Ordonnanceur : un processus ⇒ un coût
‰Nécessité d’avoir des opérations atomique (appels systèmes)

2
Version Octobre 2012 N°188

Les processus (système temps partagé)


Plusieurs processeurs ( n ?)

‰Ordonnanceur : un processus ⇒ un coût


‰Nécessité d’avoir des opérations atomique (appels systèmes)

Version Octobre 2012 N°189

Notion de processus UNIX (1)


‰Approche intuitive
UN = systè
‰UNIX systèmee "temps
te ps pa
partagé“
tagé
‰Plusieurs processus en même temps
‰Un seul processus actif
‰Attente des autres (dans/hors mémoire)

‰Contenu d'un processus


‰Code Le nécessaire pour ll'exécution
exécution
‰Données et la reprise d'exécution
‰Valeur des registres généraux
‰État des fichiers ouverts
‰Répertoire courant
‰...

3
Version Octobre 2012 N°190

Notion de processus UNIX (2)


‰Processus (quelques centaines / machine)
‰Associé à un utilisateur
‰Sur une seule machine ou distribué sur le réseau
‰Compétition entre processus
‰Variété de mécanismes de communication / synchron.
‰Ordonnanceur: mode privilégié, dans le noyau

‰Sous processus (Threads – quelques milliers /


‰Sous-processus
machine)
‰Partage données, code, M.V. mais ¬ pile exécution
‰Même utilisateur, même machine
‰Très peu d’infos, peu de compétition,
‰ Ordonnanceur: simple, mode utilisateur

Version Octobre 2012 N°191

Identification d’un processus


Proc. utilisateur Process Identifier :
Démons q
‰ unique
0 PID ‰ généré
1
2

50 Processus P init :
… ‰ exécute /etc/rc. (initial.)
200 ‰ gère mono ou multi

pid ‰ processus privilégié

4
Version Octobre 2012 N°192

Contexte d'un processus:


Notion de région (1)
Pile Noyau

Table Régions Zone Utilisateur


Fich. ouverts
rw 4K
Rép.courant

Rép. racine
x 10K
rw 20K

données p ée
privée

code partagée

pile privée

Table Régions

Version Octobre 2012 N°193

Contexte d'un processus:


Notion de région (2)
‰Structure
o teu : inode
‰Pointeur: ode du fichier
c e assoc
associé
é
‰Type: code, pile, données privées, partagées
‰Taille
‰Localisation (mémoire physique)
‰Etat: Fonction (verrouillée, demandée, en
chargement, valide)
‰Compteur: nombre de processus qui la référence
‰Opérations
‰Allocation/libération
‰(Dé)Verrouillage
‰Attacher/détacher une région
‰... Î Exemple: voir appels systèmes exec, sbrk

5
Version Octobre 2012 N°194

Contexte d'un processus :


Autres éléments (1)
‰Contenu (régions) :
‰Code du programme
‰Données
‰Pile utilisateur du processus
‰Mémoire partagée
‰Quelques éléments :
‰Compteur ordinal: adresse virtuelle
‰R i t d'ét
‰Registre d'étatt processeur
‰Elément de la table des processus
Î Etat + contrôle général du processus
‰Correspondance des adresses
Î virtuelle / physique

Version Octobre 2012 N°195

Contexte d'un processus :


Autres éléments (2)
‰Quelques éléments (suite)
épe to es: courant,
‰Répertoires: cou a t, racine
ac e
‰Table des descripteurs
‰Pointeur (table des processus)
‰Identificateurs de l'utilisateur
‰Compteurs de temps
‰Tableau de réaction aux signaux
ÆVoir cours gestion des signaux
‰Terminal de connexion éventuel (voir ps)
‰Champs: erreur, valeur de retour appels systèmes
‰Champs limites: taille processus, ...
‰Modes de permission (voir umask)
‰Paramètres E/S: volume, adresse, ...

6
Version Octobre 2012 N°196

Intégration dans le système:


Table des processus (1)
Pile Noyau

Zone Utilisateur
P
Processus 1
Fich. ouverts
Rép.courant

Rép. racine

Données 1
Code 1

Processus 2 Pile 1


Processus 1 Données 2


Table des Régions
Table des Processus (TdP)

Pages Mémoires

Version Octobre 2012 N°197

Intégration dans le système:


Table des processus (2)
‰Contenu d'un élément
‰Etat d'un processus
p
‰Localisation de la zone U
Æ Mémoire principale/secondaire
‰Identificateurs d'utilisateur
Æ Voir gestion des signaux
‰Identificateurs de processus
Æ Lien de parenté
‰Evènement ayant provoqué le sommeil (sleep)
‰Paramètres d'ordonnancement
Æ Ordre d'exécution
‰Signaux envoyés au processus (non traités)
‰Paramètres de calcul de priorité
Æ Temps d'exécution, ...

7
Version Octobre 2012 N°198

Intégration dans le système:


Entrée-sortie
Pile Noyau

Données Table Régions Zone Utilisateur


Fich. ouverts

Rép.courant

Rép. racine
Pile Utilisateur

Table des Inodes Table des Fichiers

Version Octobre 2012 N°200

Etats d'un processus


1 7
Execution (mode utilisateur) Preempte
Retour Appel systeme Preemption
ou interruption
Interruption est-equivalent
2
Execution (mode noyau) Reordonnancement
processus
"exit"
S'endort
3
Pret a s'executer (en memoire)
9
zombie
Reveil
4
Endormi (en memoire) Assez de memoire

Transfert
f Transfert

6 8
Endormi (hors memoire) Creation

Manque de memoire
Reveil (swapping ?)

5
Pret a s'executer (hors memoire)

8
Version Octobre 2012 N°201

Changements d'états d'un processus

‰Processus en attente:
‰Etats: endormi-en-mémoire,
endormi-en-mémoire endormi-transféré
‰Réveil (changement d'état): par interruption
‰Préemption:
‰Mode utilisateur: oui
‰Mode noyau: Oui si se termine
‰Exécution d
d'une
une interruption:
passage en mode noyau
‰Prêt à s'exécuter en mémoire
‰Ordonnanceur / horloge
‰Gestion des priorités

Version Octobre 2012 N°202

Ordonnancement des processus:


principes de base (1)
Politique générale
‰ Sélection de l'élu:
{préempté, en mémoire, prêt s'exécuter}
‰ Plus haute priorité ou Maxtemps (prêt s'exécuter)
‰ Changement de processus:
dépassement du quantum de temps
‰ Re-évaluation de la priorité:
‰mode noyau Æ mode utilisateur
‰mode noyau Æ endormi-en-mémoire
‰réajustement périodique: {prêt s'exécuter}
Î Gestion des changements d'états

9
Version Octobre 2012 N°203

Ordonnancement des processus:


principes de base (2)
‰Calcul de la priorité
‰Calcul du temps utilisé en exécution
‰Recalcul de la priorité:
Î Changement de files de priorité
‰Paramètres:
‰Priorité dynamique :
‰Le moins récemment “en exécution”
‰Raison de ll'attente
attente
‰Priorité statique (nice)

‰En pratique
‰Programme interactif: plus prioritaire
‰U.C. récemment utilisé: moins prioritaire

Version Octobre 2012 N°204

Utilisateurs et groupes
effectifs/réels
‰Le bit SETUID
‰Structure p processus: utilisateur effectif/réel
‰l'utilisateur associé au login (réel)
‰avec les droits d'un utilisateur donné (effectif)
‰chmod : chmod u+s fichier (fichier exécutable)
‰exemple: commande passwd
Æ idem pour le groupe
‰Utili ti d
‰Utilisation des groupes secondaires
d i
‰ groupe primaire/standard vs groupes
secondaires
‰ newgrp : prend le groupe passé en paramètre
‰ Vérification des droits (groupe secondaire ?)
‰ Fichier /etc/group

10
Version Octobre 2012 N°206

Norme POSIX
Routine Description
pid = fork () Création fils
e = waitpid (pid,&etat,opts) Attendre fils
e = execve (nom,argv,envp) Remp. image
exit (etat) Term. process.
e = sigaction (sig,&act,&oact) Spécif. action
e = kill (pid, sig) Envoi signal
residuel = alarm (seconde) Prog. SIG...
pause() Susp. process.

Version Octobre 2012 N°207

Processus et Windows
(sous-système POSIX)
Norme POSIX 1 :
• Contrôle de processus
• Communication inter-processus
• Entrées/sorties « caractères »
•… Services Windows
pour UNIX
Ne contient pas : • 2000 fonctions
• création
é i de d processus léger,
lé • 300 utilitaires
• création de fenêtre
• « RPC » et « sockets » Pas d’accès aux
•… fonctions de Windows

11
Version Octobre 2012 N°209

Création d’un processus (1)

Partage :
‰ code
‰ mém. read_only

Duplication :
‰ information
‰ données

‰ Nouveau pid, nouvelle entrée dans la TdP


‰ « héritage » d’informations
‰ Qui s’exécute? Quand? À partir d’où?

Version Octobre 2012 N°210

Création de processus (2)


PID: 5300
main()
{

res=fork()

}

0 PID: 5309
main()
{
34 …
“jean” res: 5309 res=fork()

}

34
res: 0
“jean”

12
Version Octobre 2012 N°211

Création de processus (3)


‰ Appel système fork
‰Deux pprocessus identiques
q
‰Deux processus indépendants
‰Exécution des processus: voir ordonnanceur
‰Duplication vs partage

‰ Informations dupliquées
‰Table des descripteurs
‰Buffers
‰Curseur d'exécution
‰Variables globales
‰...

Version Octobre 2012 N°212

État des tables après un fork


O_RDONLY 2
1
Position : 2 /etc/bashrc
Processus père

État : N° inode :
0 Nombre : Nb. copies :
1 I d Infos
Inode I f …

2

Position :
3 État :
O_RDWR
1
4 Nombre : 1
2 /.bashrc
5

N° inode :
… Nb. copies :
Position :
État : O_WRONLY Inode Infos …
Nombre : 12
Processus filss

0
1
2
3
4
5

Espace utilisateur Table fichiers Table inodes

13
Version Octobre 2012 N°213

fork et les structures internes


Pile Noyau
PROC. PARENT

Données Table Régions Zone Utilisateur


Fich. ouverts

Rép.courant

Rép. racine
Pile Utilisateur

Table des Inodes

Code Partagé Table des Fichiers

Pile Noyau
PROC. FILS

Données Table Régions Zone Utilisateur


Fich. ouverts
Rép.courant

Rép. racine

Pile Utilisateur

Version Octobre 2012 N°214

fork: exemple simple


#include <sys/types.h>
int main () {
int pid;
...
if ( (pid = fork ()) < 0) erreur;
if (pid == 0)
/* Traitement fils */
else
/* Traitement père */
}

14
Version Octobre 2012 N°215

fork: 2ème exemple (1)

Version Octobre 2012 N°216

fork: 2ème exemple (2)

15
Version Octobre 2012 N°217

fork: 2ème exemple (exécution)

stdout associé :
‰ terminal
‰ fic. disque

Moment de la
Synchronisation?

Version Octobre 2012 N°218

Information d’un processus (1)

Processus P

RUID RGID Répertoire


EUID EGID courant
N° groupe
processus SUID SGID Répertoire
PGID WD initial
Terminal de
TC HD
Contrôle? umask
SI FCM
N° Session ESGID … signaux

Autre N° groupe

16
Version Octobre 2012 N°219

Information d’un processus (2)

Hérité Non hérité


‰ TDF ‰ PID
‰« close-on-exec » ‰ PPID
‰ espace mémoire ‰ temps calcul
‰Pile exécution ‰ signaux et alarmes
‰Code ‰ verrous
‰Données statiques ‰ code retour fork
‰Tas
‰Variables environnement Efficacité?
‰ mémoires partagées ‰ vfork (partage)
‰ limites de ressource ‰ copy on write
‰ sauvegarde des registres

Version Octobre 2012 N°220

Obtenir les Informations du processus

‰ PID du processus
‰ PID du père
‰ Propriétaire du processus
‰ Groupe du processus
Réel ou effectif

17
Version Octobre 2012 N°221

Modifier les Informations du processus


User pour
R,E,S
Group pour
R,E,S
User:R,E
Group:R,E

U
User:E
E

Group:E

‰ Rappel: Forte dépendance OS


‰ PID et PPID: non modifiable

Version Octobre 2012 N°222

Terminaison d’un processus


Normale vs anormale

main
i { main
i {
… P … Si non ignorée
P
exit(int) abort()
Ou return
} }
implicite?

exit(3) = _exit(2) SIGABRT


+ vidage
id b
buffer
ff E/S main {
P signaux
… SIGKILL…
_exit(2) = }
ferm. desc. fic. abort(3) =
+ code retour ferm. desc. fic.
+ SIGCHLD + « dump »

18
Version Octobre 2012 N°223

Etat d’un processus


0 = vrai : OK
Table des Processus >0 = faux = KO

Processus p …
1 2 16

int macro (status)


‰ WIFEXITED + WEXITSTATUS
Et la commande ps ? ‰ WIFSIGNALED + WTERMSIG
‰ WIFSTOPPED + WSTOSIG
‰ un code de retour (exit) - terminaison normale
‰ le numéro du signal - terminaison anormale
‰ le numéro du signal - arrêt provisoire (stop)
‰ un indicateur si fichier core (dump)
Terminaison vs stop Libération ressources ou possib. SIGCONT

Version Octobre 2012 N°224

Après la mort d’un processus?

Table des Processus Zombie


9Descripteur
Processus fils 9État
9¬mémoire
Processus père
9¬ressource

‰ Le père est alerté par un signal SIGCHLD


‰ L’entrée disparait quand le père à récupéré l’état (wait)
Orphelin: et si le père meurt avant…
‰ init (éternel) adopte le processus fils
‰ init fera le wait… Reconnaître un orphelin?

19
Version Octobre 2012 N°225

wait: Synchronisation père/fils

Pour
recevoir
l’état

Quel fils ?

‰ Processus s'endort – Et si déjà un zombie?


‰ Mort d'un fils: signal SIGCHILD
‰ Réveil du père
‰ Lien de parenté: groupe de processus Æ voir signaux
‰ Autres: wait, waitpid, wait3, wait4

Version Octobre 2012 N°226

wait: exemple simple (1)


#include <sys/types.h>
int main () {
int pid, tmp;
...
if ( (pid = fork ()) < 0) erreur;
if (pid == 0)
/* Traitement fils */
else {
/* Traitement p père */ Informations
tmp = wait (0) possible
}

Utilisation: synchronisation entre le père et n fils


n = 1: tmp = P.I.D. du fils
n > 1: tmp = P.I.D. d'un fils

20
Version Octobre 2012 N°227

wait: exemple simple (2)

#include <signal.h>
int main () {
int pid, res, etat;
if ( (pid = fork()) == 0) {
...
exit (1)
}
else
res = wait (&etat);
...
}
Etat du processus

Version Octobre 2012 N°228

waitpid: Synchronisation père/fils


l’état

‰ < -1
1 : processus de ce groupe
‰ = -1 : ∀ processus fils
‰ = 0 : processus du groupe
‰ rien: blocage normal
‰ = > 0 : ce processus
‰ WNOHANG: pas de blocage
‰ WUNTRACED : processus
stoppés non interrogés

21
Version Octobre 2012 N°229

waitpid: exemple simple

#include <signal.h>
int main () {
int pid, res, etat;
if ( (pid = fork()) == 0) {
...
exit (1)
}
else
if (waitpid(pid, &etat, WNOHANG) == -1)
printf(« le processus fils n’est pas terminé »);
...
}

Version Octobre 2012 N°230

Wait3/4: Synchronisation père/fils

9 temps
9 mémoire
9 nb swap
9 nb signaux
9 …

‰ ≈ waitpid + ressources utilisées ( voir getrusage(2) )


‰ processus stoppé ou terminé

22
Version Octobre 2012 N°231

Evaluer le temps d’exécution (1)


pulsations
d’horloge
(sysconf)

Programme
vs
Appels syst.

l ti
cumulation

time (shell - options) :


9 temps total = temps réel de times
9 temps user = tms_utime + tms_cutime
9 temps system = tms_stime + tms_cstime

Version Octobre 2012 N°232

Evaluer le temps d’exécution (2)

9 temps total = temps user + temps system + autre temps


9 autre temps = temps E/S + temps pour autres processus

23
Version Octobre 2012 N°233

Evaluer le temps d’exécution (3)

Nb puls. / sec

Evaluer un temps de calcul en secondes :


temps « réel » et « user »

Version Octobre 2012 N°234

Exécution d'un nouveau code:


PID: 5300
main()
{ Données (Avant)

err=execve(…) Code (Avant)

}
Pile (Avant)
0

34
“jean” err:
Table des Régions

PID: 5300
Pile (Après)
main()
{ Données (Avant)

… Code (Avant)

} Données (Après)

0 Pile (Avant)

34 Code (Après)
“jean” argv:

Table des Régions

24
Version Octobre 2012 N°235

execve: exécution d’un nouveau code

L’exécutable

Arguments
effectifs

Variables
d’environnement

envp[i] = nom=valeur\0
‰ chemin relatif ou absolu
‰ chaque argument termine par \0
‰ Dernier élément des tableaux est NULL
‰ Rappel: argv[0] = nom point d’entrée

Version Octobre 2012 N°236

Exécution d'un nouveau code (1)


‰ Appels systèmes et routines exec
‰un appel système: execve
‰Une famille de routines C
‰ Æ execp, execvp, execl, execlp, execle
‰Les structures argv, argc, envp
‰La variable PATH ou chemin absolu/relatif

‰ Principales
P i i l actions
ti
‰Sauvegarde paramètres de exec
‰Désallocation des régions
‰Chargement éventuel de l'inode et du contenu
‰Allocation des nouvelles régions

25
Version Octobre 2012 N°237

Exécution d'un nouveau code (2)


‰ Principales actions (suite)
‰Zone utilisateur:
‰Descripteurs non modifiés : 0, 1, 2
‰Autres descripteurs fermés
‰Effacement de la capture des signaux
Æ voir cours sur les signaux
‰Curseur: au départ
‰Chargement exécutable

Î Remplacement par nouveau code + exécution

Si FD_CLOEXEC est positionné (fcntl) ⇒ descripteur fermé

Version Octobre 2012 N°238

execve et les structures internes


PID: 5300
Pile (Ap)
main()
{ Données (Av)

… Code (Av)

} Données (Ap)

0 Pile (Av)
x
34 Code (Ap)
“jean” argv:

Table des Régions

Table des Fichiers ouverts Table des Inodes

/dev/sda1
tampon /bin/ls

: Instant t+1

26
Version Octobre 2012 N°239

exec(ve): exemple simple


#include <sys/types.h>
int main ((int argc,
g char* argv[],
g [] char* envp[])
p[])
{
int pid, tmp;
...
argv[0] = “ ls ”;
argv[1] = “ -l “;
argv[2] = NULL;
execve ("/bin/ls", argv, envp)
} (char* 0)
execlp (“ls”, “ls”, “-l”, NULL)
execl (“/bin/ls”, “ls”, “-l”, NULL)

execle (“/bin/ls”, “ls”, “-l”, NULL, envp)

Version Octobre 2012 N°240

exec: exemple simple d'utilisation


#include <sys/types.h> Modif poss. si S_ISUID / S_ISGID :
int main () 9 EUID , EGID
9 SUID, SGID
{ int pid, tmp;
9 pas RUID , RGID
...
if ( (pid = fork ()) < 0) erreur;
if (pid == 0)
/* Traitement fils */
execve (("/bin/ls",
/ / , argv, g , envp)
p)
printf(“Erreur…”);
else {
/* Traitement père */
tmp = wait (0)
}
}

27
Version Octobre 2012 N°241

Fonctionnement du shell
Interprétation d'une commande
‰ Analyse syntaxique
‰ Substitutions Variables d’environnement
‰ Exécution: et exportation :
‰Création d'un shell fils . commande = modif. possib.
commande = ¬ modification
‰Processus fils:
‰Redirections et aboutements
‰Application de exec
‰Processus père:
‰Arrière plan vs premier plan
‰Attente d'un signal (wait)

Version Octobre 2012 N°242

Fonctionnement du shell
#include <sys/types.h>
int main () {
int pid, tmp, status;
...
if ( (pid = fork ()) < 0) erreur;
if (pid == 0)
/* Traitement fils */
execve (commande analysée, argv, envp)
else {
/* Traitement père */ WEXITSTATUS(status)
res = wait (&status) code de retour exit()
/* traitement de status */
}…}
Î Exécution en premier plan
Î Et en arrière plan ?

28
Version Octobre 2012 N°243

Ouverture d'une session (attente)

ROOT
PID = 1 INIT

fork
fork fork

INIT INIT ...... INIT

exec exec exec

GETTY GETTY GETTY

Version Octobre 2012 N°244

Ouverture d'une session (En cours)

PID = 1 INIT

fork
fork fork

INIT INIT ...... INIT

exec exec exec

GETTY GETTY GETTY

exec

LOGIN

29
Version Octobre 2012 N°245

Ouverture d'une session (Réalisée)


PID = 1 INIT

fork
fork fork

INIT INIT ...... INIT

exec exec exec

GETTY GETTY GETTY

exec

LOGIN

exec
/BIN/KSH
/BIN/KSH
PPID = 1 PID : login

Version Octobre 2012 N°246

system: exécution d’un sous-shell

Ligne de
commande

‰P é par tous lles OS [if ((system(NULL))


Pas supporté (NULL)) ouii]
‰ Bon exercice:
9 fork
9 execve
9 waitpid
9…

30
Version Octobre 2012 N°247

Exercice: implémentation de system

trop de fork

Pas de traitement
des signaux

Version Octobre 2012 N°248

Execution: binaires vs scripts shells


‰ Choix basé sur le début du fichier (voir file(1))
g q (p
‰Binaire : nombre magique g )
(protocole de chargement)
‰Script : #! Chemin interprète
‰ Reliure du programme binaire
‰Statique : protocoles de chargement (à la demande…)
‰Dynamique (charge aussi le relieur dynamique)
Bibliothèque partageable nom.so
‰ Chargement et exécution :
‰Binaire : c’est le programme (préparé par ld)
S’appuie sur le runtime d’un langage
‰Script : C’est l’interprète
C’est lui qui exécute le script

31
Version Octobre 2012 N°249

Communication inter-processus
Des solutions adaptées
‰Partie Système
‰Mécanisme de redirection (dup)
‰Comunication par tubes (dup, pipe)
‰envoi/traitement de signaux (signal, kill)

‰Partie Réseau
‰Bibliothèque IPC* (même machine)
‰Mémoire partagée
partagée, Sémaphores
‰Files de messages
‰Bibliothèque des sockets (tout le réseau)

* Inter Process Communication

32

Vous aimerez peut-être aussi