INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montr

INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.1 Communication Interprocessus • Introduction • Segments de données et fichiers communs • Les signaux • Les tubes de communication – Tubes anonymes – Tubes nommés INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.2 Introduction • En général, plusieurs processus (threads) coopèrent pour réaliser une tâche complexe. • Ces processus s'exécutent en parallèle sur un même ordinateur (monoprocesseur ou multiprocesseurs) ou sur des ordinateurs différents. • Ils doivent s'échanger des informations (communication interprocessus). • Il existe plusieurs mécanismes de communication interprocessus. Nous pouvons citer : – les données communes (variables, fichiers, segments de données), – les signaux, – les messages. INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.3 Segments de données et fichiers communs • Les processus partagent un ensemble de données communes qui sont soit en mémoire (variables ou segments de données) ou sur disque (fichiers). • Chaque processus peut accéder en lecture ou en écriture à cet ensemble de données (espace de données commun). • Des problèmes d’incohérence peuvent survenir lorsque plusieurs processus opèrent, en même temps, sur un espace commun. Ce problème sera étudié lors de la prochaine séance. • Supposons deux processus qui partagent une variable v. Le premier processus incrémente de 1 la valeur de v alors que l’autre la décrémente de 1. La valeur initiale de v est 1 : P1 : v=v+1; P2 : v=v-1; • Les instructions correspondant en assembleur : P1 : load v P2 : load v add 1 sub 1 store v store v Supposons que : • les processus P1 et P2 s’exécutent en temps partagé, • le processus P1 exécute load v et add 1. Il est suspendu juste après l’exécution de add 1. • Le processus P2 est élu et exécute les instructions load v et sub 1 et store v. Le processus P2 se termine avec v = 0. • Le processus P1 est ensuite élu et exécute l’instruction store v (v=2). INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.4 Segments de données et fichiers communs (2) • Les threads (POSIX) d’un processus partagent la zone de données globales ainsi que la table des descripteurs de fichiers du processus. • Lors de la création d’un processus (fork), la table des descripteurs de fichiers est dupliquée. Les processus créateur et créé partageront le même pointeur de fichier pour chaque fichier déjà ouvert lors de la création. • Il est possible de créer des segments de données, de les rattacher et de les détacher des processus. • On peut ainsi créer des segments de données communs à plusieurs processus. INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.5 Segments de données et fichiers communs (3) • Les appels système pour la création de segments partagés sont dans les librairies : <sys/ipc.h> et <sys/shm.h>. • L’appel système shmget permet de créer ou de retrouver un segment de données. • L’appel système shmat permet d’attacher un segment de données à un processus. • L’appel système shmctl permet, entre autres, de détacher un segment d’un processus. Exemple de communication au moyen de segment partagé : • Les deux programmes suivants communiquent au moyen d’un segment créé par le premier. Le segment de données est de clé 5. Seuls les processus du groupe peuvent y accéder. L’accès est exclusif. • Le premier programme attache le segment créé à son espace de données puis écrit dans ce segment la valeur 1190. Enfin, il détache après deux secondes le segment de son espace d’adressage. • Le second programme attache le segment à son espace de données puis accède en lecture au segment. Ensuite, il détache le segment de son espace d’adressage. INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.6 Segments de données et fichiers communs (4) // programme shm1.cpp #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #include <iostream.h> int main ( ) { char * add; int status, cle = 5; if( (status = shmget(cle, sizeof(int), IPC_CREAT | IPC_EXCL | 0600))==-1) exit(1); cout << "status "<< status<< endl; if((add =(char *) shmat(status,NULL,0)) == (char *)-1) exit(2); int* entier= (int *) add; *entier = 1190; sleep(2); if( shmctl(status, IPC_RMID, NULL) == -1) exit(3); exit(0); } INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.7 Segments de données et fichiers communs (5) // programme shm2.cpp #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #include <iostream.h> int main ( ) { char * add; int status, cle = 5; if( (status = shmget(cle, sizeof(int), 0))==-1) exit(1); cout << "status "<< status<< endl; if((add =(char*) shmat(status,NULL,0)) == (char *) -1) exit(2); int* entier= (int *) add; cout << "entier = " << *entier << endl; if( shmctl(status, IPC_RMID, NULL) == -1) exit(3); exit(0); } pascal> shm1 & shm2 & [4] 10055 [5] 10056 status 788889600 status 788889600 entier = 1190 INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.8 Les signaux • Un signal est une interruption logicielle asynchrone qui a pour but d’informer de l’arrivée d’un événement. • Ce mécanisme de communication permet à un processus de réagir à un événement sans être obligé de tester en permanence l’arrivée. • De nombreuses erreurs détectées par le matériel comme l’exécution d’une instruction non autorisée ( division par 0) ou l’emploi d’une adresse non valide, sont converties en signaux qui sont envoyés (émis) au processus fautif. • Le système d’exploitation gère un ensemble de signaux. Chaque signal a un nom et est associé à un type d’événement (man 7 signal). SIGINT 2 SIGQUIT 3 SIGKILL 9 SIGUSR1 30,10,16 SIGUSR2 31,12,17 SIGCHLD 20,17,18 SIGCONT 19,18,25 SIGSTOP 17,19,23 INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.9 Les signaux (2) Gestionnaire de signal • Comme on ne peut pas prévoir à l’avance à quels moments un signal va arriver ni même s’il doit arriver, une fonction est enregistrée à l’avance pour chaque signal (gestionnaire de signal). • Le système d’exploitation associe à chaque signal un traitement par défaut (gestionnaire par défaut du signal). • Par exemple, SIGUSR1 et SIGUSR2 tuent le processus, SIGCHLD est ignoré (man 7 signal pour plus de détails). • Le système d’exploitation permet à un processus de redéfinir pour certains signaux leurs gestionnaires. • Un processus peut indiquer au système ce qui doit se passer à la réception d’un signal : – ignorer le signal (certains signaux ne peuvent être ignorés), – le prendre en compte (en exécutant le traitement spécifié par le processus) ou – exécuter le traitement par défaut – le bloquer (le différer). INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.10 Les signaux (3) Arrivée d’un signal • Si un processus choisit de prendre en compte un signal qui lui est destiné (capture d’un signal), il doit alors spécifier la procédure de gestion de signal. • Par exemple, la touche d’interruption Ctrl+C génère le signal SIGINT. Par défaut, ce signal arrête le processus. Le processus peut associer à ce signal une autre procédure de gestion de signal. • Quand un signal arrive, la procédure associée est exécutée. • A la fin de l’exécution de la procédure, le processus poursuit son exécution. • Les signaux SIGKILL et SIGSTOP ne peuvent âtre ni capturés, ni ignorés, ni bloqués. INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.11 Les signaux (4) Envoi d’un signal • L’appel système qui permet d’envoyer un signal à un processus kill (man 2 kill) #include <sys/types.h> #include <signal.h> int kill ( pid_t pid, int sig); Si pid >0, le signal sig est envoyé au processus pid. Si pid = 0, le signal est envoyé à tous les processus du groupe du processus émetteur. Il retourne 0 en cas de succès et -1 en cas d’erreur. • Dans le cas du système UNIX, un processus utilisateur peut envoyer un signal à un autre processus. Les deux processus doivent appartenir au même propriétaire ou le processus émetteur du signal est le super-utilisateur. INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.12 Les signaux (5) Capture d’un signal • L’appel système signal permet de redéfinir le gestionnaire associé à un signal. #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); – Le premier paramètre est le numéro ou le nom du signal à capturer – Le second est la fonction gestionnaire à exécuter à l‘arrivée du signal. – SIG_DFL désigne l‘action par défaut et – SIG_IGN indique au système que le processus appelant veut ignorer le signal. • Il retourne le gestionnaire précédent ou SIG_ERR en cas d’erreur. • On peut associer un même gestionnaire à des signaux différents. • Les signaux SIGKILL et SIGSTOP ne peuvent être ni ignorés, ni captés, ni bloqués. • sigaction est un autre appel système plus récent que signal INF3600 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Séance 4.13 Les signaux (6) Attente d’un signal • L’appel système pause suspend l’appelant jusqu’au prochain signal. #include <unistd.h> int pause (void); • L’appel système sleep(v) suspend l’appelant jusqu’au prochain signal ou l’expiration du délai uploads/Industriel/ communication-interprocessus.pdf

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