Вы находитесь на странице: 1из 28

Cours systme dexploitation

2me anne
IUT de Caen, Dpartement dInformatique
(Franois Bourdon)

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Chapitre 5
Echange de donnes entre Processus :
les Tubes et les Verrous

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Plan
1.Systme de Gestion des Fichiers : Concepts
avancs
2.Cration et ordonnancement de Processus
3.Synchronisation de Processus
4.Communication entre Processus : les Signaux
5.Echange de donnes entre Processus.
5.1 Les tubes
5.2 Les verrous
6.Communication entre Processus : les IPC

Cours Systme dExploitation IUT de Caen

Franois Bourdon

5.1 Les tubes


La commande "ps a | wc l" entrane la cration de
deux processus concurrents (allocation du processeur). Un
tube est cr dans lequel les rsultats du premier processus
("ps a") sont crits. Le second processus lit dans le tube.
Lorsque le processus crivain se termine et que le
processus lecteur dans le tube a fini dy lire (le tube est
donc vide et sans lecteur), ce processus dtecte une fin de
fichier sur son entre standard et se termine.
Le systme assure la synchronisation de lensemble
dans le sens o :
il bloque le processus lecteur du tube lorsque
le tube est vide en attendant quil se remplisse
(sil y a encore des processus crivains);
il

bloque

(ventuellement)

le

processus

crivain lorsque le tube est plein (si le lecteur est


plus lent que lcrivain et que le volume des
rsultats crire dans le tube est important).

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Le systme assure limplmentation des tubes. Il est


charg de leur cration et de leur destruction.
Un tube de communication (|) permet de mmoriser
des informations. Il se comporte comme une file FIFO,
do son aspect unidirectionnel.
Un tube est presque identique un fichier ordinaire. Il
est caractris par :
son numro dinoeud (sur le disque
logique des tubes) ;
aucune rfrence dans le systme de fichier
(fichier anonyme);
deux descripteurs de fichiers (lecture et
criture);
sa taille limite (nombre dadresses directes
que contient un noeud du systme de fichier) :
do la notion de tube plein;
Cours Systme dExploitation IUT de Caen

Franois Bourdon

deux extrmits, permettant chacune soit de


lire dans le tube, soit dy crire;
au plus deux entres dans la table des
fichiers ouverts (une pour la lecture et une
pour lcriture);
lopration de lecture dans un tube est
destructrice : une information ne peut tre lue
quune seule fois dans un tube;

communication dun flot continu de

caractres (STREAM) : les envois successifs


dinformations dans un tube apparaissent du
point de vue de leur extraction comme une
seule et mme mission, do la possibilit de
raliser les oprations de lecture dans un tube
sans relation avec les oprations dcriture ;
critures

lectures

Cours Systme dExploitation IUT de Caen

Franois Bourdon

le nombre de lecteurs : cest le


nombre de descripteurs associs lentre
en lecture sur le tube (dans la table des
fichiers ouverts). La nullit de ce nombre
interdit toute criture sur le tube ;
le nombre dcrivains : cest le
nombre de descripteurs associs lentre
en criture sur le tube dans la table des
fichiers ouverts. La nullit de ce nombre
dtermine

le

comportement

de

la

primitive read lorsque le tube est vide et


permet en particulier de dfinir la notion
de "fin de fichier" sur un tube.
Limpossibilit pour ce nombre de devenir nul (par
suite dune erreur de programmation) est susceptible de
conduire des situations dinterblocage (deadlock) dun
ensemble de processus.

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Il existe deux sortes de tube :


les tubes ordinaires ou nonnomms et
les tubes nomms (FIFO).
Nous venons de dcrire les tubes ordinaires. Les tubes
nomms possdent une rfrence dans le systme de fichier
afin de permettre des processus sans lien de parent
particulier de communiquer en mode flot.

Les tubes ordinaires


Un tube ordinaire ntant pas nomm, il est
impossible de louvrir en utilisant la primitive open. Pour
utiliser un tube il faut connatre un descripteur associ
son entre dans la table des fichiers dans le mode
correspondant (lecture ou criture).
Lacquisition dun tel descripteur est ralise de deux
manires :
en appelant la primitive de cration de tube
(pipe) ;
par hritage : un processus hritant sa
cration des descripteurs que possde son
pre, hrite en particulier des descripteurs
de tubes.
Cours Systme dExploitation IUT de Caen

Franois Bourdon

La primitive de cration dun tube ordinaire (non


nomm) : pipe
# include <unistd.h>
int pipe (int p[2]);
p[0] correspond au descripteur en mode lecture
p[1] correspond au descripteur en mode criture
p[1]

p[0]

write

read

nombre de
liens internes
(lecteur
crivain)

p[0]
inoeud
associ
au tube

p[1]
1 rd

table des
descripteurs
du processus
appelant

1 wr
table des fichiers
ouverts

Cours Systme dExploitation IUT de Caen

2 0

.......

table des inoeuds


en mmoire

Franois Bourdon

Exemple dutilisation des tubes ordinaires (fichier


"prog.c") :
# include <stdio.h>
# include <unistd.h>
int tube[2];
char buf[20];
main() {
pipe(tube);
if (fork()) { /* pere */
close (tube[0]);
write (tube[1], "bonjour", 8);
} else {
/* fils */
close (tube[1]);
read (tube[0], buf, 8);
printf ("%s bien recu \n", buf);
}
}
Lexcution de ce programme ("prog") donne le
rsultat suivant :
$ prog
$ bonjour bien recu
$
Cours Systme dExploitation IUT de Caen

Franois Bourdon

La duplication de descripteur
La duplication de descripteur permet un
processus dacqurir un nouveau descripteur
(dans sa table des descripteurs) synonyme dun
descripteur dj existant.
Ce mcanisme est principalement utilis pour raliser
des redirections des trois fichiers dentresorties standard.
Il repose sur le fait que le descripteur synonyme
renvoy est toujours le plus petit descripteur disponible,
dans la table des descripteurs du processus demandeur,
qui satisfait une condition particulire.
La

duplication

associe

donc

un

descripteur

supplmentaire une entre existante dans la table des


fichiers ouverts.

Cours Systme dExploitation IUT de Caen

Franois Bourdon

La primitive
#include <unistd.h>
int dup (int desc);
associe le plus petit descripteur disponible du
processus appelant, la mme entre dans la table des
descripteurs ouverts que desc.
En cas de russite, la valeur retourne est le
descripteur synonyme.
Si lon veut rediriger la sortie standard (descripteur
"1") du processus courant vers le tube (tube[1]) dont il a
accs, il suffit de fermer cette sortie (close (1)), puis de
faire une duplication de la sortie en criture dans le tube :
"dup(tube[1])".
Ensuite il ne restera plus qu fermer le descripteur
"tube[1]" devenu inutile.
Enfin les critures standard (fwrite, printf, ...) iront
crire directement dans le tube.

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Les tubes nomms : FIFO


Ils permettent de transmettre des donnes entre des
processus qui ne sont pas attachs par des liens de parent.
Pour cela il faut nommer les tubes crs en les crant ;
dans le shell on utilise la commande "mknod" ou plus
gnralement (X/Open) la commande "mkfifo" :
$ mkfifo nomfichier
En "C" on utilisera linterface suivante (mknod existe
aussi mais nest pas conseille pour la portabilit du code) :
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *nomfichier, mode_t mode) ;
"nomfichier" dfinit le chemin daccs au tube
nomm et "mode" les droits daccs des diffrents
utilisateurs cet objet.
Cours Systme dExploitation IUT de Caen

Franois Bourdon

Louverture dun tube nomm est bloquante par


dfaut (on utilise O_NONBLOCK sinon).
Pour accder un tube nomm un processus devra
faire un "open" sur le fichier correspondant.
Si cette ouverture est faite en lecture et quil ny ait
aucun processus qui ait fait une ouverture en criture, alors
le processus courant est endormi et rciproquement avec
louverture en criture.
Cest un moyen pour deux processus de faire un
point de rendezvous. En effet il suffit que lun demande
louverture en criture et lautre en lecture. Ils seront
synchronis par le systme sur le deuxime "open".
Il faudra nanmoins, lors de dialogues dans les deux
sens entre deux processus, sassurer que les ordres
douverture sont faits dans le bon sens, sinon cest
linterblocage !

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Les squences douverture correctes sont donc :


/* processus 1 */
int d_lecture, d_ecriture;
...
decriture=open("fifo1", O_WRONLY);
d_lecture=open("fifo2", O_RDONLY);

/* processus 2 */
int d_lecture, d_ecriture;
...
decriture=open("fifo2", O_WRONLY);
d_lecture=open("fifo1", O_RDONLY);

write

read
fifo1

Processus 1

Processus 2

read

write
fifo2

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Deux exemples dutilisation des tubes nomms :


a) Communication de processus dans deux fentres
XWindows
Deux processus sont lancs depuis les shells
principaux de deux fentre XWindows. Ils communiquent
via un tube nomm ("fifo") en utilisant la commande "cat".
Le tampon de la bibliothque standard est vid dans le shell
du processus lecteur, ds que le processus crivain crit
dans le tube (sortie standard vers "fifo").

$ mkfifo fifo
$ cat >fifo
abcd
efgh

$ cat <fifo

CTRL D

abcd

efgh
$

Cours Systme dExploitation IUT de Caen

Franois Bourdon

b) Communication client / serveur


Un serveur attend des questions de clients dans un
tube fifo1. Une question correspond la demande denvoi
de n nombres tirs au sort par le serveur (n est un nombre
alatoire compris entre 1 et NMAX tir au sort par le
client).
Dans sa question, le client envoie galement son
numro (PID) de telle sorte que le serveur puisse le
rveiller par lintermdiaire du signal SIGUSR1 quand il a
crit la rponse.
En effet, plusieurs clients pouvant tre en attente de
rponses dans le mme tube, il est ncessaire de dfinir un
protocole assurant que chaque client lit les rponses qui lui
sont destines.
Le client avertit par ce mme signal le serveur quand il
a lu les rponses.
fifo1
struct question
SIGUSR1
Serveur

Client
struct rponse
fifo2

Cours Systme dExploitation IUT de Caen

Franois Bourdon

5.2 Les verrous


Il sagit dun mcanisme gnral visant assurer un
contrle de la concurrence des accs un mme fichier
rgulier. La norme POSIX se base sur les mcanismes
issues des implantation SYSTEM V.
Les verrous sont attachs un inoeud, cest
dire que leffet dun verrou sur un fichier est visible
au travers de tous les descripteurs (et donc tous les
fichiers ouverts) correspondant ce noeud.
Un verrou est la proprit dun processus :
seul le processus propritaire dun verrou peut le
modifier et lenlever.
La porte du verrou : cest lensemble des
positions dans le fichier (ensemble des valeurs de
loffset) auxquelles il sapplique. Les verrous
utilisables ici peuvent porter sur tout intervalle
[entier1 : entier2] ou [entier1 : ] (> fin de
fichier).

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Les verrous sont soit partags (shared), soit exclusifs


(exclusive). Cela porte sur la cohabitation ou non de
plusieurs verrous sur des intervalles nondisjoints.
Les modes opratoires des verrous sont soit le mode
consultatif

(advisory),

soit

le

mode

impratif

(mandatory).
Dans le mode consultatif un verrou na pas
dinfluence sur le comportement des autres primitives
dentressorties (open/read/write).
En mode impratif, un verrou peut empcher la
ralisation dune opration de lecture ou dcriture :
un verrou partag utilis dans ce mode, tout
autre processus faisant une criture dans la
porte de ce verrou est bloqu ;
un verrou exclusif utilis dans ce mode, tout
autre processus faisant une lecture ou une
criture dans la porte de ce verrou est bloqu.

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Il existe des situations de blocage (deadlock) comme


dans le cas suivant mettant en comptition deux processus
P1 et P2 pour la pose de verrous exclusifs sur deux fichiers
F1 et F2. Aprs que P1 ait pos avec succs un verrou
exclusif sur F1 et P2 un verrou exclusif sur F2, le
processus P1 est bloqu par une demande de pose de
verrou sur F2. La demande de pose de verrou par le
processus P2 sur le fichier F1 conduit une situation
typique de blocage : le processus P1 est bloqu par le
processus P2 luimme bloqu par P1.
verrous
dtenus

P1

P2
P2

demande
conduisant
un deadlock

Cours Systme dExploitation IUT de Caen

P1

demande bloque

Franois Bourdon

Pour poser un verrou sur un fichier, les processus


disposent des primitives suivantes :
flock() : acquisition/libration de verrous sur
un fichier complet ;
fcntl() : acquisition/libration de verrous sur
une section dun fichier ;
lockf() : idem "fcntl", mais avec une interface
simplifie.

Linterface de la fonction "flock" est la suivante :


# include <file.h>
int flock ( int fd, int operation );

Les valeurs du paramtre "operation" permettent de


verrouiller laccs au fichier dfini par le descripteur "fd".
On trouve :
LOCK_SH (pose de verrous partags),
LOCK_EX (pose de verrous exclusifs) et
LOCK_UN (relche des verrous).

Cours Systme dExploitation IUT de Caen

Franois Bourdon

La fonction "lockf" permet de poser/librer un verrou


sur une zone donne dun fichier ; son interface est la
suivante :
# include <unistd.h>
# include <fcntl.h>
int lockf ( int fd, int cmd, off_t len );

Les valeurs du paramtre "cmd" permettent de


verrouiller laccs au fichier dfini par le descripteur "fd".
On trouve :
F_ULOCK

(dverrouille

la

section

verrouille),
F_TLOCK (verrouille une section),
F_LOCK

(verrouille une section avec

suspension ventuelle du processus appelant) et


F_TEST (teste la prsence dun verrou).
Le paramtre "len" reprsente la taille du verrou par
rapport la position courante.

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Linterface de la fonction "fcntl" est la suivante :


# include <unistd.h>
# include <fcntl.h>
int fcntl ( int fd, int cmd );
int fcntl ( int fd, int cmd, long arg );

Le paramtre "cmd" permet de lancer une commande


sur le fichier dfini par le descripteur "fd". Parmi ces
commandes on trouve celles qui sont propres aux verrous :
F_SETLK et F_SETLKW (pose de verrous bloquant ou
nonbloquant).
Par dfaut, le mode de traitement utilis de tous les
verrous sur un fichier donn, est le mode consultatif. La
demande du traitement en mode impratif se fait en
positionnant le setgidbit du fichier :
$ chmod g+s f
$ ls l f
rwrSr 1

Cours Systme dExploitation IUT de Caen

jmr ens 27 Oct 13:48 f

Franois Bourdon

Pour poser un verrou, il suffit de dfinir le verrou avec


la structure "flock" et utiliser la fonction "fcntl" :
struct flock {
short l_type; /* valeurs possibles :
F_RDLCK, F_WRLCK, F_UNLCK */
short l_whence;

/* valeurs possibles :

SEEK_SET, SEEK_CUR, SEEK_END */


off_t l_start; /* position relative de debut
par rapport a l_whence */
off_t l_len;

/* longueur : si valeur nulle

=> jusqu la fin du fichier */


pid_t l_pid;

/* pid du processus auquel

appartient le verrou */
};
F_RDLCK : type partag
F_WRLCK : type exclusif
F_UNLCK : relchement de la zone rserve
SEEK_SET : dbut du fichier
SEEK_CUR : position courante de loffset
SEEK_END : fin du fichier
Lintervalle verrouill commence "l_whence + l_start".
Cours Systme dExploitation IUT de Caen

Franois Bourdon

La manipulation :
struct flock verrou;
int rep,desc,commande;
...
rep = fcntl (desc, commande, &verrou);
...
o fcntl est une fonction qui permet en fonction du
paramtre "commande" la ralisation dun certain nombre
doprations diffrents niveaux dans les tables du
systme.
En utilisant la commande F_SETLK ou
F_SETLKW

fcntl

pose

un

verrou

respectivement nonbloquant et bloquant sur


le fichier point par le descripteur desc.

Cours Systme dExploitation IUT de Caen

Franois Bourdon

Exemple :
$ cat verrou.c
#include <unistd.h>
#include <fcntl.h>
main() {
int desc;
struct flock verrou;
if((desc=open("f",O_RDWR))==1){
perror("open");
exit(0);}
/* verrou exclusif sur le 15eme caractere de "f" */
verrou.l_type=F_WRLCK; // exclusif
verrou.l_whence=SEEK_SET; // dbut du fichier
verrou.l_len=1;
verrou.l_start=15;
/* pose bloquante */
if(fcntl(desc, F_SETLKW, &verrou)==1){
perror("pose verrou");
exit(0);}
printf("Verrou pose par %d\n",getpid());
sleep(30);
printf("Fin du processus %d\n", getpid());
}
$

Cours Systme dExploitation IUT de Caen

Franois Bourdon

$ cat lire.c
#include <fcntl.h>
main() {
int desc, nb_lu;
static char ch[10];
desc = open ("f", 0_RDWR);
nb_lu = read (desc, ch, 9);
printf ("read1: %d caracteres lus %s\n", nb_lu, ch);
nb_lu = read (desc, ch, 9);
printf ("read2: %d caracteres lus %s\n", nb_lu, ch);
}
$ ls l f
rwrr

jmr ens 27 Oct 13:43 f

$ cat f
0123456789abcdefghijklmnop
$

Cours Systme dExploitation IUT de Caen

Franois Bourdon

$ verrou& verrou&
[1] 879
[2] 880

le processus 880
est bloqu sur
la pose de son
verrou par celui
pos par le 879

$ Verrou pose par 879


cat f

en mode consultatif les lectures


restent possibles

0123456789abcdefghijklmnop
$ Fin du processus 879
Verrou pose par 880

ceci libre le
processus 880

Fin du processus 880


$
Passage au mode impratif sur le fichier "f" :
$ chmod g+s f
$ ls l f
rwrSr 1

jmr ens 27 Oct 13:48 f

$ verrou& lire
Verrou pose par 885
[1] 885
read1: 9 caracteres lus > 012345678
Fin du processus 885

libration du 15me caractre

Read2: 9 caracteres lus > 9abcdefgh


$
Cours Systme dExploitation IUT de Caen

Franois Bourdon

Вам также может понравиться