NSY103 J. Delacroix 1 LINUX processus et outils de communication NSY103 J. Dela

NSY103 J. Delacroix 1 LINUX processus et outils de communication NSY103 J. Delacroix 2 Processus Processus LINUX NSY103 J. Delacroix 3 Caractéristiques Générales Un processus Unix/Linux est identifié par un numéro unique, le PID. NSY103 J. Delacroix 4 Processus Linux • Tout processus Linux peut créer un autre processus Linux Arborescence de processus avec un rapport père - fils entre processus créateur et processus crée Processus pid 15 Processus pid 20 Processus pid 24 Processus pid 26 Processus pid 27 Processus pid 30 création création création création Grand pere père père fils fils fils fils père NSY103 J. Delacroix 5 Processus Linux • Tout le système Linux repose sur ce concept arborescent Processus 0 Processus 1 : init création création création Processus getty Processus getty Processus daemon création Processus login Processus shell Fichier /etc/inittab Inetd Crond lpd ... Fichier /etc/passwd création création Prog .exe ls -l création création Interpréteur de commandes NSY103 J. Delacroix 6 Processus Linux Nouveau Prêt Actif Noyau Actif Utilisateur Zombi Endormi Mode Utilisateur Mode Noyau en mémoire Liste des PCB Thread noyau 0 Tâche « CPU idle » Processus INIT files_struct mm_struct signal_struct Nouveau Prêt Actif Noyau Actif Utilisateur Zombi Endormi Mode Utilisateur Mode Noyau en mémoire TASK_RUNNING TASK_ZOMBIE TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, TASK_STOPPED thread_struct 6 Liste des PCB list_head *next_task, *prev_task Joëlle Delacroix NSY103 J. Delacroix 7 Liste des PCB list_head *next_task, *prev_task Liste des PCB RUNNING (run_queue) *next_run, *prev_run; volatile long state; - - état du processus long counter; - - quantum long priority; -- priorité SCHED_OTHER struct task_struct *next_task, *prev_task; -- chainage PCB struct task_struct *next_run, *prev_run; -- chainage PCB Prêt int pid; -- pid du processus struct task_struct *p_opptr, *p_pptr, *p_cptr,; -- pointeurs PCB père originel, père actuel, fils long need_resched; -- ordonnancement requis ou pas long utime, stime, cutime, cstime; -- temps en mode user, noyau, temps des fils en mode user, noyau unsigned long policy; -- politique ordonnancement SCHED_RR, SCHED-FIFO, SCHED_OTHER unsigned rt_priority; -- priorité SCHED_RR et SCHED_FIFO struct thread_struct tss; -- valeurs des registres du processeur struct mm_struct *mm; -- contexte mémoire struct files_struct *files ; -- table fichiers ouverts struct signal_struct *sig ; -- table de gestion des signaux TASK_STRUCT 7 Joëlle Delacroix NSY103 J. Delacroix 8 Primitives et commandes générales NSY103 J. Delacroix 9 Primitives et commandes générales • Primitive getpid, getppid pid_t getpid(void) retourne le pid du processus appelant pid_t getppid(void) retourne le pid du père du processus appelant • Commande ps délivre la liste des processus avec leur caractéristiques (pid, ppid, état, terminal, durée d ’exécution, commande associée…) S PID PPID PRI TIME S 581 579 60 bash S 592 581 61 essai S 593 592 61 essai R 599 580 73 ps bash essai essai NSY103 J. Delacroix 10 Arrêter un processus : kill La commande kill permet d’envoyer un signal à un processus. Un signal est un moyen de communication entre processus; il permet de spécifier à un processus qu’un évènement est arrivé. Chaque signal est identifié par un nom et un numéro Le processus réagit au signal reçu (par exemple en s’arrêtant) kill – numerosignal pid SIGKILL 9 Force le processus à se terminer. SIGTERM 15 signal par défaut. Termine le processus en « douceur ». 10 NSY103 J. Delacroix 11 CREATION de PROCESSUS NSY103 J. Delacroix 12 Primitive de création de processus • Primitive fork #include <unistd.h> pid_t fork(void) La primitive fork() permet la création dynamique d ’un nouveau processus qui s ’exécute de manière concurrente avec le processus qui l ’a créé. Tout processus Unix/Linux hormis le processus 0 est crée à l ’aide de cette primitive. Le processus créateur (le père) par un appel à la primitive fork() crée un processus fils qui est une copie exacte de lui-même (code et données) NSY103 J. Delacroix 13 Primitive de création de processus PROCESSUS PID 12222 MODE UTILISATEUR MODE SYSTEME Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret = fork(); } Exécution de l ’appel système fork Si les ressources noyau sont disponibles - allouer une entrée de la table des processus au nouveau processus - allouer un pid unique au nouveau processus - dupliquer le contexte du processus parent (code, données, pile) - retourner le pid du processus crée à son père et 0 au processus fils NSY103 J. Delacroix 14 Primitive de création de processus PROCESSUS PID 12223 Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret = fork(); } 0 12223 PROCESSUS PID 12222 Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret = fork(); } Exécution de l ’appel système fork Si les ressources noyau sont disponibles retourner le pid du processus crée à son père et 0 au processus fils MODE UTILISATEUR MODE SYSTEME NSY103 J. Delacroix 15 Primitive de création de processus Données Pile User Table des Régions (mm_struct) Pile noyau Données Pile User Table des régions Pile noyau Code partagé PERE FILS Task_struct Task_struct signal_struct files_struct NSY103 J. Delacroix 16 Primitive de création de processus • Mécanisme du copy on write ( Copie sur écriture): Lors de sa création, le fils partage avec son père: - le segment de code; - le segment de données et la pile sont également partagés et mis en accès lecture seule . Lors d'un accès en écriture par l'un des deux processus, le segment de données ou la pile sont effectivement dupliqués. Données Pile User Table des régions Code Table des régions Père Fils r r r Données Pile User Table des régions Code Table des régions Père r r r Accès écriture données Fils w Données r NSY103 J. Delacroix 17 Primitive de création de processus PROCESSUS PID 12223 Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret = fork(); } 0 12223 PROCESSUS PID 12222 Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret = fork(); } • Chaque processus père et fils reprend son exécution après le fork() • Le code et les données étant strictement identiques, il est nécessaire de disposer d ’un mécanisme pour différencier le comportement des deux processus après le fork() On utilise pour cela le code retour du fork() qui est différent chez le fils (toujours 0) et le père (pid du fils crée) NSY103 J. Delacroix 18 Primitive de création de processus PROCESSUS PID 12223 PROCESSUS PID 12222 Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret= fork(); if (ret == 0) printf(" je suis le fils ") else { printf ("je suis le père"); printf ("pid de mon fils %d", ret) } } Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret= fork(); if (ret == 0) printf(" je suis le fils ") else { printf ("je suis le père"); printf ("pid de mon fils, %d" , ret) } } Pid du fils : 12223 getpid : 12222 getppid :shell getpid : 12223 getppid :12222 NSY103 J. Delacroix 19 Génétique des processus Linux (1) Données Pile User Table des Régions (mm_struct) Pile noyau Données Pile User Table des régions Pile noyau Code partagé PERE FILS Task_struct Task_struct 0 1 2 3 N Table des fichiers ouverts Du processus mode, f_pos w, 5 r, 15 w, 10 Table des fichiers ouverts Mode : lecteur, écriture… f_pos : pointeur de fichier ; octet courant 0 1 2 3 N Lors de cette création le processus fils hérite de tous les attributs de son père sauf : l’identificateur de son père ; les temps d’exécution du nouveau processus sont nuls. i = 4 i = 4 NSY103 J. Delacroix 20 Génétique des processus Linux (1) 123456789coucoulespetitsamis P-F P NSY103 J. Delacroix 21 Synchronisation père / fils NSY103 J. Delacroix 22 Synchronisation père / fils • Primitive exit() #include <stdlib.h> void exit (int valeur); pid_t wait (int *status); un appel à la primitive exit() provoque la terminaison du processus effectuant l'appel avec un code retour valeur. (Par défaut, le franchissement de la dernière } d'un programme C tient lieu d'exit) un processus qui se termine passe dans l'état Zombie et reste dans cet état tant que son père n'a pas pris en compte sa terminaison Le processus père "récupère" la terminaison de ses fils par un appel à la primitive wait () Nouveau Prêt Actif Noyau Actif Utilisateur Zombi Endormi Mode Utilisateur Mode Noyau en mémoire NSY103 J. Delacroix 23 Primitive de création de processus PROCESSUS PID 12223 PROCESSUS PID 12222 Main () { pid_t ret ; int i, j; for(i=0; i<8; i++) i = i + j; ret= fork(); if (ret == 0) { printf(" je suis le fils "); exit(); } else { printf ("je suis le père"); printf ("pid de mon fils, %d" , ret) wait(); } } Main () { pid_t ret; int i, j; for(i=0; uploads/Industriel/ proc-linux-out-i-ls-communication-complet.pdf

  • 22
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager