0% ont trouvé ce document utile (0 vote)
186 vues26 pages

Correction TD ProdCons

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 26

Rappel – Sémaphore

Imene Lahyani
Variable
partagée

Processus 1 Processus 2
… Section non critique …Section non critique
If (s>0) s=s-1
s.acquire() s.acquire() Else attendre
…………x…….. …………x……..
…………x……..
Section critique 1 …………x……..
Section critique 2
…………x…….. …………x……..
s.release() s.release ()
s=s+1

…Section non critique …Section non critique

Semaphore s = new Semaphore (1, true);


Exercice
•Un processus producteur envoie un flux d’informations à un processus
consommateur.
•Une zone tampon est utilisée pour faire transiter ce flux
d’informations.
•Le problème est de gérer l’accès à la zone tampon par le producteur et
le consommateur.
•La zone tampon est modélisée par un tableau partagé.
•L’accès à ce tableau se fait à l’aide de deux fonctions (append et take)
Solution
Consommateur Producteur

1) variable partagé ? Tampon


2) threads ? Prod , Cons
3) sections critiques ?
Append (x)

take()
class ProdConsSem
{
ProdConsSem
{ // constructeur

}
public static void main(String argv[])
{
ProdConsSem pc = new ProdConsSem(10) ;

Producteur producteur = new producteur () ;

Consommateur consommateur = new consommateur () ;

producteur.setName("Producteur") ;
producteur.start() ;

consommateur.setName("Consommateur") ;
consommateur.start() ;
}
public static void main(String argv[])
{
try{

ProdConsSem pc = new ProdConsSem(10) ;

Producteur producteur = new Producteur () ;

Consommateur consommateur = new Consommateur () ;

producteur.setName("Producteur") ;
producteur.start() ;

consommateur.setName("Consommateur") ;
consommateur.start() ;
}
catch(ArrayIndexOutOfBoundsException exp)
{ System.out.println("erreur");
}
}}
class Producteur extends Thread {
Producteur ()
{}

Void deposer ()
{

}
public void run() {
}

Deposer()

}
class Consommateur extends Thread {
Consommateur ()
{}

Int prelever()
{
}

public void run()


{

Int x = prelever()

}
import java.util.concurrent.Semaphore ;
class ProdConsSem
{ static int tampon[]; static int N;
ProdConsSem (int N)
{
This.N=N;
tampon = new int [N] ;

}
public static void main(String argv[])
{
ProdConsSem pc = new ProdConsSem(10) ;
Producteur producteur = new producteur () ;
Consommateur consommateur = new consommateur () ;
producteur.setName("Producteur") ;
producteur.start() ;
consommateur.setName("Consommateur") ;
consommateur.start() ;
}}
class Producteur extends Thread {
Static Int in ;
Producteur ()
{}

Void deposer ()
{
int m= (int)(1000*Math.random());
ProdConsSem [in] =m ;
in = (in +1)% N;
System.out.println(Thread.currentThread().getName() + " vient de produire "+ m) ;
}
public void run() {
}

Deposer()

}
class Consommateur extends Thread {
Static Int out
Consommateur ()
{}

Int prelever()
{
int m= ProdConsSem .tampon[tete];

out = (out + 1)% N;

System.out.println(Thread.currentThread().getName() + " vient de consommer " + m) ;


return m ;

public void run()


{
Int x = prelever()

}
class Consommateur extends Thread {
Static int out
Consommateur ()
{} Un consommateur ne peut pas consommer d’un tampon vide
Int Prelever()
{
int m= ProdConsSem .tampon[out];
out = (out + 1)% ProdConsSem .N;
System.out.println(Thread.currentThread().getName() + " vient
de consommer " + m) ;
return m ;
}
public void run() { If(nbcaseplein>0) nbcaseplein=nbcaseplein-1
try { Else attendre
{
ProdConsSem.nbcasePlein.acquire());
ProdConsSem.S.acquire()
int m = Prelever() ;
ProdConsSem.S.release());
ProdConsSem.nbcaseVide.release(); Nbcasevide=nbcasevide+1
} }
catch(InterruptedException e) {} } // fin
run
} // fin de la classe Consommateur
class Producteur extends Thread {
Static int in
Producteur ()
{} Un producteur ne peut pas produire dans un tampon plein

Void deposer ()
{int m= (int)(1000*Math.random());
ProdConsSem .tampon[in] =m ;
in = (in +1)% ProdConsSem .N;
System.out.println(Thread.currentThread().getName() + " vient de produire "+ m) ;
}
public void run() {
try If(nbcasevide>0) nbcasevide=nbcasevide-1
{ { Else attendre
int m= (int)(1000*Math.random());
ProdConsSem.nbcaseVide.acquire();
ProdConsSem.S.acquire();
Deposer(m);
ProdConsSem.S.release(); Nbcaseplein=nbcaseplein+1
ProdConsSem.nbcasePlein.release()();
}
} catch(InterruptedException e) {} }// fin run
}
import java.util.concurrent.Semaphore ;
class ProdConsSem
{ static int tampon[]; static int N;
ProdConsSem (int N)
{ This.N=N;
tampon = new int [N] ;
Static nbcaseVide=new Semaphore (N, true);
Static nbcasePlein=new Semaphore(0,true);
Static S=new Semaphore (1,true);}

public static void main(String argv[])


{
ProdConsSem pc = new ProdConsSem(10) ;
Producteur producteur = new producteur (pc) ;
Consommateur consommateur = new consommateur (pc) ;
producteur.setName("Producteur") ;
producteur.start() ;
consommateur.setName("Consommateur") ;
consommateur.start() ;
}}
Ex 2 (TD)
I P0 P1 Flag[0] Flag[1] Token

0 ff ff 00

2 Flag[1]=true f true 0

3 Test(token<>0) f true 0

4 Flag[0]=true true true 0

5 Test (token<>0)
******SC*****

6 Token=1 1

7 Test(token<>0)
******SC*****
ex3
Une piscine qui contient C cabines peut contenir au maximum un nombre N de nageurs.
Chaque nageur dispose d'un panier pour ranger ses habits ; il y a donc P paniers.
Pour se déshabiller, les nageurs ont besoin d'une cabine et d'un panier pour placer leurs
habits.
Pendant qu'ils se baignent, ils conservent le panier. Après la baignade, il leur faut à
nouveau
une cabine pour se ré-habiller. Enfin, avant de sortir, ils libèrent le panier et la cabine.
Les conditions d'utilisation sont les suivantes :
1) il y a P paniers disponibles pour ranger leurs habits ; il ne pourra donc pas y
avoir plus de P baigneurs simultanément ;
2) il y a d'autre part C cabines d'habillage, avec 1 < C << P<<N.
Développez une solution à ce problème en utilisant les sémaphores.
EX 3
1) variable partagé ? nbcabine, nbpanier
2) threads ? Nageur
3) sections critiques ?
Reservercabine()
Reserverpanier()
Reserverpanier()
libererpanier()
public class Piscine {
int P,C;

Piscine(int P, int C)
{
this.P=P;
this.C=C;
}
Public static void main (String args[])
{
Piscine ps=new Piscine(3,2);
Nageur n1=new Nageur("n1");
Nageur n2=new Nageur("n2");
n1.start()
n2.start()
}
public class Nageur extends Thread {
Nageur(String Nom)
{
super(Nom);
}
public void run(){
*********************
}
}
while(true){ ReserverCabine();
ReserverPanier(); shabiller();
acqCabine(); try {
sleep(2000);
seDeshabiller(); } catch
try { (InterruptedException e) {}
sleep(2000);
libererCabine();
}
catch (InterruptedException e) {} libererPanier();
libererCabine(); } } // fin run
nager(Nom);
try {
sleep(4000);
} catch
(InterruptedException e) {
}
public void ReserverCabine() public void ReserverPanier()
{ {
try { try {

piscine.CabineDisp.acquire(); piscine.PanierDisp.acquire();
} catch } catch
(InterruptedException e) {} (InterruptedException e) {}
System.out.println("Le
nageur "+getName()+" Acquerir panier");
System.out.println("Le
nageur "+getName()+" Acquerir Cabine"); }

}
public void seDeshabiller() public void libererPanier()
{ {
System.out.println("Le nageur System.out.println("Le nageur "+
"+getName()+" Se deshabiller"); getName()+" +" libère le panier");
} PanierDisp.release();
public void shabiller() }
{
System.out.println("Le nageur "+ public void nager()
getName()+" +" Se habiller"); {
} System.out.println("Le nageur "+
public void libererCabine() getName()+" +" Je suis entrain de nager");
{ }
System.out.println("Le nageur "+ }
getName()+" +" libère la cabine"); }// fin nageur
CabineDisp.release();
}
public class Piscine {
static int P,C;
static Semaphore CabineDisp,PanierDisp;

Piscine(int P, int C)
{
this.P=P;
this.C=C;
CabineDisp=new Semaphore(C);
PanierDisp=new Semaphore(P);
}
Public static void main (String args[])
{
Piscine ps=new Piscine(3,2);
Nageur n1=new Nageur("n1");
Nageur n2=new Nageur("n2");
n1.start()
n2.start()
Public class piscine
Class nageur extends thread
{

}
X=3 p1 X=6
S1=0
TD – ex 1(a completer) p3
S1=0(1)
S2=0 S2=0

X=0 X=6
p3 X=3 p1 X=3 p3 X=3 p1
S1=0 S1=1
S1=0 S1=1 S1=1
(1) S2=0
S2=1 S2=0 S2=0
p2 S2=0

X=0
S1=1
S2=0 p3 X=3
p3 S1=1
X=3 S2=1
S1=0
S2=1

p1 X=3
S1=0
S2=0

Vous aimerez peut-être aussi