Académique Documents
Professionnel Documents
Culture Documents
Adouane 1
L’échange de message ou communication interprocessus est utilisé
pour synchroniser les processus entre eux
Lecteur/Rédacteur
Producteur/Consommateur
Créer un document D
verrouiller F
ajouter D à la fin de la file F
déverrouiller F
envoyer un signal au consommateur
Le code exécuté par le consommateur
répéter
attendre un signal de F
tant que F n'est pas vide
pour chaque élément E de F
verrouiller F
imprimer E
supprimer E de F
déverrouiller F
fin pour
fin tant que
attendre un signal d'un producteur
fin répéter
Le code exécuté par le consommateur
répéter
attendre un signal de F
tant que F n'est pas vide
pour chaque élément E de F
verrouiller F
imprimer E
supprimer E de F
déverrouiller F
fin pour
fin tant que
attendre un signal d'un producteur
fin répéter
monitor ProducerConsumer
condition full , empty ;
integer count ;
procedure insert (item : integer );
begin
if count = N then wait (full );
insert_item (item );
count := count + 1:
if count = 1 then signal (empty )
end ;
function remove : integer ;
begin
if count = 0 then wait (empty);
remove = remove_item ;
count := count - 1;
if count = N - 1 then signal (full )
end ;
count := 0;
end monitor ;
procedure producer ;
begin
while true do
begin
item = produce_item ;
ProducerConsumer .insert (item )
end
end ;
procedure consumer ;
begin
while true do
begin
item = ProducerConsumer .remove ;
consume_item (item )
end
end ;
Le problème du diner des pholosophes a été introduit et traité
par Dijkstra
◦ Write
◦ Read
Les tubes ne conservent pas la structuration des messages qui
sont envoyés par le producteur
fd1 0 1
fd2 0 1 pipe1
val1
val2
pipe2
switch(pid=fork()){
case 0: // fils
close(fd1[1]; close(fd2[0]);
scanf(‘’%d’’,&val2);
write(fd2[1],&val2, sizeof(val2));
printf(‘’Fils %d -> Pere %d : sent val %d
\n’’,getpid(),getppid(),val2);
read(fd1[0],&val1,sizeof(val1));
printf(‘’ Fils %d <- Père %d : rec val %d \n’’,getpid(),getppid(),val1);
break;
Après le fork()
PROCESSUS PROCESSUS
PERE FILS
fd1 0 1 0 1 fd1
pipe2
default: // pere
close(fd2[1]);
close(fd1[0]);
scanf(‘’%d’’,&val1);
write(fd1[1],&val1, sizeof(val1));
printf(‘’Pere %d -> Fils %d : sent val %d \n’’,getpid(),pid,val1);
read(fd2[0],&val2,sizeof(val2));
printf(‘’ Pere %d <- Fils %d : rec val %d \n’’,getpid(),pid,val2);
wait(NULL);
break;
}
Après le fork()
PROCESSUS PROCESSUS
PERE FILS
Close
fd1 0 1 0 1 fd1
Close
Read
pipe2
switch(pid=fork()){
case 0: // fils
close(fd1[1]); // Je ne dois pas parler sur le Canal fd1
close(fd2[0]); // Je ne dois pas écouter sur le Canal fd2
scanf(‘’%d’’,&val2); // Demander à l’utilisateur de saisir une donnée
write(fd2[1],&val2, sizeof(val2));//Je parle sur la chaine fd2 j’envoie val2 à papa
printf(‘’Fils %d -> Pere %d : sent val %d \n’’,getpid(),getppid(),val2);
read(fd1[0],&val1,sizeof(val1)); // J’écoute le canal fd1[0] et stock le contenu dans
// ma variable val1
printf(‘’ Fils %d <- Père %d : rec val %d \n’’,getpid(),getppid(),val1);
break;
PROCESSUS PROCESSUS
PERE FILS
Close Close
fd1 0 1 0 1 fd1
Close Close
Read
pipe2 Write
Ce mode de communication désigne des communications à
travers un réseau entre des programmes
Meilleure fiabilité : En cas de panne, seul le serveur fait l'objet d'une réparation,
et non le PC client.
Facilité d'évolution : Une architecture client/serveur est évolutive car il est très
facile de rajouter ou d'enlever des clients, et même des serveurs.
Le client demande l’exécution d’un service
Architecture à 2 niveaux
Architecture à 3 niveaux
Architecture à N niveaux
Il en existe deux type
l'adresse IP
socket.close();
Après avoir obtenu la socket, on utilise
socket.getInputStream() pour récupérer le flux entrant.