La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

SYSTÈME DEXPLOITATION I SIF-1015. Contenu du cours 6 Communication par tubes –Tube nommé (FIFO) IPC (Inter Process Communication) –Files de messages –Mémoire.

Présentations similaires


Présentation au sujet: "SYSTÈME DEXPLOITATION I SIF-1015. Contenu du cours 6 Communication par tubes –Tube nommé (FIFO) IPC (Inter Process Communication) –Files de messages –Mémoire."— Transcription de la présentation:

1 SYSTÈME DEXPLOITATION I SIF-1015

2 Contenu du cours 6 Communication par tubes –Tube nommé (FIFO) IPC (Inter Process Communication) –Files de messages –Mémoire Partagée Les signaux LECTURES: –Chapitre 3 (OSC) –Chapitres 10, 12, 13 (Mitchell) –Chapitres 5, 10 et 11 (Card) –Annexe C (Mitchell)

3 Communication par tubes Les tubes représentent un mécanisme de communication entre processus. La transmission des données entre processus seffectue à travers un canal de communication: les données écrites à une extrémité sont lues à lautre extrémité

4 Communication par tubes Le premier type de tubes est le tube anonyme, il est créé par un processus et la transmission des descripteurs associés ne se fait que par héritage vers ses descendants. Ce mécanisme est contraignant puisquil ne permet la commu- nication quentre processus ayant un ancêtre commun qui lui est le créateur du tube Les tubes nommés (FIFO) permettent déliminer cette contrainte puisquils sont traités comme des fichiers en ce qui concerne les opérations douverture, de fermeture, de lecture et décriture. Les FIFO ont donc une entrée dans le système de fichier. Un fichier de type FIFO peut être identifié par lattribut p affiché par la commande shell ls -al

5 Communication par tubes Appels système –Tubes anonymes : Créer par un appel système pipe() int pipe(int filedes[2]); filedes[0]: descripteur de lecture du tube filedes[1]: descripteur décriture du tube

6 Communication par tubes Exemple dutilisation des pipes (1 processus) Exécution: >./pipe1 Wrote 3 bytes Read 3 bytes : 123 exemple pipe1.c dans le répertoire Chap12ProgLinux sur mil08

7 Communication par tubes Exemple dutilisation des pipes (2 processus) exemple pipe2.c dans le répertoire Chap12ProgLinux sur mil08

8 Communication par tubes Exemple dutilisation des pipes (2 processus, utilisation de execl()) exemple pipe3.c dans le répertoire Chap12ProgLinux sur mil08

9 Communication par tubes Exemple dutilisation des pipes (2 processus, utilisation de execl()) Exécution: >./pipe wrote 3 bytes read 3 bytes : 123 exemple pipe4.c dans le répertoire Chap12ProgLinux sur mil08

10 Communication par tubes Appels système –FIFO : Peut être créée par la fonction libc mkfifo(). #include int mkfifo(const char *path, mode_t mode); –Cette fonction fait en réalité appel à lappel système mknod() mknod(const char *path, mode_t mode, dev_t dev); –Par exemple: mknod(path, mode | S_IFIFO, 0); –Comme pour les fichiers, les FIFO permettent les I/O bloquantes (par défauts) ou non bloquantes (en spécifiant loption O_NODELAY ou O_NONBLOCK lors de louverture avec open())

11 Communication par tubes Utilisation des FIFO (Création dun fichier FIFO, exemple fifo1.c dans le répertoire Chap12ProgLinux sur mil08)

12 Communication par tubes Utilisation des FIFO (Création dun fichier FIFO: Entrée dans le répertoire /tmp)

13 Communication par tubes Utilisation des FIFO (Création dun fichier FIFO: Entrée dans le répertoire /tmp)

14 Communication par tubes Utilisation des FIFO (Création dun fichier FIFO) –Fonctionnement: La fonction mkfifo() permet de créer un fichier spécial. Même si le mode douverture de ce fichier est de 0777, cette valeur est modifiée par la valeur du masque utilisateur (variable système avec comme valeur typique: 0022) et ce comme dans le cas des fichiers normaux. Le fichier spécial (FIFO) est donc ouvert en mode 755 (RWX pour le propriétaire du processus, RX pour le groupe et les autres). Dans un programme si nous voulons modifier le masque utilisateur, nous utilisons lappel système: #include int umask(int mask) // nouvelle_permission = ancienne_permission & (~mask) // mask est le nouveau masque // umask() retourne la valeur de lancien masque

15 Communication par tubes Utilisation des FIFO (Création dun fichier FIFO) –Fonctionnement: Pour effacer un fichier spécial nous pouvons utiliser lappel système: #include int unlink( const char *pathname); // unlink() supprime le fichier dont le nom est pointé par pathname // unlink() retourne la valeur 0 si la suppression est réussi et –1 sinon

16 Communication par tubes Utilisation des FIFO (Ouverture dun fichier FIFO) Voir exemple fifo2.c

17 Communication par tubes Utilisation des FIFO (Ouverture dun fichier FIFO) Exécution: >./fifo2 O_RDONLY & [1] 152 Process 152 opening FIFO >./fifo2 O_WRONLY Process 153 opening FIFO Process 152 result 3 Process 153 result 3 Process 152 finished Process 153 finished La fonction access() vérifie si lutilisateur a les permissions daccès à une FIFO Permet aussi de vérifier si une FIFO existe

18 Communication par tubes Utilisation des FIFO (I/O dans un fichier FIFO: Écriture) Voir exemple fifo3.c

19 Communication par tubes Utilisation des FIFO (I/O dans un fichier FIFO: Écriture)

20 Communication par tubes Utilisation des FIFO (I/O dans un fichier FIFO: Lecture) Exécution: >./fifo3 & [1] 375 Process 375 opening FIFO O_WRONLY >./fifo4 Process 377 opening FIFO O_RDONLY Process 375 result 3 Process 377 result 3 Process 375 finished Process 377 finished, bytes read Voir exemple fifo4.c

21 Communication par tubes Utilisation des FIFO (Serveur) Voir exemple server.c, client.h

22 Communication par tubes Utilisation des FIFO (Client) Voir exemple client.c

23 Communication par tubes La taille dun tube est limitée à 4Ko (valeur de la constante PIPE_BUF dans le fichier La création dune FIFO correspond à la création dun fichier et est détaillée dans le fichier source fs/fifo.c La lecture et lécriture sont détaillées dans le fichier source fs/pipe.c Au niveau de lentrée dans le système de fichier (i-nœud). Li-nœud (inode) qui est décrit avec plus de détails dans le section sur les systèmes de fichiers LINUX est une structure décrivant les fichiers Pour un tube, un des champs de la structure i-nœud, i_pipe est mis à 1 pour identifier que le i-nœud correspond à un tube

24 Communication par tubes Le champ u du i-nœud est constitué de la structure pipe_inode_info décrite dans le fichier

25 IPC (Inter Process Communication) Les IPC permettent déchanger, de partager des données mais également de synchroniser des processus entre eux Les IPC sont constitués de trois mécanismes: –Files de messages : Similaire à une boîte aux lettres. Une application peut déposer (si elle a les permissions nécessaires) un message (un nombre, une chaîne de caractères, ou le contenu dune structure), dautres applications peuvent lire ce message –Mémoire partagée : Permet de mettre en commun une zone de mémoire entre plusieurs applications. Normalement, lorsquune zone de mémoire est allouée (ex: malloc()), elle est locale au processus donc aucun autre processus ne peut y accéder. Plusieurs processus peuvent par contre, accéder autant en lecture quen écriture à une zone de mémoire partagée

26 IPC (Inter Process Communication) Les IPC sont constitués de trois mécanismes: –Sémaphores : Permet la synchronisation des processus. Permet alors à plusieurs processus qui fonctionnent en même temps daccéder aux mêmes données A la différence des autres modes de communication (pipes) les IPC nutilisent pas le système de fichiers. Un IPC nest donc pas utilisé comme un fichier donc les appels open(), read() et write() deviennent inutilisables dans ce contexte. La seule manière de manipuler un IPC est de connaître sa clef didentification. Cette clef didentification permet davoir accès à la zone de mémoire où sont stockées les IPC.

27 IPC (Inter Process Communication) La gestion des clefs –Pour créer ou accéder à un IPC il faut posséder un identificateur (clef) –Cette clef est un nombre qui identifie lIPC de façon unique au niveau du système –Génération dune clef: #include key_t ftok(char *pathname, char proj); pathname: Un nom de fichier quelconque proj: Facteur permettant de générer plusieurs clefs différentes pour un même fichier –ftok() retourne un identificateur unique de lIPC qui doit être utilisé pour gérer lIPC

28 IPC (Inter Process Communication) La gestion des clefs –ftok() retourne un identificateur unique de lIPC qui doit être utilisé pour gérer lIPC –Clef est calculée par: clef = (st_ino & 0xFFFF) | ((st_dev & 0xFF) << 16) | (proj << 24) –La clef découle dune combinaison entre le numéro de li-nœud du fichier, le numéro du périphérique sur lequel se trouve le fichier et le paramètre proj, ce qui permet de générer une clef unique (voir exemple CreerClef.c p 383 Card)

29 IPC (Inter Process Communication) La gestion des clefs –Chaque IPC possède une structure ipc_perm qui contient des informations relatives aux permissions

30 IPC (Inter Process Communication) Les appels système par catégorie: –Création: msget(), semget(), shmget() –Contrôle: msgctl(), semctl(), shmctl() –Communication: msgsnd(), msgrcv(), semop(), shmop() Constantes importantes: –IPC_PRIVATE: Nouvelle file de messages créée strictement pour un processus et ses descendants –IPC_CREAT: Création dun IPC si la clef nest pas déjà utilisée –IPC_EXCL: Création dun objet si il nexiste pas –IPC_NOWAIT: Pas dattente (msgsnd(), msgrcv())

31 IPC (Inter Process Communication) Les files de messages –Un processus dépose un ou plusieurs messages dans une boîte aux lettres. Un ou plusieurs autres processus peut alors lire les messages selon leur ordre darrivée, selon le type de messages désiré –La structure msqid_ds (définit dans ) correspond à un objet de la file de messages. Cette structure permet la manipulation des objets créés.

32 IPC (Inter Process Communication) Les files de messages –La structure msg stocke un message et son type:

33 IPC (Inter Process Communication) Les files de messages –Représentation interne des files de messages

34 IPC (Inter Process Communication) Création et recherche des files de messages –Lappel système msgget() permet: La création dune nouvelle file de messages La recherche dune file de messages existante (pouvant avoir été créée par une autre application) grâce à sa clef #include int msgget(key_t clef, int option); clef: clef ( découlant de ftok()) de la file de messages qui existe déjà ou celle que nous voulons créer –Si la valeur IPC_PRIVATE est passée comme valeur de clef, une file est alors créée

35 IPC (Inter Process Communication) –Si la valeur de clef est différente, deux possibilités peuvent survenir: Si la clef nest pas déjà utilisée par une autre file de messages, il faut que le champ option soit affecté à IPC_CREAT. La file sera alors créée avec la clef passée en argument. Certains droits daccès peuvent aussi être fixés par les options La clef est utilisée par une autre file de messages, il faut alors que IPC_CREAT ou IPC_EXCL aient été passés en paramètre. Par la suite, la file de messages peut être accédée en lecture ou en écriture si les permissions le permettent

36 IPC (Inter Process Communication) Écriture de messages –Lappel msgsnd() permet de déposer un message dans une file de messages #include int msgsnd(int msqid, struct msgbuf *msgp, int msgtaille, int msgopt); msgqid: Identificateur de file de messages découlant de msgget() msgp: Pointeur sur les données constituant le message à déposer dans le file de messages msgtaille: Taille de lobjet déposé dans la file de messages msgopt: Si loption est IPC_NOWAIT alors msgsnd() sera non bloquant

37 IPC (Inter Process Communication) Lecture de messages –Lappel msgrcv() permet de lire un message dans une file de messages #include int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg); msgqid: Identificateur de file de message découlant de msgget() msgp: Pointeur sur les données du message récupéré de la file de messages msgsz: Taille de lobjet retiré de la file de messages msgtyp: Type du message à lire msgflg: Options sur la lecture du message

38 IPC (Inter Process Communication) Lecture de messages –Types de messages Si msgtyp == 0, lecture en mode FIFO (plus vieux message en premier) Si msgtyp est négatif, le premier message de la file avec un type <= |msgtyp| est extrait Si msgtyp est positif, le premier message de la file avec un type == msgtyp est extrait –Options IPC_NOWAIT: cette option permet déviter lattente active. Si une file est vide lors dune lecture lerreur ENOMSG est retournée. Si cette option nest pas activée, lappel est suspendu jusquà ce quun message du type recherché arrive dans la file de messages

39 IPC (Inter Process Communication) Utilisation des files de messages dans un contexte déchange de fichiers (Voir CopieServeur.c et CopieClient.c, p. 391 Card)

40 IPC (Inter Process Communication) Utilisation des files de messages dans un contexte déchange de caractères (Programme de réception)

41 IPC (Inter Process Communication) Utilisation des files de messages dans un contexte déchange de caractères (Programme de réception)

42 IPC (Inter Process Communication) Utilisation des files de messages dans un contexte déchange de caractères (Programme de transmission)

43 IPC (Inter Process Communication) Utilisation des files de messages dans un contexte déchange de caractères (Programme de transmission)

44 IPC (Inter Process Communication) Utilisation des files de messages dans un contexte déchange de caractères (Programmes de transmission et réception) Exécution: >./msg2 Enter some text: Bonjour les amis Enter some text: du cours SIF-1015 ! Enter some text: Comment allez-vous ce soir ? Enter some text: end >./msg1 You wrote: Bonjour les amis You wrote: du cours SIF-1015 ! You wrote: Comment allez-vous ce soir ? You wrote: end

45 IPC (Inter Process Communication) Mémoires partagées –Dans un programme standard, une zone de mémoire allouée est propre au processus qui lutilise. Aucun autre processus ne peut y accéder. Le principe de la mémoire partagée est de permettre à des processus de partager une partie de leur espace dadressage –Par contre, lutilisation de zones de mémoire partagées requiert la mise en place de mécanismes de synchronisation daccès –La solution pour résoudre ce problème est dutiliser les sémaphores

46 IPC (Inter Process Communication) Mémoires partagées

47 IPC (Inter Process Communication) Mémoires partagées –La structure shmid_ds (définit dans ) correspond à un objet de la table de mémoire partagées

48 IPC (Inter Process Communication) Mémoires partagées –Représentation interne des mémoires partagées

49 IPC (Inter Process Communication) Création et recherche dune zone de mémoire partagée –Lappel système shmget() permet: La création dune nouvelle zone de mémoire partagée La recherche dune zone mémoire partagée existante (pouvant avoir été créée par une autre application) grâce à sa clef #include int shmget(key_t clef, int taille, int option); taille: Représente la taille du segment de mémoire partagée désiré –shmget() retourne un indice dans le vecteur shm_segs

50 IPC (Inter Process Communication) Attachement dune zone de mémoire partagée –Lappel shmat() permet de rattacher une mémoire partagée à un processus. Consiste en fait à attacher un zone mémoire à lespace dadressage virtuel du processus appelant #include int *shmat(int msqid, const void *shmaddr, int option); shmaddr: Permet de spécifier ladresse de la mémoire partagée. Si ce champ est null (0), le noyau tente de chercher une zone de mémoire libre (à préconiser) –shmat() retourne un pointeur sur la mémoire partagée –A chaque appel shmat(), les paramètres shm_atime, shm_lpid, shm_nattach de la structure shmid_ds sont mis à jour

51 IPC (Inter Process Communication) Détachement dune zone de mémoire partagée –Lappel shmdt() permet de détacher une mémoire partagée avec un processus #include int *shmdt(const void *shmaddr); –A chaque appel shmdt(), les paramètres shm_dtime, shm_lpid, shm_nattach de la structure shmid_ds sont mis à jour

52 IPC (Inter Process Communication) Interaction avec dautres appels système –fork(): Le processus fils hérite des segments de mémoire partagés qui sont attachés à son père Exemple dutilisation de la mémoire partagée dans un contexte du problème des Écrivains et des Lecteurs (Voir Ecrivain.c et Lecteur.c, p. 410, Card)

53 Signaux Les signaux sont: –des événements logiciels (comme des interruptions logicielles) générées par le noyau ou des processus –acheminés du noyau ou dun processus vers dautres processus –identifiés par des numéros didentifications entiers –contiennent comme information que leur ID et leur occurrence Num.NameDefaultDescription 2 SIGINT TerminateInterrupt from keyboard (cntl-c) 9 SIGKILL TerminateKill program (cannot override or ignore) 11 SIGSEGV Terminate & DumpSegmentation violation 14 SIGALRM TerminateTimer signal 17 SIGCHLD IgnoreChild stopped or terminated

54 Envoyer des signaux Commande shell kill de UNIX –Envoit un signal à un processus –Ex: /bin/kill –s 9 pid Envoit un SIGKILL à un processus Fonction kill –Envoit un signal à un autre processus kill(pid, signal) linux>./forks 8 Terminating Parent, PID = 6675 Running Child, PID = 6676 linux> ps PID TTY TIME CMD 6585 ttyp9 00:00:00 tcsh 6676 ttyp9 00:00:06 forks 6677 ttyp9 00:00:00 ps linux> /bin/kill –s linux> ps PID TTY TIME CMD 6585 ttyp9 00:00:00 tcsh 6678 ttyp9 00:00:00 ps

55 Example de la fonction kill –Le kill force la terminaison des processus enfants void fork12() { pid_t pid[N]; int i; int child_status; for (i = 0; i < N; i++) if ((pid[i] = fork()) == 0) { /* Child: Infinite Loop */ while(1); } for (i = 0; i < N; i++) { printf("Killing process %d\n", pid[i]); kill(pid[i], SIGINT); } for (i = 0; i < N; i++) { pid_t wpid = wait(&child_status); if (WIFEXITED(child_status)) printf("Child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status)); else printf("Child %d terminated abnormally\n", wpid); } // attendre la terminaison de chaque processus

56 Gestion des signaux Chaque type de signaux a un comportement par défaut –Généralement: terminate ou ignore Peut être modifié en déclarant une fonction de gestion de signal spécifique –signal(sig, handler) Indique que le signal de type sig doit appeler la fonction handler handler retourne au point où lexception est survenue void int_handler(int sig) { printf("Process %d received signal %d\n", getpid(), sig); exit(0); } void fork13() { pid_t pid[N]; int i, child_status; signal(SIGINT, int_handler);... }

57 Exemple de gestion de signal Les signaux ne sont pas mis dans une file dattente –Pour chaque type de signal, un seul bit indique si un signal est survenu ou non –Donc un seul signal peut être en attente –Même si plusieurs processus envoient un même signal int ccount = 0; void child_handler(int sig) { int child_status; pid_t pid = wait(&child_status); ccount--; printf("Received signal %d from process %d\n", sig, pid); } void fork14() { pid_t pid[N]; int i, child_status; ccount = N; signal(SIGCHLD, child_handler); for (i = 0; i < N; i++) if ((pid[i] = fork()) == 0) { /* Child: Exit */ exit(0); } while (ccount > 0) pause();/* Suspend until signal occurs */ }

58 Exemple de gestion de signal (signal1.c)

59 Comment gérer les signaux multiples Il faut vérifier toute les sources possibles de signaux –Typiquement en bouclant sur une fonction wait() void child_handler2(int sig) { int child_status; pid_t pid; while ((pid = wait(&child_status)) > 0) { ccount--; printf("Received signal %d from process %d\n", sig, pid); } void fork15() {... signal(SIGCHLD, child_handler2);... }

60 Exemple de gestion de signal (signal2.c)

61 Un programme réagissant à des événements externes (ctrl-c) #include static void handler(int sig) { printf("You think hitting ctrl-c will stop the bomb?\n"); sleep(2); printf("Well..."); fflush(stdout); sleep(1); printf("OK\n"); exit(0); } main() { signal(SIGINT, handler); /* installs ctl-c handler */ while(1) { }

62 Un programme réagissant à des événements internes #include int beeps = 0; /* SIGALRM handler */ void handler(int sig) { printf("BEEP\n"); fflush(stdout); if (++beeps < 5) alarm(1); else { printf("BOOM!\n"); exit(0); } main() { signal(SIGALRM, handler); alarm(1); /* send SIGALRM in 1 second */ while (1) { /* handler returns here */ } bass> a.out BEEP BOOM! bass>


Télécharger ppt "SYSTÈME DEXPLOITATION I SIF-1015. Contenu du cours 6 Communication par tubes –Tube nommé (FIFO) IPC (Inter Process Communication) –Files de messages –Mémoire."

Présentations similaires


Annonces Google