chapitre 08. IPCs système V

Transcription

chapitre 08. IPCs système V
UNSA
UFR Sciences
Université de Nice Sophia-Antipolis
Département Informatique
Licence d’informatique et Maîtrise EEA – Module L3I6
Cours Système
et
Réseaux
Roger Rousseau
CNRS-UNSA/I3S
Version 4.1
Janvier 2006
08. COMMUNICATIONS INTERPROCESSUS
Chapitre 08
6.1 Introduction
IPCs Système V
(Inter Processus Communication)
Communications Interprocessus :
IPC
1) Introduction des IPCs Système V : ftok
Introduits dans la version Système V de Unix (années 80) :
✱ file de messages : msg
✱
segments de mémoire partagée : shm
✱
jeux de sémaphores : sem
Mécanismes semi-persistants :
2) Files de messages : msgget, msgsnd, msgrcv,
msgctl,
3) Segments de mémoire partagée : shmget, shmat,
shmdt, shmctl
✱
intégrés dans le noyau,
✱
durent au plus jusqu’au prochain arrêt du système :
=> occupent de la place dans le noyau,
si on oublie de les détruire après usage
4) Jeu de sémaphores : semget, semop, semctl
393
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
394
08. COMMUNICATIONS INTERPROCESSUS
Critique des IPC système V
Critique des IPC système V
6.1 Introduction
suite(1)
En fait, on peut s’en passer et n’utiliser que des mécanismes
typiquement Unix, en implémentant :
Ils ne sont pas bien intégrés aux concepts Unix :
✱
pas de fd, donc pas de possibilité d’utiliser les primitives
usuelles : open, read, write, fcntl, select, poll...
✱
file de messages : avec des tubes volatiles ou persistants,
✱
pas de position dans la hiérarchie des fichiers
(au sens large),
donc système d’identification très spécifique.
✱
segments de mémoire partagée : avec des associations (mapping) portant sur des fichiers partagés ( cf. mmap,
p. ?? )
✱
sémaphores : avec des tubes ou des verrous
395
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
396
08. COMMUNICATIONS INTERPROCESSUS
Sommaire des primitives
Manipulations spécifiques
Manipulations communes
6.1 Introduction
suite(1)
✱
msgsnd, msgrcv : envoi, réception d’un message
✱
msgget, shmget, semget : ouverture d’un IPC
✱
✱
msgctl, shmctl, semctl : contrôle de l’IPC
(≈ fstat, unlink , chmod...)
shmat, shmdt : attachement,
détachement d’un segment de mémoire
✱
semop : initialisation, réservation, libération de ressources
✱
ftok (3) : construction d’une clé d’identification
397
398
Commandes d’administration
Commande d’administration : ipcs (1)
suite(2)
ipcs { -q | -m | -s } -i id
✱
ips(1) : listage des IPC de l’utilisateur,
✱
iprm(1) : destruction des IPC de l’utilisateur.
listage de tous les attributs de l’IPC d’identifiant id,
dont le type est indiqué par l’argument obligatoire :
-q
queue,
-m
mémoire partagée,
-s
jeu de sémaphores.
399
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
Commande d’administration : ipcs
400
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
Commande d’admnistration : ipcrm (1)
suite(1)
ipcs [ -aqms ] [ -tclup ]
listage de certains attributs de tous les IPC du type indiqué
(par défauts, ou pour l’option -a : tous les types)
-u : attributs résumés,
ipcrm { shm | msg | sem } id ...
-p : PID du processus propriétaire (encore en vie) et du dernier acteur (pas forcément en vie),
-c : protections : permissions, uid, gid du créateur et du propriétaire,
demande de destruction des IPC du type et identifiants indiqués : la destruction sera effective lorsque l’IPC n’est plus
utilisé.
-t : dates (création, dernière opération...),
-l : limites (tailles, nombres maximum...).
401
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
402
08. COMMUNICATIONS INTERPROCESSUS
Identifiant externe et interne d’un IPC
6.1 Introduction
IPC privé ou public
✱
privés :
• utilisables seulement par des processus apparentés,
identifiant interne : un entier positif, l’équivalent d’un fd de
fichier, utilisé par toutes les primitives de manipulation.
identifiant externe, la clé : un entier positif, l’équivalent du
nom de chemin d’un fichier.
• accès à l’identifiant interne par héritage, lors des appels à fork .
✱
publics :
• utilisables par des processus non apparentés, donc
IPC semi-persistants (détruits à chaque boot),
L’identifiant interne est rendu par le système à partir de la clé,
lors de l’ouverture de l’IPC par une primitive de type XXXget
(XXX= MSG, SHM, SEM).
• souvent propres à un groupe de processus complices,
organisés en projet.
403
404
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
08. COMMUNICATIONS INTERPROCESSUS
ftok (3)
Clé d’identification d’un IPC
Les IPC privés s’obtiennnent avec une clé spéciale :
IPC_PRIVATE.
Les IPC publics doivent être créés avec une clé spécifique,
connue des différents processus utilisateurs :
✱
placée dans un fichier commun,
✱
compilée, placée dans un fichier d’en-tête commun,
✱
construite par la fonction ftok (3).
6.1 Introduction
405
✱
Syntaxe :
#inlude <sys/ip.h>
key_t ftok ( har* nom_hemin, har projet )
✱
Retour :
• clé, si OK,
• -1, si erreur
✱
Arguments :
• nom_chemin : pour ancrer l’IPC dans la hiérarchie
de fichiers et bénéficier de son mécanisme de protection,
• projet : pour distinguer différents groupes de processus.
406
strut ip_perm
Contrôle d’accès à un IPC :
suite(1)
struct ipc_perm
✱
Syntaxe :
#inlude <sys/ip.h>
strut ip_perm {
ushort uid ; /* UID du réateur */
ushort gid; /* GID du réateur */
ushort uid; /* UID du propriétaire */
ushort gid; /* GID du propriétaire */
ushort mode; /* Permissions r/w */
key_t key; /* Clé d'identifiation externe */
}
✱
Sémantique :
• On distingue l’identité du créateur et du propriétaire
(car il n’y a pas de commande chown),
• Les permissions sont indiquées par 9 bits, et correspondent (comme pour les fichiers) aux permissions
r, w, x du propriétaire, de son groupe ou des autres.
• mais la permission x n’est pas utilisée !
407
08. COMMUNICATIONS INTERPROCESSUS
6.1 Introduction
408
08. COMMUNICATIONS INTERPROCESSUS
Valeurs limites des IPCs
Valeurs limites des IPCs
✱
Elles sont affichables par la commande : ips -l.
Les valeurs indiquées sont des exemples pour Linux 2.4.3.
✱
6.1 Introduction
suite(1)
segments de mémoire partagée : (définies dans sys/shm.h)
• SHMMAX : taille maximum totale des segments : 8 Go
• SHMMNI : nb maximum total de segments : 4096
file de messages : (définies dans sys/msg.h)
• SHMSEG : nb maximum de segments partagés par processus : 4096
• MSGMNI : nb maximum de files dans le système : 16
• MSGMAX : taille maximum d’un messages : 8192 octets
• SHMALL : taille maximum d’un segment : 32 Mo
• MSGMNB : taille maximum par défaut d’une file : 16384
octets
• SHMMIN : taille minimum d’un segment : 1 o
409
08. COMMUNICATIONS INTERPROCESSUS
Valeurs limites des IPCs
✱
6.1 Introduction
410
08. COMMUNICATIONS INTERPROCESSUS
6.2 File de messages
Files (ou queues) de messages
suite(2)
Consommateurs
jeux de sémaphores : (définies dans sys/sem.h)
• SEMMNI : nb maximum de jeux de sémaphores : 128
File
• SEMMSL : nb maximum de sémaphores par jeu : 250
t0 l1
• SEMMNS nb maximum total de sémaphores par système
: 32 000
message 1
t1 l2 mess 2
message 3
t0 l3
• SEMOPM nb maximum d’actions par primitive semop :
32
t2 l4
message 4
• SEMVMX valeur max des compteurs de sémaphores :
32 767
Producteurs
411
08. COMMUNICATIONS INTERPROCESSUS
6.2 File de messages
412
08. COMMUNICATIONS INTERPROCESSUS
Production de messages
✱
6.2 File de messages
Consommation de messages
taille des message bornée, toujours < taille des files
✱
écriture atomique,
✱
suspension des producteurs, s’il n’y a pas assez de place
dans la file.
413
✱
lecture atomique,
✱
possibilité de choisir un message disponible ou attendu,
selon un critère de préférence (priorité).
✱
suspension des consommateurs, s’il n’y a pas de message adéquate,
414
Création / ouverture d’une file : msgget (2)
✱
✱
✱
Syntaxe :
#inlude <sys/ip.h>
int msgget ( key_t key, int msgflag )
Création d’une file avec msgget
✱
Retour :
• identifiant interne si OK,
• -1, si erreur
6.2 File de messages
Sémantique (suite) :
• Si key = IPC_PRIVATE, crée une file privée, sans tenir
compte de msgflag.
• Sinon, il faut IPC_CREAT présent :
⊲ Si IPC_EXCL est présent : création d’une file si
key n’existe pas, sinon erreur,
Sémantique :
• crée ou ouvre une file de messages, selon msgflag
qui combine (opérateur |) les constantes IPC_CREAT
et IPC_EXCL (comme O_CREAT et O_EXCL pour open)
et les permissions définies par les 9 bits de poids
faible.
415
08. COMMUNICATIONS INTERPROCESSUS
suite(1)
⊲ Si IPC_EXCL est absent : création d’une file,
même si key existe.
• la file crée est vide.
416
08. COMMUNICATIONS INTERPROCESSUS
Attributs de file de messages :
6.2 File de messages
Création d’une file avec msgget
suite(1)
struct msqid_ds
✱
✱
Syntaxe :
#inlude <sys/msg.h> /* dépend en partie du système */
strut msqid_ds { /* si ! pas msgid_ds ??? */
strut ip_perm msg_perm;/* permissions d'usage */
ushort msg_qnum; /* nb de messages dans la file */
ushort msg_bytes; /* nb de bytes dans file */
ushort msg_qbytes; /* nb max de bytes ds la file */
pid_t msg_lspid; /* pid du dernier msgsnd */
pid_t msg_lrpid; /* pid du dernier msgrv */
time_t msg_stime; /* instant du dernier msgsnd */
time_t msg_rtime; /* instant du dernier msgrv */
time_t msg_time; /* dernier hangement (msgntl) */
};
Sémantique (suite) :
• Initialisation des attributs de la file créée :
⊲
msg_perm.uid et msg_perm.uid : EUID du processus appelant,
⊲
msg_perm.gid et msg_perm.gid : EGID du processus appelant,
⊲
msg_perm.mode : les 9 bits de poids faible de msgflag,
⊲
msg_qnum, msg_bytes, msg_lspid, msg_lrpid, msg_stime,
msg_rtime : 0.
⊲
msg_time : l’heure actuelle,
⊲
msg_qbytes : limite système MSGMNB.
417
08. COMMUNICATIONS INTERPROCESSUS
6.2 File de messages
Ouverture d’une file avec msgget
✱
418
08. COMMUNICATIONS INTERPROCESSUS
6.2 File de messages
Structure d’un message : struct msgbuf
suite(2)
✱
Syntaxe :
#inlude <sys/msg.h>
strut msgbuf {
long int mtype; /* type du message */
har mtext[ ℄; /* ontenu du message */
};
✱
Sémantique :
• mtype : entier positif choisi par le producteur
(cf. msgsnd), comme critère éventuel de choix par
les consommateurs (cf. msgrcv ),
Sémantique (suite) :
• Si key existe et IPC_CREAT est absent : ouvre la file.
• On vérifie les droits d’accès du processus et si une
demande de destruction est en cours,
• Il n’y a pas d’indication d’usage, pour exprimer si le
processus veut être producteur ou consommateur
de messages.
• mtext : contenu du message
(sa taille est implicitement connue des processus).
419
08. COMMUNICATIONS INTERPROCESSUS
6.2 File de messages
420
08. COMMUNICATIONS INTERPROCESSUS
Envoi d’un message : msgsnd (2)
✱
✱
✱
msgsnd
Syntaxe :
#inlude <sys/msg.h>
int msgsnd (int msgid, strut msgbuf* msgp,
int msgsz, int msgflg )
✱
Retour :
• 0, si OK,
• -1, si erreur ou échec (errno)
Sémantique :
• Envoie sur la file msgid le message msgp de taille
msgsz, selon l’option msgflg : IPC_NOWAIT ou 0.
421
6.2 File de messages
suite(1)
Sémantique (suite) :
• Le processus doit avoir la permission d’écriture sur
la file,
• Si la taille indiquée du message est inférieure à la
taille maximum d’un message (msg_qbytes), le message est déposé dans celle-ci, avec mise à jour des
attributs msg_lspid, msg_qnum, msg_stime.
422
msgsnd
✱
Réception d’un message : msgrcv (2)
suite(2)
✱
Syntaxe :
#inlude <sys/msg.h>
int msgrv (int msgid, strut msgbuf* msgp,
int msgsz, long msgtyp, int msgflg )
✱
Retour :
• taille du message lu si OK,
• -1, si erreur ou échec (errno)
✱
Sémantique :
• lit sur la file msgid un message de type msgtyp dans le tableau msgp->mtext de taille msgsz,
selon l’option msgflg : IPC_NOWAIT, IPC_NORROR,
IPC_EXCEPT ou 0.
Sémantique (suite) :
• Sinon :
⊲ si IPC_NOWAIT, échec et errno = EAGAIN
⊲ sinon
le
processus
est
jusqu’à :
◦ qu’il y ait assez de place => OK
suspendu
◦
file détruite => échec + errno = EIDRM
◦
réception d’un signal => échec + errno =
EINTR
423
08. COMMUNICATIONS INTERPROCESSUS
msgrcv
✱
6.2 File de messages
424
08. COMMUNICATIONS INTERPROCESSUS
msgrcv
suite(1)
Sémantique (suite) :
• msgtyp sert à la sélection du message :
⊲ msgtyp = 0 :
1er message, côté lecture,
✱
⊲ msgtyp > 0 :
◦ pas d’option IPC_EXCEPT :
1er message du type msgtyp
◦
6.2 File de messages
suite(2)
Sémantique (suite) :
• Si aucun message dans la file ne satisfait le critère
msgtyp :
⊲ IPC_NOWAIT : échec + errno = ENOMSG
⊲ sinon, attente jusqu’à :
◦ message d’un type désiré arrive,
option IPC_EXCEPT (SAUF) :
1er message d’un type 6= msgtyp
⊲ msgtyp < 0 :
1er message d’un type t tel que t ≤ | msgtyp |
◦
file supprimée => échec + errno = EIDRM
◦
le processus reçoit un signal => échec +
errno = EINTR
425
08. COMMUNICATIONS INTERPROCESSUS
msgrcv
✱
6.2 File de messages
426
08. COMMUNICATIONS INTERPROCESSUS
6.2 File de messages
Contrôle d’un message : msgctl (2)
suite(3)
Sémantique (suite) :
• Le processus doit avoir la permission de lecture sur
la file,
✱
• Si msgsz est supérieur à la taille du message, le
message est placé dans msgp->mtext, avec mise
à jour de msg_lrpid, msg_qnum, msg_rtime, msgp>mtype.
Syntaxe :
#inlude <sys/msg.h>
int msgtl ( int msgid, int md,
strut msqid_ds* buf )
✱
Retour :
• 0, si OK,
• -1, si erreur (errno)
• Sinon :
⊲ si MSG_NOERROR, troncature
✱
Sémantique :
• selon cmd : consulte ou modifie les attributs ou demande la destruction de la file msgid.
⊲ sinon échec (errno == E2BIG) et le message restera dans la file.
427
08. COMMUNICATIONS INTERPROCESSUS
msgctl
✱
6.2 File de messages
428
08. COMMUNICATIONS INTERPROCESSUS
msgctl
suite(1)
Sémantique (suite) :
• cmd = IPC_STAT : copie les attributs de la file dans
la structure pointée par buf.
• cmd = IPC_SET : copie certains des champs de la
structure pointée par buf dans les attributs de la file :
msg_perm.uid, msg_perm.gid, msg_perm.mode (9
bits de poids faible), msg_qbytes.
429
✱
6.2 File de messages
suite(2)
Sémantique (suite) :
• cmd = IPC_RMID : supprimer immédiatement la file,
en réveillant les processus producteurs ou consommateurs en attente.
• L’EUID du processus doit être SU ou le créateur ou
le propriétaire. Seul SU peut augmenter msg_qbytes
> MSGMNB.
430
Introduction aux segments shm
Segments de mémoire partagée : shm
Noyau du système
✱
Taille demandée : de 1 octet à quelques 10 ko
✱
Taille effective : arrondie supérieurement à un nombre
entier de pages.
✱
Attachement:
attachement des segments
• les segments sont placés dans les mémoires virtuelles
des processus
• à une adresse choisie par le programmeur ou le système,
• adresse arrondie inférieurement à une frontière de
page.
Mémoires virtuelles des processus
431
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
Introduction aux segments shm
✱
432
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
Introduction aux segments shm
suite(1)
✱
Utilisation parallèle :
=> nécessite une exclusion mutuelle :
suite(2)
Effet des autres primitives système :
• entre les écritures et écritures,
• après fork : le processus fils hérite des segments de
mémoire partagée de son père,
• entre écritures et lectures.
• après exec, exit : tous les segments sont détachés.
433
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
Introduction aux segments shm
✱
434
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
Création / ouverture d’un shm : shmget (2)
suite(3)
Double protection d’usage :
✱
Syntaxe :
#inlude <sys/ip.h>
int shmget (key_t key, int size, int shmflag )
✱
Retour :
• identifiant interne si OK,
• -1, si erreur
✱
Sémantique :
• crée ou ouvre un segment de mémoire partagée de
taille size, selon shmflag qui combine (opérateur |)
les constantes IPC_CREAT et IPC_EXCL et les permissions définies par les 9 bits de poids faible.
• un processus doit déclarer son intention de lire ou
écrire au moment de l’attachement,
• de plus, il doit avoir les permissions pour les usages
déclarés.
435
08. COMMUNICATIONS INTERPROCESSUS
shmget
✱
6.3 Mémoire partagée
au
08. COMMUNICATIONS INTERPROCESSUS
multiple
6.3 Mémoire partagée
Création d’un shm avec shmget
suite(1)
Sémantique (suite) :
• key est la clé externe d’identification,
• size est arrondie
PAGE_SIZE,
436
✱
supérieur
de
• PAGE_SIZE est donnée par getpagesize()
(4096 sous Linux).
• les conditions de création, d’ouverture d’un segment
ou d’erreur dépendent, comme msgget des valeurs
de key , de l’existence du segment et de shmflag.
437
suite(2)
Sémantique (suite) :
• Si key = IPC_PRIVATE, crée un segment privé, sans
tenir compte de shmflag.
• Sinon, il faut que IPC_CREAT soit présent dans shmflag :
⊲ Si IPC_EXCL est présent : création d’un segment
partageablesi key n’existe pas, sinon erreur,
⊲ Si IPC_EXCL est absent : création d’un segment
partageable, même si key existe.
438
Attributs d’un shm : struct shmid_ds
✱
Création d’un shm avec shmget
✱
Syntaxe :
#inlude <sys/shm.h> /* dépend en partie du système */
strut shmid_ds {
strut ip_perm shm_perm;/* permissions d'usage */
int shm_segsz; /* taille segment en otets */
short shm_natth; /* nb d'attahements */
pid_t shm_pid; /* pid du réateur */
pid_t shm_dpid; /* pid du dernier opérateur */
time_t shm_atime; /* instant du dernier shmat */
time_t shm_dtime; /* instant du dernier shmdt */
time_t shm_time; /* dernier hangement (shmntl) */
};
Sémantique (suite) :
• Initialisation
des
créé :
attributs
du
suite(1)
segment
⊲
shm_perm.uid et shm_perm.uid avec le EUID du processus appelant,
⊲
shm_perm.gid et shm_perm.gid avec le EGID du processus appelant,
⊲
shm_perm.mode avec les 9 bits de poids faible de shmflag,
⊲
shm_segsize prend la valeur size,
⊲
shm_lpid, shm_natth, shm_atime, shm_dtime à 0.
⊲
shm_time à l’heure actuelle,
439
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
Ouverture d’un shm avec shmget
✱
440
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
Attachement d’un segment : shmat (2)
suite(2)
Sémantique (suite) :
• Si key existe et IPC_CREAT est absent : ouvre le segment.
✱
Syntaxe :
#inlude <sys/shm.h>
int shmat ( int shmid, har* shmaddr, int shmflg )
✱
Retour :
• adresse d’attachement si OK,
• -1, si erreur ou échec (errno)
✱
Sémantique :
• attache le segment de mémoire partagée shmid à
une adresse déterminée selon shmaddr et shmflg.
• On vérifie les droits d’accès du processus et si une
demande de destruction est en cours,
• Il n’y a pas d’indication d’usage, pour exprimer si le
processus veut lire ou écrire dans le segment.
441
08. COMMUNICATIONS INTERPROCESSUS
shmat
✱
6.3 Mémoire partagée
442
08. COMMUNICATIONS INTERPROCESSUS
shmat
suite(1)
Sémantique (suite) :
• si shmaddr = 0, le système essaie de trouver une
zone libre dans l’intervalle [1 Go .. 1.5 Go], en commençant par les adresses hautes et en descendant
jusqu’à trouver cet emplacement.
✱
6.3 Mémoire partagée
suite(2)
Sémantique (suite) :
• SHM_RDONLY ∈ shmflg, le segment est attaché en lecture seule et le processus doit avoir le droit de lecture,
• sinon le segment est ataché en lecture-écriture et le
processus doit avoir la permission.
• si shmaddr > 0 et SHM_RND ∈ shmflg, attachement à
l’adresse shmaddr arrondie au multiple inférieur de
SHMLBA.
• brk du processus n’est pas modifié.
• si shmaddr > 0 et SHM_RND 6∈ shmflg, attachement
à l’adresse shmaddr qui doit être un multiple de
PAGE_SIZE.
• si l’attachement réussit, les attributs suivants sont
mis à jour : shm_atime, shm_lpid, shm_natth
443
08. COMMUNICATIONS INTERPROCESSUS
6.3 Mémoire partagée
444
08. COMMUNICATIONS INTERPROCESSUS
Contrôle d’un segment : shmctl (2)
Détachement d’un segment : shmdt (2)
✱
✱
✱
6.3 Mémoire partagée
Syntaxe :
#inlude <sys/shm.h>
int shmdt ( har* shmaddr )
Retour :
• 0, si OK,
• -1, si erreur (errno)
Sémantique :
• le segment attaché à l’adresse shmaddr est détaché, s’il existe,
• les attributs suivants sont alors mis à jour :
shm_dtime, shm_lpid, shm_natth.
• sinon, erreur avec errno == EINVAL
445
✱
Syntaxe :
#inlude <sys/shm.h>
int shmtl (int shmid, int md, strut shmid_ds* buf )
✱
Retour :
• 0, si OK,
• -1, si erreur (errno)
✱
Sémantique :
• selon cmd : consulte, modifie les attributs ou demande la destruction du segment shmid.
446
shmctl
✱
shmctl
suite(1)
Sémantique (suite) :
• cmd = IPC_STAT : copie les attributs du segment
dans buf (strut shmid_ds).
Le processus doit avoir le droit de lecture du segment.
✱
suite(2)
Sémantique (suite) :
• cmd = IPC_RMID : demande de destruction du segment après le dernier détachement.
• Le processus doit être SU , le créateur ou le propriétaire.
• cmd = IPC_SET : copie certains champs de la
structure buf dans les attributs du segment :
shm_perm.uid, shm_perm.gid, shm_perm.mode.
Le processus doit être SU , le créateur ou le propriétaire.
• Attention ! le contenu d’un segment détruit n’est
pas effacé, il peut être lu lors d’une création d’un
nouveau segment.
447
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
448
08. COMMUNICATIONS INTERPROCESSUS
Rappels sur les sémaphores
Jeux de sémaphores (Unix)
✱
Les sémaphores sont des mécanismes de contrôle de
l’accès à des ressources, introduits par Dijkstra en 1968
pour le système the.
✱
Les sémaphores de Dijkstra sont des compteurs indépendants, avec file d’attente et deux primitives de manipulation P(argsem) pour acquérir et V(sem) pour libérer des
ressources quantifiables, utilisables par plusieurs processus en compétition : nb de pages mémoire, d’appareils...
✱
Contrairement à d’autres mécanismes (moniteurs...),
l’utilisation des sémaphores est facultative : les processus doivent être disciplinés.
✱
Ils permettent d’acquérir ou de libérer, de manière atomique, des quantités de ressoures de plusieurs espèces.
✱
Les manipulations ne portent pas sur un seul sémaphore,
mais sur une sélection de sémaphores choisis dans un
jeu de sémaphores : un ensemble, représenté par un tableau de structures.
✱
D’autres mécanismes complètent les primitives de Dijkstra : attente facultative, attente de fin, undo...
✱
Les jeux de sémaphores sont riches en possibilités,
mais complexes à utiliser...
449
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
Jeux de sémaphores
+1
−2
0
+2
1
2
3
sem_val
sem_val
sem_val
sem_val
sem_pid
sem_pid
sem_pid
sem_pid
08. COMMUNICATIONS INTERPROCESSUS
✱
Sur option, on peut libérer automatiquement les ressources
acquises par un processus, lors de sa terminaison.
✱
Cela nécessite de comptabiliser les ressources acquises
pour chaque sémaphore manipulé par le processus :
−7
n−1
...
6.4 Jeu de sémaphores
Gestion des options undo sur sémaphores
Pq
+3
450
suite(1)
...
P1
6.4 Jeu de sémaphores
sem_val
• chaque descripteur de processus gère une liste chaînée de compteurs undo (placés dans une strut sem_undo),
qui comptabilisent les ressources acquises,
sem_pid
Jeu de sémaphores
sem_perm
sem_otime
sem_nsems
sem_undo
• ces compteurs doivent être mis à jour à chaque acquisition ou libération de ressources.
10:42:37.833
n
...
Attributs
• les strut sem_undo d’un processus sont détruites lors
de sa terminaison.
452
3
451
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
Critique des options undo sur sémaphores
✱
Ce mécanisme est criticable :
08. COMMUNICATIONS INTERPROCESSUS
Création / ouverture d’un jeu : semget (2)
✱
Syntaxe :
#inlude <sys/sem.h>
int semget ( key_t key, int nsems, int semflag )
✱
Retour :
• identifiant interne si OK,
• -1, si erreur
✱
Sémantique :
• crée ou ouvre un jeu de nsems sémaphores, selon
semflag qui combine (opérateur |) les constantes
IPC_CREAT et IPC_EXCL (comme O_CREAT et O_EXCL
pour open) et les permissions définies par les 9 bits
de poids faible.
• le terme undo est inapproprié,
• sémantique non usuelle pour les sémaphores
• gestion non automatique : les processus doivent être
disciplinés à fournir les options strut sem_undo,
• sémantique pas claire pour l’attente...
✱
Pour les opération avec l’option undo, Linux choisit :
• d’effectuer celles qui réussissent immédiatement,
• d’ignorer silencieusement les autres.
453
6.4 Jeu de sémaphores
454
Création d’un jeu avec semget
✱
Attributs d’un jeu de sémaphores :
suite(1)
Sémantique (suite) :
• Si key = IPC_PRIVATE, crée un jeu privé, sans tenir
compte de semflag.
struct semid_ds
✱
• Sinon, il faut IPC_CREAT présent :
⊲ Si IPC_EXCL est présent : création d’un jeu si
key n’existe pas, sinon erreur,
⊲ Si IPC_EXCL est absent : création d’un jeu,
même si key existe.
• Attention ! les sémaphores du jeu ne sont pas initialisés ! Utiliser semctl avec SETVAL ou SETALL pour
l’initialisation.
Syntaxe :
#inlude <sys/sem.h> /* dépend en partie du système */
strut semid_ds {
strut ip_perm sem_perm;/* permissions d'usage */
time_t sem_otime; /* instant du dernier semop */
time_t sem_time; /* dernier semntl / semget ) */
ushort sem_nsems; /* nb de sémaphores dans le jeu */
strut sem sem_base[ ℄; /* jeu de sémaphores */
strut sem_queue* sem_pending; /* opérations en suspens */
strut sem_queue** sem_pending_last; /* dern. op. en suspens */
strut sem_undo* undo; /* nb de ompteurs undo sur e jeu */
};
455
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
456
08. COMMUNICATIONS INTERPROCESSUS
Ouverture d’un jeu avec semget
Création d’un jeu de sémaphores avec
semget suite(1)
✱
✱
Sémantique (suite) :
• Initialisation des attributs du jeu créé :
⊲
sem_perm.uid et sem_perm.uid : EUID du processus appelant,
⊲
sem_perm.gid et sem_perm.gid : EGID du processus appelant,
⊲
sem_perm.mode : les 9 bits de poids faible de semflag,
⊲
sem_nsems : nsems,
⊲
sem_time : l’heure actuelle,
⊲
sem_otime : 0
6.4 Jeu de sémaphores
suite(2)
Sémantique (suite) :
• Si key existe et IPC_CREAT est absent : ouvre le jeu
de sémaphores.
• On vérifie les droits d’accès du processus et si une
demande de destruction est en cours,
• Il n’y a pas d’indication d’usage, pour exprimer si le
processus veut acquérir ou libérer des ressources
sur les sémaphores.
457
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
458
08. COMMUNICATIONS INTERPROCESSUS
Structure d’un sémaphore : struct sem
6.4 Jeu de sémaphores
Manipulations de sémaphores :
semop (2), struct sembuf
✱
✱
Syntaxe :
#inlude <sys/sem.h>
int semop ( int semid,
strut sembufsops [ ℄, unsigned nsops )
strut sembuf {
short sem_num; /* n◦du sémaphore (0=premier) */
short sem_op; /* opération sur le sémaphore */
short sem_flg; /* option pour l'opération */
}
✱
Retour :
• 0, si OK,
• -1, si erreur ou échec (errno)
Syntaxe :
#inlude <sys/sem.h>
strut sem {
int semval; /* valeur ourante du sémaphore */
pid_t sempid; /* pid de la dernière opération */
}
459
08. COMMUNICATIONS INTERPROCESSUS
semop
6.4 Jeu de sémaphores
460
08. COMMUNICATIONS INTERPROCESSUS
semop
suite(1)
✱
nsops
sem_num
sem_num
sem_num
sem_op
sem_op
sem_op
sem_flag
sem_flag
sem_flag
sem_num
...
sem_op
sem_flag
6.4 Jeu de sémaphores
suite(2)
Sémantique :
• opérations individuelles sur les nsops sémaphores
de semid dans la liste sops (tableau).
• Chaque entrée de type strut sembuf indique le
n◦du sémaphore, l’opération à effectuer et une option éventuelle (IPC_NOWAIT ou SEM_UNDO).
• Chaque opération n’est effective que si toutes réussissent.
• L’option SEM_UNDO précise que l’opération doit être
annulée à la terminaison du processus.
semops
461
462
semop
✱
semop (2) : libération, ajout de resources
suite(3)
Sémantique :
• L’opération sur chaque sémaphore sélectionné dépend de la valeur de sem_op :
⊲ sem_op > 0 : libère, ajoute sem_op ressources au
sémaphore,
✱
⊲ sem_op < 0 : demande d’acquisition, de retrait de
|sem_op| ressources au sémaphore,
Sémantique (suite) :
• sem_op > 0 : libère, ajoute sem_op ressources au sémaphore : semval += sem_op.
⊲ si l’option SEM_UNDO est demandée, met à jour
le compteur undo du processus pour ce sémaphores.
⊲ l’ajout de ressources n’est jamais blocant.
⊲ sem_op == 0 : attente de fin, d’épuisement de
ressources (qu’il n’y en ait plus, compteur nul).
⊲ il faut le droit d’écriture sur le jeu de sémaphores
pour un ajout.
463
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
semop (2) : demande de retrait de resources
464
08. COMMUNICATIONS INTERPROCESSUS
semop (2) : retrait immédiat de resources
✱
✱
6.4 Jeu de sémaphores
Sémantique (suite) :
• sem_op < 0 : demande d’acquisition, de retrait de
|sem_op| ressources, avec attente éventuelle.
Sémantique (suite) :
• sem_op < 0 : demande de retrait de |sem_op| ressources
• si semval >= |sem_op|, retrait immédiat possible...
• on retire |sem_op| ressources au sémaphore
semval -= |sem_op|
• le processus doit avoir le droit d’écriture sur le jeu
de sémaphores
• si l’option SEM_UNDO est demandée,
met à jour le compteur undo du processus pour ce
sémaphore.
465
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
466
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
semop (2) : attente de resources
semop (2) : retrait différé de ressources
✱
Sémantique (suite) : pas de retrait immédiat
• sem_op < 0 : demande de retrait de |sem_op| ressources, mais
✱
• Si semval < |sem_op|, le retrait demandé n’est pas
encore possible :
⊲ Si l’option IPC_NOWAIT est demandée :
échec et errno = EAGAIN
Sémantique (suite) :
• L’attente de ressources dure jusqu’à
que:
⊲ semval >= |sem_op| :
semnnt--, semval -= |sem_op|
si l’option SEM_UNDO est demandée,
met à jour le compteur undo du processus.
⊲ la réception d’un signal :
semnnt-- et échec et errno == EINTR
467
6.4 Jeu de sémaphores
semop (2) : attente de fin de ressources
✱
ce
⊲ le jeu soit supprimé => échec + errno == EIDRM
⊲ Si l’option IPC_NOWAIT n’est pas demandée :
semnt-- et attente de ressources...
08. COMMUNICATIONS INTERPROCESSUS
:
468
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
semop : attente de fin de ressources
Sémantique (suite) :
• sem_op == 0 : attente que le compteur semval du
sémaphore soit nul.
⊲ semval == 0 : pas d’attente.
⊲ semval > 0 && IPC_NOWAIT : échec de l’appel
(donc de toutes les opérations sur les autres sémaphores sélectionnés) et errno == EAGAIN (pas
d’attente).
⊲ semval > 0&& non IPC_NOWAIT :
attente du processus et semznt++
✱
suite(1)
Sémantique (suite) :
• L’attente persiste jusqu’à :
⊲ semval == 0 : semznt-⊲ destruction du jeu de sémaphores : échec de
l’appel errno == EIDRM
⊲ réception d’un signal non masqué : semznt-- et
errno == EINTR
• Le processus doit avoir le droit de lecture sur le jeu.
469
470
semctl
Contrôle d’un jeu de sémaphores :
suite(1)
semctl (2), union semun
✱
Syntaxe :
#inlude <sys/sem.h>
int semtl ( int semid, int semno, int md,
union semnum arg )
semno : n◦du sémaphore utilisé, seulement pour
GETNCNT GETPID GETVAL GETZCNT SETVAL
union semun {
int val ;
/* pour SETVAL */
strut semid_ds* buf ; /* pour IPC_STAT IPC_SET */
ushort array[ ℄ ;
/* pour GETALL SETALL */
}
✱
Sémantique :
• selon cmd effectue de nombreuses opérations sur
l’ensemble de sémaphores ou sur le ...
• cmd peut prendre des valeurs
⊲ communes aux IPC : IPC_STAT, IPC_SET,
IPC_RMID
⊲ spécifiques aux sémaphores : GETALL, GETNCNT,
GETPID, GETVAL, GETZCNT, SETALL, SETVAL
• Critique : sémantique fourre-tout, d’où syntaxe et
valeurs retournées fourre-tout...
471
08. COMMUNICATIONS INTERPROCESSUS
semctl
6.4 Jeu de sémaphores
472
08. COMMUNICATIONS INTERPROCESSUS
semctl
suite(2)
✱
✱
Valeurs retournées :
• 0, si OK (IPC_XXX, SETXXX, GETALL)
• la valeur semnnt, si GETNCNT,
6.4 Jeu de sémaphores
suite(3)
Sémantique (suite) :
• cmd = IPC_STAT : rend les attributs de semid dans
la structure pointée par arg.buf.
• cmd = IPC_SET : copie les champs sem_perm.uid,
sem_perm.gid, sem_perm.mode (9 bits poids fbe), de
la structure arg.buf dans les attributs du jeu.
Mise à jour de sem_time.
• la valeur sempid, si GETPID,
• la valeur semval, si GETVAL,
• la valeur semznt, si GETZCNT,
• cmd = IPC_RMID :
supprime le jeu de sémaphores, en réveillant les
processus en attente (échec + errno == EIDRM).
• -1, si erreur (errno)
473
08. COMMUNICATIONS INTERPROCESSUS
semctl
✱
6.4 Jeu de sémaphores
474
08. COMMUNICATIONS INTERPROCESSUS
semctl
suite(4)
Sémantique (suite) :
• cmd = GETPID :
rend sempid, (PID du dernier processus ayant exécuté semop) sur le semno_ième sémaphore du jeu.
✱
• cmd = GETNCNT :
rend semnnt, i.e. le nb de processus en attente sur
le semno_ième sémaphore du jeu.
6.4 Jeu de sémaphores
suite(5)
Sémantique (suite) :
• cmd = GETVAL :
la valeur du compteur du
rend semval, i.e.
semno_ième sémaphore du jeu.
• cmd = GETALL :
rend dans arg.array les valeurs semval de tous les
compteurs des sémaphores du jeu.
• cmd = GETZCNT :
rend semznt, i.e. le nb de processus en attente de
fin de ressources pour le semno_ième sémaphore
du jeu.
475
08. COMMUNICATIONS INTERPROCESSUS
semctl
✱
6.4 Jeu de sémaphores
476
08. COMMUNICATIONS INTERPROCESSUS
6.4 Jeu de sémaphores
semctl (2) : protections
suite(6)
Sémantique (suite) :
• cmd = SETVAL :
initialise le compteur du semno_ième sémaphore du
jeu avec arg.val.
Mise à jour de sem_time.
Réveil des processus en attente de ressources.
• cmd = SETALL :
initialise les compteurs des sémaphores du jeu avec
le tableau de valeurs arg.array.
Mise à jour de sem_time.
Réveil des processus en attente de ressources.
477
✱
Les commandes de consultation (IPC_STAT, GETXXX) du
jeu de sémaphores requièrent le droit de lecture du jeu.
✱
Les commandes de modification ( SETXXX ) du jeu de
sémaphores requièrent le droit d’écriture du jeu.
✱
Les commandes
• de changement des permissions (IPC_SET)
• ou de destruction (IPC_RMID)
requièrent que le EUID du processus appelant soit le
créateur ou le propriétaire ou l’admnistrateur.
478
Table des matières

Documents pareils