Académique Documents
Professionnel Documents
Culture Documents
• Le système d’exploitation maintient dans une table appelée «table des processus» les
informations sur tous les processus créés (une entrée par processus : Bloc de Contrôle de
Processus PCB).
1
Qu’est ce qu’un processus ? (2)
Table des processus
PCB =
informations concernant l’état, la
mémoire et les ressources du
processus
2
Qu’est ce qu’un processus ? (4)
Exemple d’utilisation de la table des processus :
Changement de contexte
exécution
Charger état de PCB B
Processeur
Process eur
Terminaison
Fin Nouveau
Exécution
Élection
Mise en attente d’1 evt par le SE
Suspension
par le SE Admission
Arrivée de l’evt
Génie Informatique Chapitre 2. 6
Systèmes d’exploitation
École Polytechnique de Montréal
3
États d’un processus (2)
Cas d’Unix
fork
Création
Préemption
Retour Mémoire
Mémoire
à usager insuffisante
suffisante
Exécution suspension
Mode Hors mémoire
user Retour Prêt en Prêt hors
Élection mémoire mémoire
En mémoire
Interruption ou
Appel système Exécution
Mode
noyau Mise en attente
d’un evt
Arrivée de l’evt Arrivée de l’evt
terminaison
Hors mémoire
attente Attente
Zombie en mémoire hors
mémoire
4
Hiérarchie des processus
• Un processus peut créer un ou plusieurs processus qui, à leur tour, peuvent en créer
d’autres.
• Le processus 0 réalise d’autres initialisations (ex. le système de fichier) puis crée deux
processus : init de PID 1 et démon des pages de PID 2.
• Dans le cas de linux, on a, parmi d’autres, les processus kswapd, xfs et khubd.
Génie Informatique Chapitre 2. 10
Systèmes d’exploitation
École Polytechnique de Montréal
5
Hiérarchie des processus (3)
Cas de Windows XP
• Il se peut donc qu’un processus pointe vers un parent inexistant. Cela ne cause
aucun problème puisque rien ne dépend de cette information de parenté.
• Windows ne gère de lien qu’avec l’ID du processus parent, pas avec le parent du
parent, etc.
Processus d’UNIX
• Chaque processus a un numéro d’identification unique (PID). L’appel system getpid() permet
de récupérer le PID du processus : int getpid();
• Un processus fils peut partager certaines ressources (mémoire, fichiers) avec son processus
père ou avoir ses propres ressources. Le processus père peut contrôler l’usage des
ressources partagées.
• Le processus père peut avoir une certaine autorité sur ses processus fils. Il peut les
suspendre, les détruire (appel système kill), attendre leur terminaison (appel système wait)
mais ne peut pas les renier.
• Un processus peut remplacer son code exécutable par un autre (appel système exec).
Génie Informatique Chapitre 2. 12
Systèmes d’exploitation
École Polytechnique de Montréal
6
Processus d’UNIX (2) :
Processus shell (très simplifié)
7
Processus d’UNIX (4) :
Création de processus (appel système fork)
• La création de processus sous UNIX est réalisée au moyen de l’appel système : fork();
• Le père et le fils ont chacun leur propre image mémoire mais ils partagent certaines
ressources telles que les fichiers ouverts par le père avant le fork.
Génie Informatique Chapitre 2. 15
Systèmes d’exploitation
École Polytechnique de Montréal
Après le fork,
• le père et le fils vont
poursuivre leurs exécutions
(12339) à partir de l’instruction qui
suit l’appel au fork mais
chacun a sa propre zone de
données.
(12339) (12340)
Génie Informatique Chapitre 2. 16
Systèmes d’exploitation
École Polytechnique de Montréal
8
Processus d’UNIX (6)
Création de processus : Exemple 1
// programme tfork.c : appel système fork()
#include <sys/types.h> // pour le type pid_t
#include <unistd.h> // pour fork
#include <stdio.h> // pour perror, printf
int a=20;
int main ( )
{ pid_t x ;
// création d’un fils
switch (x = fork())
{ case –1 : /* le fork a échoué */
perror("le fork a échoué !") ;
break ;
case 0 : /* seul le processus fils exécute ce « case »*/
printf("ici processus fils, le PID %d.\n ", getpid()) ;
a+=10; break ;
default : /* seul le processus père exécute cette instruction*/
printf(" ici processus père, le PID %d. \n", getpid()) ;
a+=100;
}
// les deux processus exécutent ce qui suit
printf("Fin du Process %d. avec a = %d\n", getpid(),a ) ;
return 0 ;
} Génie Informatique Chapitre 2. 17
Systèmes d’exploitation
École Polytechnique de Montréal
a du fils
jupiter% gcc -o tfork tfork.c
jupiter% tfork
ici processus père, le PID 12339.
ici processus fils, le PID 12340.
Fin du Process 12340 avec a = 30. a du père
Fin du Process 12339 avec a = 120.
9
Processus d’UNIX (8)
Création de processus : Exemple 2
i=1 Processus
fork() 23707
sleep(1) printf(..) Processus
i=2
fork() 23708
sleep(1) printf(..)
i=3 Processus
fork()
23709
sleep(1) printf(..)
i=4 Processus
jupiter% gcc -o Arborescence Arborescence.c fork()
jupiter% Arborescence 23710
Processus 23707 de pere 23706 sleep(1)
Processus 23708 de pere 23707 printf(..)
Processus 23709 de pere 23708 i=5
Processus 23710 de pere 23709 sleep(1)
Génie Informatique Chapitre 2. 20
Systèmes d’exploitation
École Polytechnique de Montréal
10
Processus d’UNIX (10)
Création de processus : Exemple 2 sans l’instruction sleep
shell Processus
jupiter% gcc -o Arborescence Arborescence.c
23706 jupiter% Arborescence
jupiter% Processus 23707 de pere 1
.
Processus Processus 23708 de pere 1
i=1 Processus 23709 de pere 1
fork() 23707
Processus 23710 de pere 1
terminaison printf(..)
i=2 Processus
fork() 23708
terminaison printf(..)
i=3 Processus
fork()
23709
terminaison
Les fils qui deviennent printf(..)
orphelins sont adoptés i=4 Processus
par le processus init fork()
23710
de PID 1 terminaison
printf(..)
i=5
11
Processus d’UNIX (12)
Remplacement d’espace d’adressage (2)
Appel système exec : Exemple 3
// programme test_exec.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main ()
{ char* arg[] = {“/bin/ps”, “f”, NULL};
printf(“Bonjour…..\n”);
execvp(“/bin/ps”, arg);
printf(“Echec de execvp\n”);
printf("Erreur %s\n",strerror(errno));
return 0;
}
• waitpid(pid, status,0) avec pid>0, bloque le processus appelant jusqu’à ce que son
fils pid se termine.
12
Processus d’UNIX (14)
Attente de la fin d’un processus fils : exemple 4
// programme parent.c // programme fils.c
#include <unistd.h> // pour fork et execl #include <stdio.h>
#include <sys/wait.h> // pour wait #include <unistd.h>
#include <stdio.h> //pour printf int main ( )
#define NULL 0 {
int main () printf(" ici programme fils [%d]\n",
{ int p, child, status; getpid());
p=fork() ; return 0;
if ( p ==- 1) return – 1 ; }
if( p>0) // ce que fera le père
{ printf (" ici père[%d], mon fils[ %d] \n", getpid(), p); Le père attend
if ((child=wait(&status))>0) la fin du fils
printf(" ici père[%d], Fin du fils[%d]\n",getpid(),child);
printf(" Le père[%d] se termine \n", getpid()); Le fils change de
} code exécutable
else // ce que le fils fera
{ if ((status=execl("/home/user/a.out", "a.out", NULL))==-1) jupiter% gcc fils.c
printf("le programme n' existe pas : %d\n",status); jupiter% gcc -o parent parent.c
else jupiter% parent
printf("cette instruction n’est jamais exécutée\n"); ici père[10524], mon fils[10525]
} ici programme fils [10525]
return 0; ici père[10524] Fin du fils[10525]
} Le père[10524] se termine
jupiter%
Génie Informatique Chapitre 2. 25
Systèmes d’exploitation
École Polytechnique de Montréal
13
Processus d’UNIX (16)
Terminaison de processus
• Un processus se termine par une demande d’arrêt volontaire (appel système exit) ou
par un arrêt forcé provoqué par un autre processus (appel système kill) ou une erreur.
void exit(int vstatus);
• Son PCB et son PID sont conservés jusqu’à ce que son processus père ait
récupéré cet état de terminaison.
• Si un processus est tué par un signal kill, ce signal est aussi envoyé à tous ses
processus fils.
Exécution suspension
Mode Hors mémoire
user Retour Prêt en Prêt hors
Élection mémoire mémoire
En mémoire
Interruption ou
Appel système Exécution
Mode
noyau Mise en attente
d’un evt
Arrivée de l’evt Arrivée de l’evtl
terminaison
Hors mémoire
attente Attente
Détruit Zombie en mémoire hors
mémoire
père exécute wait
14
Processus d’UNIX (18)
Terminaison de processus : exemple 6
// programme deuxfils.c
#include <sys/wait.h> jupiter% gcc -o deuxfils deuxfils.c
#include <stdio.h> jupiter% deuxfils
#include <unistd.h> fin du fils1
void fils(int i) ; fin du fils2
int main() jupiter% deuxfils
{ int status; fin du fils2
if(fork()) // création du premier fils fin du fils1
{ if ( fork()==0) // création du second fils
fils(2) ;
}
else fils(1) ;
if (wait(&status)>0) printf("fin du fils%d\n", status>>8) ;
if (wait(&status)>0) printf("fin du fils%d\n", status>>8) ;
return 0 ;
}
void fils(int i)
{ sleep(2) ;
exit(i) ;
}
Génie Informatique Chapitre 2. 29
Systèmes d’exploitation
École Polytechnique de Montréal
15
Processus d’UNIX (20)
Partage de fichiers entre processus père et fils
• Le fork duplique la table des descripteurs de fichiers du processus
père.
Exercice
// chaine_fork_wait.c
int main(void)
{
int i, n=5;
pid_t fils_pid;
for (i=1; i<n; i++)
{
fils_pid = fork();
if (fils_pid > 0)
{
wait(NULL);
break;
}
}
printf("Processus %d avec pere %d\n",getpid(), getppid());
}
16
Processus Windows XP
• Les processus, threads, fichiers, sémaphores,… sont considérés comme des objets. À
chaque objet est associé un ou plusieurs handles
17
Processus Windows XP (3)
Création d’un processus
• Il y a une création d’un processus Windows lorsqu’une application appelle une
fonction de création de processus comme
– CreateProcess,
– CreateProcessAsUser,
– CreateProcessWithTokenW ou
– CreateProcessWithLogonW.
• BOOL CreateProcess(
LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes BOOL
bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO
lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION
lpProcessInformation // pointer to PROCESS_INFORMATION );
18
Processus Windows (5)
Création de processus sous Windows
#include <windows.h>
#include <stdio.h>
void main( VOID )
{ STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD status ; // address to receive termination status
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( !CreateProcess("child.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{ printf( "CreateProcess failed (%d).\n", GetLastError() );
ExitProcess(1);
}
WaitForSingleObject( pi.hProcess, INFINITE );
if(GetExitCodeProcess( pi.hProcess, &status))
printf("I am the father. My child has terminated with (%d). \n", status);
else printf( "GetExitCodeProcess failed (%d).\n", GetLastError() );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
printf( “I am the father. Going to terminate.\n");
ExitProcess(0);
} // fichier Father.cpp
19