Académique Documents
Professionnel Documents
Culture Documents
537e07ce544ab PDF
537e07ce544ab PDF
INF3600
Exercices + Corrigés
Exercice 1 :
Exercice 2 :
1)
int main( )
{
int p=1 ;
while(p>0) p=fork() ;
execlp(“prog”, “prog”, NULL) ;
return 0 ;
}
2)
int i=2 ;
int main ( )
{
j=10;
int p ;
while(i-- && p = fork())
if(p<0) exit(1) ;
j += 2;
if (p == 0)
{ i *= 3;
j *= 3;
}
else
{
i *= 2;
j *= 2;
}
printf(« i=%d, j=%d », i,j) ;
return 0 ;
}
3)
#include <stdio.h>
#include <unistd.h>
int main ( )
{ int fd[2], i=2;
char ch[100];
while ( i)
{ pipe(fd);
if( fork())
{ close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
break;
} else
{ close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
}
i--;
}
scanf("%s", ch);
printf("%s\n",ch);
exit(0);
}
4)
int i=4, j=10;
int main ( )
{
int p ;
p = fork();
if(p<0) exit(1) ;
j += 2;
if (p == 0)
{ i *= 3;
j *= 3;
}
else
{
i *= 2;
j *= 2;
}
printf(“i=%d, j=%d”, i,j) ;
return 0 ;
}
5)
int main ( )
{ int p=1 ;
for(int i=0 ; i<=4 ; i++)
if (p>0) p=fork( ) ;
if(p !=-1) execlp(“prog”, “prog”, NULL) ;
else exit(1) ;
while( wait(NULL) !=-1) ;
return 0;
}
Exercice 3 : ordonnancement des processus
1) Quel est le temps d’attente moyen des n processus dans chacun des
cas suivants :
- D’un ordonnanceur circulaire avec un quantum qt.
- D’un ordonnanceur sans préemption fonctionnant selon la
discipline premier arrivé, premier servi.
Dans quel cas, obtient-on un meilleur temps d’attente moyen ?
Exercice 5 :
Semaphore mutex1 = 1 ;
Semaphore mutex2 = 1 ;
Code du processus p1 :
P(mutex1) ;
P(mutex2) ;
out=out+1 ;
n=n-1 ;
V(mutex2) ;
V(mutex1) ;
Code du processus p2 :
P(mutex2) ;
out=out-1 ;
V(mutex2) ;
Code du processus p3 :
P(mutex1) ;
n=n+1 ;
V(mutex1) ;
Deux villes A et B sont reliés par une seule voie de chemin de fer.
Les trains peuvent circuler dans le même sens de A vers B ou de B
vers A. Mais, ils ne peuvent pas circuler dans les sens opposés. On
considère deux classes de processus : les trains allant de A vers B
(Train AversB) et les trains allant de B vers A (Train BversA). Ces
processus se décrivent comme suit :
Train AversB :
Demande d’accès à la voie par A ;
Circulation sur la voie de A vers B;
Sortie de la voie par B;
Train BversA :
Demande d’accès à la voie par B ;
Circulation sur la voie de B vers A;
Sortie de la voie par A;
Exercice 7 :
Consommateur( )
{ int ic =0 ;
Message m ;
Repeter
{
P(Plein) ;
P(Mutex) ;
m = Tampon[ic];
V(Mutex) ;
ic++ ;
V(Vide) ;
}tant que vrai ;
}
Solutions
Exercice 1 :
Exercice 2
1) Le père crée des processus fils tant qu’il n’y a pas d’échec. Le père
et les processus créés se transforment en prog.
Exercice 3 :
TSM1 = [ (10 qt +r) + (10 qt +2r) + (10 qt +3r) + (10 qt + 4r) +(10qt
+5r) ] /5
= 10 qt + 3 r
TSM2 TSM1
Exercice 4 :
Processus P1
P(mutex1) ;
n=n-1 ;
V(mutex1) ;
P(mutex2) ;
Out = out +1 ;
V(mutex2) ;
fonction CalculLignes ( )
{ pour i = 0 à n-1 pas 1
faire P(mutex)
si ( T[i]==0)
{ T[i] = 1 ;
V(mutex) ;
Pour j = 1 à n pas 1
faire Pour k=1 à n pas 1
faire R[i,j] += A[i,k] * B[k,j]
fait
fait
} else V(mutex) ;
fait
}
Exercice 6 :
1) Modèle des lecteurs et des rédacteurs (la voie joue le rôle de la base
de données).
2)
Sémaphore mutex =1, autorisation =1 ;
Exercice 7 :
a)
Producteur ( int i)
{
Message m ;
Repeter
{ m = creermessage( ) ;
P(Vide) ;
P(Mutex) ;
Tampon[ip]=m;
ip++ ; // ip++ est dans la section critique
V(Mutex) ;
V(Plein) ;
}tant que vrai ;
}
Consommateur( int i )
{
Message m ;
Repeter
{
P(Plein) ;
P(Mutex) ;
m = Tampon[ic];
ic++ ; // ic est partagé entre tous les consommateurs
V(Mutex) ;
V(Vide) ;
}tant que vrai ;
}
b)
Semaphore
Mutex [n] = {1, 1, ….,1},
Vide [n] = {Max, Max, …, Max},
Plein [n] = {0, 0, ., 0} ;
Message tampon [n][Max] ;
Producteur ( )
{ int ip =0 ; // un seul producteur
Message m ;
Repeter
{ m = creermessage() ;
pour i=0, n- 1, pas 1
faire
P(Vide[i]) ;
P(Mutex[i]) ;
Tampon[i][ip]=m;
V(Mutex[i]) ;
ip++ ;
V(Plein[i]) ;
}tant que vrai ;
}
Consommateur( int i)
{ int ic =0 ;
Message m ;
Repeter
{
P(Plein[i]) ;
P(Mutex[i]) ;
m = Tampon[i][ic];
V(Mutex[i]) ;
ic++ ;
V(Vide[i]) ;
}tant que vrai ;
}