Vous êtes sur la page 1sur 7

ProgrammationSystme

Correctiondelexamendu21mai2003
AMmoirevirtuelle
Rponse1:
Uneseuletabledespagesparprocessusimposeladcompositionsuivante:
adressevirtuelle=numrodepagevirtuelle+dplacementdanslapage
Lenumrodepagevirtuelledsigneuneentredanslatabledespages.
Silebitdeprsenceest1alorslenumrodepagephysiqueestvalide:
adressephysique=numrodepagephysique+dplacementdanslapage
Pagevirtuelleetpagephysiqueontlammetaille.
Silenombredentresdanslatabledespagesestlimit8alors3bits
sontncessairespourcoderlenumrodepageetcequelquesoitlemode
dexcution.Lesbitsrestantsformentledplacementdanslapage.
Uneadresseesttoujoursunpointeurversunoctetdonclatailledune
pagesexprimeenoctetetestgale:
2^nombre_de_bits_restants(lire:2puissancenombre_de_bits_restants)
8bits
3bits
2^5=32o
2^8=256o

Numrodepagevirtuelle
Tailledunepagephysique
Taillemmoiredu
processus

16bits
3bits
2^13=8Ko
2^16=64Ko

32bits
3bits
2^29=512Mo
2^32=4Go

Rponse2:
Adressesphysiquescorrespondantaux16adressesvirtuelles:
adresse
virtuelle
0x00
0x11
0x22
0x33
0x44
0x55
0x66
0x77
0x88
0x99
0xAA
0xBB
0xCC
0xDD
0xEE
0xFF

numrodepage
virtuelle
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7

bitde
prsence
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0

numrodepage
physique
7
7
6
6
5
5
4
4
3
3

Adresse
physique
0xE0
0xF1
0xC2
0xD3
0xA4
0xB5
0x86
0x97
0x68
0x79

Rponse3:
Lalgorithmedelibrationdespagesestdetypepremierarriv,premier
enlev(FIFO).Undfautdepageestreprsentparlesymbole*
Onobtientavec3pageslibresenmmoire:
Numrodepage
dfautdepage

0
*

1
*

4
*

2
*

0
*

-1-

1
*

3
*

4
*

2
*

0
1

0
1
4

2
1
4

2
0
4

2
0
1

3
0
1

3
0
1

3
0
1

3
4
1

3
4
2

3
4
2

0
1
4
2

0
1
4
2

3
*
3
1
4
2

0
*
3
0
4
2

1
*
3
0
1
2

4
*
3
0
1
4

2
*
2
0
1
4

3
*
2
3
1
4

Nombrededfautsdepages:9
Etavec4pageslibresenmmoire:
Numrodepage
dfautdepage

0
*
0

1
*
0
1

4
*
0
1
4

2
*
0
1
4
2

Nombrededfautsdepages:10
Onconstatequelexcutionduprocessusgnre1fautedepage
supplmentairealorsquelammoirephysiquedisponibleestplusgrande.
CestundesproblmesdelalgorithmeFIFO:anomaliedeBelady.
Rponse4:
Danslecasdunadressagesur8bits,uneentredelatabledespages
peuttrecodesur6bits:3bitsdtatet3bitspourlenumrodepage
physique.
Danscecas,lammoirephysiqueestlimite8pagesde32octets.Le
systmeneserapastrsefficace:mmeavecunemmoireprivepour
lexcutiondusystmeetdanslecasfavorabledeprocessusutilisantune
seulepage,lammoirephysiqueestsatureavec8processus...
Augmenterlenombredebitspourcoderlenumrodepagephysiquedansla
tabledespagespermetdaugmenterlammoirephysiquedelamachinesans
rienchangerlespacedadressagedesprocessus:lammoirevirtuelle
dunprocessusrestelimite256octets.Parcontre,lesystmeest
capabledexcuterbeaucoupplusdeprocessusenmmoiresansavoirbesoin
dutiliserlespacedepagination(swap),toujourstrspnalisantenterme
deperformances.
Lemmeprincipesappliqueauxmachines32bitsactuelles:lammoire
physiquenestpluslimite4Goalorsquelesprocessuscontinuentde
fonctionneravecdesadresses32bitsdoncavecunemmoirede4Gomaximum.
Ilfautparcontre,pourquelamachinesoitperformante,quelesystmeet
surtoutlematrielsoientadaptes.
BProblmedecrationdeprocessus
Soitlefichier/user/totocontenantlachanedecaractres:
abcdefghijklmnopqrst
Onseproposedtudierleprogrammesuivant:
main()
{
intPID;
intfd;
charbuffer[20];
fd=open("/user/toto",O_RDWR);
read(fd,buffer,10);
print(buffer);
PID=fork();

-2-

if(PID==0)
{
read(fd,buffer,5);
print(buffer);
}
else
{
read(fd,buffer,5);
print(buffer);
}
}
Lesfonctionsopen()etread()sontlesappelssystmesvusencours.
Lafonctionprint()affichesurleterminallecontenudubufferpassen
paramtre.OnremarquequecommelefichierestouvertAVANTl'appella
fonctionfork(),lesstructuresinternesaunoyauutilisespourl'accsau
fichiersontPARTAGEESparleprocessuspreetleprocessusfils.
Question1:
Donnezl'enchanementdesfonctionsexcutesparleprocessuspreet
l'enchanementdesfonctionsexcutesparleprocessusfils.
processuspre

processusfils

open()
read()
print()
fork()
read()read()
print()print()

Question2:
Enexcutantplusieursfoisceprogramme,onconstatequ'ilproduit2
affichagesdiffrents.
Donnezces2affichages.
CAS1
abcdefghij
klmno
pqrst

CAS2
abcdefghij
pqrst
klmno

Question3:
Expliquezcommentcesaffichagessontproduitsetpourquoiilssont
diffrents.
LesystmeUNIXnegarantiepasd'ordonnancementparticulierentre
processusPreetFils.Ilsepeutquel'undesprocessussoitluaprs
quel'autreaitfaitleread()maisavantleprint().Ileffectueraalors
sapropresquenceread()/print(),maisenayanteulepointeurdeposition
dufichieraffectparleread()delautreprocessus:
Lecas1cidessuscorrespond:
pre

fils

ou

open()
read()
print()
fork()
read()
print()

pre

fils

open()
read()
print()
fork()
read()
print()
read()
print()

read()
print()

-3-

Lecas2cidessuscorrespond:
pre

fils

ou

open()
read()
print()
fork()
read()

pre

fils

open()
read()
print()
fork()
read()
read()
print()

read()
print()

print()

print()

Leprogrammeprcdentestmodifidanslebutd'utiliserledbutdu
fichier/usr/totocommezonedecommunicationentreles2processus.Le
processuspreseraenchargedeliredesdonnessuruncapteuretdeles
crireaudbutdufichier,etleprocessusfilsseraenchargedelireces
donnesendbutdefichierpuisdelestraiteretlesafficher.Onsait
queletraitementdesdonnesestpluslongquelacquisitiondesdonnes,
etquedoncleprocessusfilsnetrouverapas2foisdesuitelesmmes
donnesdanslefichier.
Leprogrammedevient:
main()
{
intPID;
intfd;
fd=open("/user/toto",O_RDWR);
read(fd,buffer,10);
print(buffer);
PID=fork();
if(PID==0)
{
do{
lseek(fd,0,SEEK_SET);
count=read(fd,buffer,5);
if(count==5)
{
traiter_donnes(buffer);
print(buffer);
}
}while(1)
}
else
{
???????
}
}
Question4:
Enprenantexemplesurlaboucledetraitementduprocessusfils,crirela
boucledecodeduprocessuspre.
Lesdonnesserontluesgrcelafonctionlire_capteur(buffer)quilit5
caractresetlesplacedanslavariablebuffer.

-4-

do{
lire_capteur(buffer);
lseek(fd,0,SEEK_SET);
write(fd,buffer,5);
}while(1)
Question5:
Lecodecidessusnefonctionnepasbien.Eneffet,onconstatequede
tempsentemps,leprocessusfilsnelitpasledbutdufichier
(caractres04)maislitlescaractres59dufichier.
Expliquercommentcelaestpossible.
Delammefaonqulaquestion3,cestunproblmedordredexcution
desprocessuspreetfils.Sileprocessusfilsperdleprocesseuraprs
avoirpositionnlepointeurdufichier(lseek()),etquelepreexcute
cemomentllseek()/write(),puisperdluimmeleprocesseur,lefilsva
effectuersonread()alorsquelepointeurdepositionsetrouveen5.

Identifiezlaoulessectionscritiques.
Lessectionscritiquessont:
Pre
lseek()
write()

Fils
lseek()
read()

Apartirdumomentounprocessusexcutelelseek,ildoitexcuter
laccsfichiersanstreinterrompuparlautreprocessus.
Proposezunesolutionceproblmel'aidedesmaphoresquevous
manipulerezaveclesfonctionsinit(semaphore),P(semaphore),
V(semaphore)vuesencours.
LessectionscritiquesserontsimplementencadresparuncoupleP()/V(),
enayantinitialislesmaphore1(1seulprocessuslafoisdansla
sectioncritique):
main()
{
intPID;
intfd;
init(semaphore,1);
fd=open("/user/toto",O_RDWR);
read(fd,buffer,10);
print(buffer);
PID=fork();
if(PID==0)
{
do{
P(semaphore);
lseek(fd,0,SEEK_SET);
count=read(fd,buffer,5);
V(semaphore);
if(count==5)
{

-5-

traiter_donnes(buffer);
print(buffer);
}
}while(1)
}
else
{
do{
lire_capteur(buffer);
P(semaphore);
lseek(fd,0,SEEK_SET);
write(fd,buffer,5);
V(semaphore)
}while(1)
}
}
Question6:
Onsouhaitemaintenantmodifierleprogrammecidessuspourqueles2
bouclesinfiniess'arrtentsurrceptiond'unsignalSIG_USR1.
Proposerlesmodificationsncessaires.
Ladifficultestquenousnavonspas1,mais2processusencours
dexcution.Ilfautdoncfaireensortequeles2processusreoivent
linformationdarrt.Plusieurssolutionspeuventtreenvisages:
Onenvoie2signaux,
Unsignalestenvoyaupre,etlepreinformelefils,
Voiciunesolution1seulsignalenvoyaupre:
intcont=1;
intPID;
usr1_handler()
{
cont=0;
if(PID)
kill(PID,SIG_USR1);
}
main()
{
intfd;
charbuffer[20];
intsemaphore;

fd=open("/user/toto",O_RDWR);

read(fd,buffer,10);
print(buffer);
signal(SIG_USR1,usr1_handler);
init(semaphore,1);
PID=fork();
if(PID==0)
{
do{
P(semaphore);
lseek(fd,0,SEEK_SET);

-6-

count=read(fd,buffer,5);
V(semaphore);
if(count==5)
{
traiter_donnes(buffer);
print(buffer);
}
}while(cont)
}
else
{
do{
lire_capteur(buffer);
P(semaphore);
lseek(fd,0,SEEK_SET);
write(fd,buffer,5);
V(semaphore);
}while(cont)
}
}

-7-