ENS Cachan
Rappels : un processus simple Un processus travaille dans un espace d adressage : segments de texte, de données, et pile. Il agit sur le microprocesseur : change les registres, le compteur ordinal, le mot d état (cf mode utilisateur ou noyau) Réciproquement, par le mot d état, le matériel peut interrompre (dérouter) le programme.
Multiprogrammation Dans les systèmes multitâches, plusieurs processus s exécutent en parallèle : parallélisme simulé par un ordonnanceur processus = unité d exécution vue comme indépendante des autres Concept assez ancient (ATLAS I, 1959), mais récent dans les systèmes d exploitation grand public. Nécessite un vrai travail du système : commutation, mémoire virtuelle, ordonnanceur... A remplacé le traitement par lot (BATCH), cf MS-DOS.
Arborescence de processus Un processus a une identité (pid), cf commandes ps, top. Par ailleurs (en UNIX), un processus se situe dans une généalogie : un processus est créé par son père héritage des attributs du père utile pour définir des groupes fils = fonction (valeur de retour)
Attributs d un processus processus = unité de ressources d exécution Attributs d ordonnancement contexte (registres, mode, PC, etc) état (actif, prêt, bloqué, zombie) paramètres de priorité identité et généalogie (pid, père, groupe...) signaux temps (d exécution, d attente,...) Espace d adressage segments de code, de données, et de pile Attributs de fichiers cwd, descripteurs, id d utilisateur Question A votre avis, quels attributs sont hérités?
Vie et mort d un processus initial ready zombi kernel running user running stopped asleep Des processus bloqués éviter l attente active possibilité de préemption (signaux) Démos tube, CRTL+Z... Questions Où sont les commutations de contexte? A quels évènements correspond chaque flèche? Pourquoi y a-t-il un état zombie?
Gestion de processus depuis le shell Quelques commandes utiles : processus liés au terminal ou au shell : commandes ps, jobs activité : top ordonnancement par le shell : &, bg, fg. préemption : CRTL+Z, kill
Notion de signal Un signal est émis par un processus vers un autre (ou un groupe d autres) processus de même propriétaire (sauf root). Le signal peut être rattrappé par le processus destinataire, ce qui provoque (en général) un déroutement et le lancement d une routine spécifique de traitement. Après le traitement, le processus reprend où il a été interrompu. En UNIX : la commande kill permet d envoyer des signaux.
Les principaux signaux Nom cause standard effet par défaut SIGINT terminaison SIGABRT appel à abort() terminaison SIGFPE erreur de flottant terminaison SIGKILL terminaison (non modifiable) SIGBUS bus error terminaison SIGPIPE écriture sur un tube sans lecteur terminaison SIGALRM fin d un timer terminaison SIGSTOP suspension (non modifiable) SIGCONT reprise SIGCHLD un fils a fini son exécution pas d effet SIGUSR1 aucune terminaison SIGUSR2 aucune terminaison
Délivrance du signal Elle dépend de l état du processus. En général, le signal est délivré au processus lorsqu il devient actif en mode utilisateur, sinon elle est différée. Pour certains appels systèmes bloquants (ex : read), un signal plus prioritaire peut réveiller un processus endormi. Un processus suspendu sera réactivé par SIGKILL, SIGTERM et SIGCONT. Question Que penser du cas d un processus zombie?
Création de processus et recouvrement UNIX distingue la création d un processus (fork) et le recouvrement (exec) Remarques Exemple : la commande launch void launch(char * cmd){ if ((child_pid = fork()) >0 ) { return ; // processus pere} else { execvp(cmd,cmd) ; } } un exec ne crée pas de processus (meme pid). un fork recopie les attributs, en particulier l espace d adressage (les variables ne sont pas aliasées). un fork recopie les descripteurs, mais pointent sur la meme entrée de la table des fichiers ouverts
Commandes wait et waitpid Attendre la fin d un processus fils : waitpid(child_pid,&status) ; /* traitement en fonction de la cause de terminaison * if (WIFEXITED(statut)) { printf("terminaison avec valeur %d\n",wexitstatus(statut) } else if (WIFSIGNALED(statut)) { printf("terminaison par signal %d\n",wtermsig(statut)) ; } else if (WIFSTOPPED(statut)) { printf("suspension par signal %d\n",wstopsig(statut)) ; }
Définition d un handler de signaux exemple : reactivation d un fils struct sigaction action ; pid_t pid_fils ; void hand(int sig){ printf("signal %d recu par %d\n", sig, (int)getpid()) ; /* le processus reactive son fils */ kill(pid_fils, SIGCONT) ; } int main(int argc,char *argv[]) { printf("lancement du processus %d\n", (int)getpid()) ; action.sa_handler = hand ; sigaction(sigchld, &action, NULL) ; démo : chld1.c