Vous êtes sur la page 1sur 214

Chapitre 1 : Introduction

Chapitre 2 : Processus

Chapitre 3 : Ordonnancement

Chapitre 4 : Outils de communication centraliss entre processus

Chapitre 5 : Allocation mmoire

Chapitre 6 : Mmoire virtuelle

Chapitre 7 : Interblocage

Chapitre 8 : Synchronisation entre processus

Chapitre 9 : Inversion de Priorit

Chapitre 10 : Communication inter processus sur le rseau

Chapitre 11 : Programmation socket

Table des figures

Chapitre 1 : Introduction
Ce chapitre constitue une introduction aux systmes d'exploitation multiprogramms.

Cours : Introduction aux systmes d'exploitation


Evolution de la prise en compte des entres sorties par la machine matrielle : vers la machine
multiprogramme
Le mode programm
Les interruptions
Le DMA ou Direct Memory Access
Rles du systme d'exploitation dans un environnement multiprogramm. Dfinition.
Fonctions d'un systme d'exploitation
Les diffrentes classes de systme
Un peu plus sur les systmes temps rel
Notions de base
Interfaces du systme d'exploitation
Modes d'excutions et Commutations de contexte
Un premier test
Table des figures

Introduction>Introduction aux systmes d'exploitation

1 Cours : Introduction aux systmes d'exploitation


Ce chapitre constitue une introduction aux systmes d'exploitation multiprogramms. Aprs un rappel sur
l'volution de la prise en compte des entres/sorties par la machine physique, nous donnons la dfinition
d'un systme d'exploitation., puis nous listons les diffrentes fonctions qui le composent. Les diffrents
types de systmes d'exploitation sont ensuite prsents et une attention toute particulire est alors porte
sur les systmes temps rel. Nous finissons par un rappel sur les notions de base.

1.1 Evolution de la prise en compte des entres sorties par la machine matrielle :
vers la machine multiprogramme

Nous nous intressons l'volution de la prise en charge des entres/sorties au niveau matriel. Trois
modes sont possibles : le mode programm, les interruptions et le Dma. Nous allons voir que le dernier
mode libre compltement le processeur de la ralisation d'une entre sortie et permet alors de faire
excuter celui-ci d'autres oprations durant celle-ci : le systme pourra alors tre multiprogramm, c'est-dire pourra permettre le traitement de plusieurs programmes : l'une en entres/sorties, l'autre en calcul.

1.1.1 Le mode programm


Le premier mode de gestion des entres/sorties est le mode programm. Dans ce mode, l'unit d'change
qui interface le priphrique au bus et au processeur, ne sait pas dlivrer d'informations sur son tat. Pour
savoir si l'unit d'change est prte recevoir ou dlivrer une nouvelle donne, le processeur doit
rgulirement lire le contenu du registre d'tat RE de l'unit d'change. Le processeur est donc
compltement occup durant l'entre sortie par la ralisation de cette boucle de scrutation dont la logique
est donne sur la figure 1 en mmoire centrale. On ne peut donc concevoir quun systme
monoprogramm.

Fig 1 : Le mode programm

1.1.2 Les interruptions


Une premire amlioration provient du mcanisme d'interruption : l'unit d'change dlivre alors une
interruption destination du processeur lorsqu'elle est prte dlivrer ou recevoir une nouvelle donne. Le
processeur, la prise en compte de cette interruption, va excuter la routine associe qui lit la donne
prsente dans RD (lecture) ou met dans RD la donne suivante crire. Le processeur ne doit donc plus
scruter le registre d'tat RE de l'unit d'change pour savoir si celle-ci est prte. Cependant, il reste le seul
pouvoir accder la mmoire centrale et doit donc encore grer l'entre sortie dans le sens o il doit se
charger des transferts mmoire centrale registre de donne.

Fig 2 : Entre/sortie et interruption

Complment :
Nous rappelons brivement le mcanisme des interruptions. Le processeur excute un programme lambda. L'interruption
n3 survient, dclenche par une unit priphrique. Le processeur arrte alors l'excution du programme lambda. Il
sauvegarde le contexte du processeur en mmorisant notamment l'adresse de la prochaine instruction excuter dans le
programme lambda (ici 1002). Puis il dtermine grce une table appele la table des vecteurs d'interruptions, l'adresse
de la routine associe l'interruption n3. : ici 0017. Il charge alors le CO avec cette adresse, excute la routine
d'interruption qui se termine par l'instruction machine RTI (return Interrupt) : cette instruction restaure le contexte
sauvegard lors de la prise en compte de l'interruption : le CO est charg avec l'adresse 1002 et le programme lambda
reprend son excution l o il avait t interrompu.

Traitement d'une interruption

1.1.3 Le DMA ou Direct Memory Access


L'ajout d'un dispositif de DMA (Direct Memory Access) permet l'unit d'change d'accder par elle-mme
la mmoire centrale. Le DMA com port e quatre registres qui servent dcrire l'opration
d'entres/sorties raliser (nombre d'octets transfrer nb, adresse du premier octet @m, sens de
l'opration, .adresse du priphrique concern @p). Combiner au mcanisme d'interruption, le DMA
permet de dcharger le processeur de toute la ralisation des entres/sorties. Celui-ci n'a plus qu'
initialiser l'opration en initialisant le contenu des registres du DMA tel que cela est dcrit sur la figure 3. Le
DMA se charge ensuite d'effectuer l'opration d'entres/sorties, en lisant ou crivant lui-mme en mmoire
centrale les donnes transfres par l'unit priphrique. Lorsque l'opration d'entres sorties est termine,
le DMA met une interruption pour le signaler au processeur.

Fig 3 : DMA et entre sortie

Le chronogramme de la figure 4 illustre l'activit du processeur et du DMA lorsque le systme est


monoprogramm. Le programme Prog s'excute et fait du calcul : le processeur est actif et le DMA inactif.
A un instant t, le programme Prog demande une opration d'entres/sorties (Lire/Ecrire). Le Dma, une fois
initialis par le processeur, devient actif et le processeur inactif, puisqu'il n'y a qu'un seul programme en
mmoire centrale et que le DMA gre seul l'opration d'entres sorties. Le processeur demeure donc inactif
jusqu ce que le DMA ait fini l'entre sortie; ce moment l le processeur reoit l'interruption mise par le
DMA, redevient actif, traite l'interruption puis reprend l'excution du programme Prog..

Fig 4 : Activit du CPU et du DMA sur un systme monoprogramm

Laisser le processeur inactif conduit une mauvaise utilisation de cette ressource matrielle. On choisit
donc de "monter" plusieurs programmes en mmoire centrale : ainsi comme le montre la figure 5, lorsque le
DMA ralise une opration d'entres sorties pour le programme ProgA, le processeur peut excuter un
autre programme qui demande du calcul : ProgB. Le systme est devenu multiprogramm.

Fig 5 : Activit du CPU et du DMA sur un systme multiprogramm

Introduction>Introduction aux systmes d'exploitation>Role du systeme

1.2 Rles du systme d'exploitation dans un environnement multiprogramm.


Dfinition.

Le systme est multiprogramm : plusieurs programmes coexistent en mmoire centrale et utilisent le


processeur pour effectuer des calculs et le DMA pour raliser les oprations d'entres sorties. On distingue
en mmoire centrale un programme particulier : le systme d'exploitation, charg en mmoire haute avec le
vecteur d'interruptions. Le premier rle du systme d'exploitation dans un systme multiprogramm est de
grer le partage de la machine physique et des ressources matrielles entre les diffrents programmes.
Cette gestion doit assurer l'quit d'accs aux ressources matrielles et assurer galement que les accs
des programmes ces ressources s'effectuent correctement (protection des ressource s). Plus
prcisment, la gestion du partage de la machine physique et des ressources matrielles doit permettre de
rpondre aux questions suivantes :

partage du processeur unique : parmi tous les programmes chargs en mmoire centrale, lequel doit
s'excuter ?

partage de la mmoire centrale : comment allouer la mmoire centrale aux diffrents programmes.
Comment assurer la protection entre ces diffrents programmes utilisateurs ? Comment protger le
systme d'exploitation des programmes utilisateurs ? Par protection, on entend ici veiller ce qu'un
programme donn n'accde pas une plage mmoire alloue un autre programme.

partage des priphriques

Le second rle du systme d'exploitation est de faciliter l'accs la machine physique pour l'utilisateur de
celle-ci. En effet sur une machine physique brute, pour raliser par exemple une opration d'entres
sorties, il est ncessaire de connatre la manire dont le priphrique est gr (DMA, interruption ?). De
mme pour faire excuter un programme, il faut charger celui-ci en mmoire centrale et connatre la
manire dont l'allocation des mots mmoire est gre. Ceci est fastidieux et compliqu pour l'utilisateur de
la machine.

Le systme d'exploitation offre l'utilisateur une interface destine masquer les caractristiques
matrielles. Cette interface est compose d'un ensemble de primitives qui grent elles-mmes les
caractristiques matrielles sous-jacentes et offrent un service l'utilisateur. Un utilisateur souhaitant
raliser une opration d'entres sorties fait appel une primitive unique ECRIRE sans se soucier du type
de gestion associe au priphrique. C'est la primitive qui prendra en charge la spcificit du priphrique.
L'ensemble des primitives offertes par le systme d'exploitation cre une machine virtuelle au dessus de la
machine physique plus simple d'emploi et plus conviviale. On distingue deux types de primitives : les
appels systmes et les commandes.

Dfinition : Systme d'exploitation


C'est un ensemble de programmes qui ralise l'interface entre le matriel de l'ordinateur et les
utilisateurs. Il a deux objectifs principaux :
construction au-dessus du matriel d'une machine virtuelle plus facile d'emploi et plus conviviale
prise en charge de la gestion de plus en plus complexe des ressources et partage de celle-ci

Comme son nom le suggre, le systme dexploitation a en charge l'exploitation de la machine pour en
faciliter l'accs, le partage et pour l'optimiser

Introduction>Introduction aux systmes d'exploitation>Fonction du systme

1.3 Fonctions d'un systme d'exploitation

Le systme d'exploitation (figure 6) prsente donc comme une couche logicielle place entre la machine
matrielle et les applications. Il s'interface avec la couche matrielle, notamment par le biais du mcanisme
des interruptions. Il s'interface avec les applications par le biais des primitives qu'il offre : appels systme et
commandes. Le systme d'exploitation peut tre dcoup en plusieurs grandes fonctions prsentes sur la
figure ci-dessous Dans une premire approche, ces fonctions qui seront tudies plus en dtails dans les
chapitres suivants du cours sont :

Gestion du processeur : le systme doit grer l'allocation du processeur aux diffrents programmes
pouvant s'excuter. Cette allocation se fait par le biais d'un algorithme d'ordonnancement qui planifie
l'excution des programmes. Selon le type de systme d'exploitation, l'algorithme d'
ordonnancement rpond des objectifs diffrents

Gestion de la mmoire : le systme doit grer l'allocation de la mmoire centrale entre les diffrents
programmes pouvant s'excuter (pagination/segmentation). Comme la mmoire physique est
souvent trop petite pour contenir la totalit des programmes, la gestion de la mmoire se fait selon le
principe de la mmoire virtuelle : un instant donn, seules sont charges en mmoire centrale, les
parties de code et donnes utiles l'excution

Gestion des entres/sorties : le systme doit grer l'accs aux priphriques, c'est--dire faire la
liaison entre les appels de haut niveau des programmes utilisateurs (exemple getchar()) et les
oprations de bas niveau de l'unit dchange responsable du priphrique (unit dchange clavier)
: c'est le pilote d'entres/sorties (driver) qui assure cette correspondance

Gestion de la concurrence : Comme plusieurs programmes coexistent en mmoire centrale, ceux-ci


peuvent vouloir communiquer pour changer des donnes. Par ailleurs, il faut synchroniser l'accs
aux donnes partages afin de maintenir leur cohrence. Le systme offre des outils de
communication et de synchronisation entre programmes

Gestion des objets externes : La mmoire centrale est une mmoire volatile. Aussi, toutes les
donnes devant tre conserves au-del de l'arrt de la machine, doivent tre stockes sur
une mmoire de masse ( disque dur, disquette, cdrom...). La gestion de l'allocation des mmoires
de masse ainsi que l'accs aux donnes stockes s'appuient sur la notion de fichiers et de systme
de gestion de fichiers (SGF).

Gestion de la protection : le systme doit fournir des mcanismes garantissant que ses ressource s
(CPU, mmoire, fichiers) ne peuvent tre utilises que par les programmes auxquels les droits
ncessaires ont t accords. Il faut notamment protger le systme et la machine des programmes
utilisateurs (mode d'excution utilisateur et superviseur)

Fig 6 : Les grandes fonctions du systme dexploitation

Introduction>Introduction aux systmes d'exploitation>Classe des systmes

1.4 Les diffrentes classes de systme

Les systmes d'exploitation multiprogramms peuvent tre classs selon diffrents types qui dpendent
des buts et des services offerts par les systmes. On distingue principalement trois grandes classes de
systmes

les systmes multiutilisateurs interactifs : l'utilisateur est "derrire son clavier et son cran" ; il
soumet des excutions et attend les rsultats : il faut donc rduire au maximum le temps d'attente et
faire croire l'utilisateur qu'il est seul utiliser la machine. Ce sont des systmes adapts la mise
au point de programmes (exemple : UNIX, Linux)

les systmes traitements par lots (batch) : les programmes sont excuts en diffr, les uns la
suite des autres. Ce sont des systmes ddis aux travaux de production (exemple : MVS...). On
peut noter que beaucoup de systmes offrent simultanment un service de temps partag et un
service de traitement par lots (VMS)

les systmes temps rels : les programmes en excution sont soumis des contraintes de temps,
c'est--dire que leurs excutions doivent tre imprativement acheves une date butoir appele
chance. Comme ces systmes sont souvent interfacs un environnement dynamique (procd)
dlivrant des vnements synchrones ou asynchrones auxquels ils doivent ragir, on parle aussi de
systmes ractifs. Ce sont des systmes adapts la commande de procd (exemple : LynxOS...)

1.4.1 Un peu plus sur les systmes temps rel


Dfinition : Application temps rel
Une application temps rel est une application pour laquelle le facteur temps est la principale contrainte
respecter. L' application doit fournir un rsultat juste mais si celui-ci est fourni hors dlai, alors il ne
pourra pas tre valid.

Il ne sagit pas par contre, de rendre le rsultat le plus vite possible, mais simplement temps. Lchelle du
temps relative la contrainte temporelle varie dune application lautre : elle peut tre par exemple de
lordre de la micro-seconde dans des applications de contrle radars, mais peut tre de lordre de lheure
pour une application de contrle chimique. Par ailleurs, le systme temps rel peut tre qualifi de systme
embarqu ou enfouis (embedded system). On distingue deux types de contraintes temporelles:

Les contraintes temporelles strictes : les fautes temporelles (non-respect dune chance) sont
intolrables pour la validit du systme. Elles mettent en pril le systme temps rel lui-mme voire
son environnement.

Les contraintes temporelles relatives : quelques fautes temporelles peuvent tre sup port es sans
remettre en cause la validit du systme. Il s'ensuit gnralement une baisse de performance du
systme.

Un systme temps rel se divise en deux parties qui interagissent entre elles (figure 7):

Dun ct, un procd, en gnral industriel, muni de capteurs, envoie des mesures ou dclenche
des vnements avec une occurrence priodique ou alatoire.

De lautre ct, un systme informatique, connect au procd. Ce systme informatique


commande et contrle de manire dynamique le comportement du procd, en respectant les
contraintes de temps qui lui sont associes. Il ragit dans un temps contraint aux vnements et
mesures prleves sur le procd : on dit alors que le systme est ractif. Le systme informatique
se dcompose lui-mme en deux parties : l'application temps rel proprement dite construite par un
ensemble de tches, qui sont actives de manire priodique pour raliser les prises de mesures ou
de manire apriodique pour prendre en compte les vnements du procd. Ces tches utilisent
les services d'un noyau temps rel appel gnralement excutif temps rel pour s'excuter et
utiliser les ressource s matrielles ou priphriques.

Fig 7 : Systme temps rel

Exemple dune application temps rel


On considre un procd chimique dextraction de matire grasse laide dun solvant tel que lhexane pilot par
ordinateur. La colonne dextraction comporte un robinet pour amener le solvant, un capteur de temprature et un
ph-mtre. La colonne de distillation est munie galement dun capteur de temprature. Les deux dispositifs sont
chauffs laide de deux becs bunsen. Lapplication lit rgulirement les tempratures de la colonne de distillation
et de la colonne dextraction. Si une temprature devient anormale, par exemple, trop leve, lapplication doit
ragir dans un dlai maximum, qui garantit que la raction chimique peut se poursuivre, pour agir sur le bec bunsen
associ (le baisser).

Introduction>Introduction aux systmes d'exploitation>Notions de base

1.5 Notions de base

Nous rvisons ci-dessous quelques notions de base.

1.5.1 Interfaces du systme d'exploitation


Dfinition : Commandes et appels systmes
Les appels systmes constituent l'interface du systme d'exploitation et sont les points d'entres
permettant l'excution d'une fonction du systme. Les appels systme sont directement appelables
depuis un programme. Les commandes permettent elles d'appeler les fonctions du systme depuis le
prompt de l'interprteur de commande (shell, invite du dos).

1.5.2 Modes d'excutions et Commutations de contexte


Lorsqu'un programme utilisateur fait un appel systme (ici open), il va excuter une fonction du systme
d'exploitation. Il quitte alors son mode courant d'excution (mode utilisateur) pour passer dans un mode
d'excution privilgi qui est le mode d'excution du systme d'exploitation (mode superviseur) : ce mode
est privilgi dans le sens o il donne accs un plus grand nombre d'instructions machine que le mode
utilisateur (notamment il permet l'excution des instructions de masquage et dmasquage dinterruptions
interdites en mode utilisateur). Ce passage du mode utilisateur au mode superviseur constitue une
commutation de contexte : elles s'accompagne d'une opration de sauvegarde du contexte utilisateur.

Fig 8 : Commutation de contexte

Lorsque l'excution de la fonction systme est acheve, le programme repasse du mode superviseur au
mode utilisateur. Il y a de nouveau une opration de commutation de contexte avec restauration du
contexte utilisateur sauvegard lors de l'appel systme.

Fig 9 : Commutation de contexte

Il y a trois grandes causes de passage du mode utilisateur au mode superviseur :

le fait que le programme utilisateur appelle une fonction du systme. C'est une demande explicite de
passe en mode superviseur.

l'excution par le programme utilisateur d'une opration illicite (division par 0, instruction machine
interdite, violation mmoire) : c'est la trappe. L'excution du programme utilisateur est alors
arrte.

la prise en compte d'une interruption par le matriel et le systme d'exploitation. le programme


utilisateur est alors stopp et l'excution de la routine d'interruption associe l'interruption
survenue excute en mode superviseur.

Dfinition : Mode superviseur


Le mode superviseur est le mode d'excution du systme. C'est un mode d'excution privilgi qui
autorise notamment l'appel des instructions interdites en mode utilisateur (manipulation des
interruptions). Ce mode assure la protection du systme d'exploitation. Le passage du mode utilisateur
vers le mode superviseur est soit provoqu par un appel systme, soit par une trappe, soit par l'arrive
d'une interruption

Dfinition : Commutations de contexte

Le passage entre les modes utilisateur / superviseur s'accompagne de commutations de contexte


(sauvegarde du contexte utilisateur - changement de mode d'excution - restitution du contexte
utilisateur)

Introduction>qcm : Un premier test

2 Un premier test
Exercice
Pour en finir avec le chapitre introductif
Question : Quel est le rle du systme dexploitation ?
Compiler un programme et construire un excutable
Grer les accs disque
Partager la machine physique entre les diffrents programmes et btir une machine virtuelle plus accessible lutilisateur
Rponse :
Partager la machine physique entre les diffrents programmes et btir une machine virtuelle plus accessible
lutilisateur
Question : Un systme est dit ractif
Car il doit offrir le plus petit temps de rponse possible lutilisateur
Car il doit ragir des vnements dlivrs par des priphriques externes
Car il est rapide
Rponse :
Car il doit ragir des vnements dlivrs par des priphriques externes
Question : Une interruption
Permet de squencer lexcution des programmes
Est un signal externe au processeur obligeant celui-ci interrompre son traitement en cours pour traiter la cause de
lvnement
Rponse :
Est un signal externe au processeur obligeant celui-ci interrompre son traitement en cours pour traiter la
cause de lvnement
Question : Une commutation de contexte intervient
chaque changement de mode dexcution
Sur loccurrence dune interruption
Lorsque le programme commet une erreur grave
Rponse :
chaque changement de mode dexcution

Chapitre 2 : Processus
Ce chapitre est consacr l'tude des processus

Cours : Processus
Notion de processus
Rappel sur la chaine de production d'un programme excutable.
L'excution d'un programme
Le processus
Les tats du processus
Le bloc de contrle du processus (PCB)

Processus Unix : cration, vie et mort


Cration d'un processus Unix
Terminaison d'un processus Unix
Les primitives de recouvrement
Architecture du systme Unix
La notion de processus lger
Dfinition
Primitives associes aux processus lger
Table des figures

Processus >Processus

1 Cours : Processus
Nous commenons prsent l'tude du fonctionnement d'un systme multiprogramm. Dans ce cours,
nous nous intressons la fonction d'excution : elle recouvre principalement deux notions : celle de
processus ,qui correspond l'image d'un programme qui s'excute et celle d' ordonnancement qui
correspond au problme de l'allocation du processeur et donc du partage du processeur entre diffrents
processus .

1.1 Notion de processus


1.1.1 Rappel sur la chaine de production d'un programme excutable.
La chaine de production de programme (figure 1) transforme un programme crit dans un langage de haut
niveau en un programme dit excutable, crit en langage machine. Cette transformation s'effectue l'aide
de plusieurs tapes : L'utilisateur saisit son programme l'aide de l'diteur de texte qui cre un fichier sur le
disque que l'on appelle le fichier source. Ce fichier source est ensuite compil l'aide d'un compilateur
dpendant du langage de programmation utilis et dont le rle est de vrifier que la syntaxe du langage est
respecte et de gnrer alors l'quivalent du programme source en langage machine : on obtient alors sur
disque le fichier objet. Ce fichier objet est ensuite soumis l'diteur de liens dont le rle est de rsoudre les
rfrences externes, c'est--dire par exemple, d'associer les appels systme inclus dans le programme
leur adresse dans le systme. L'diteur de liens produit sur disque le fichier excutable. Lorsque l'utilisateur
demande l'excution de son programme, le fichier excutable est alors mont en mmoire centrale : c'est
l'tape de chargement. Le systme alloue de la place mmoire pour placer le code et les donnes du
programme.

Fig 1 : Chaine de production de programme

Exemple sur Unix :


Pour le systme d'exploitation Unix, les tapes suivantes permettent de passer d'un fichier source un processus

saisie du fichier source avec un diteur tel que vi : programme.c


compilation et production du fichier programme.o : cc -c programme.c <return>
dition des liens et production du fichier excutable programme : ld -o programme programme.o <return>
chargement et cration du processus : programme <return>

1.1.2 L'excution d'un programme


La figure 2 reprsente l'excution du programme un niveau qui est celui de l'architecture matrielle de la
machine. Le programme excuter est plac en mmoire centrale partir de l'emplacement d'adresse
102. Le processeur a commenc l'excution du programme : la premire instruction de celui-ci a t
charge dans le registre instruction (RI) et le Compteur Ordinal (CO) contient l'adresse de la prochaine
instruction excuter soit 103. Lorsque l'instruction courante aura t excute, le processeur chargera
dans la registre RI l'instruction pointe par le CO, soit add Imm R1 5 et le compteur ordinal prendra la
valeur 104. L'excution de l'instruction add Imm R1 5 va modifier le contenu du registre PSW puisque c'est
une instruction arithmtique : les flags de signe, de nullit etc... sont mis jour. On voit donc qu' chaque
tape d'excution du programme, le contenu des registres du compteur ordinal volue. De mme le
contenu de la mmoire centrale peut tre modifi : criture, lecture dans la pile (Push, Pop), modification
des donnes par une instruction Store. On appelle processus l'image de l'tat du processeur et de la
mmoire au cours de l'excution d'un programme. Le programme est statique et le processus reprsente la
dynamique de son excution. Lors de l'tape de chargement, le systme alloue de la place mmoire pour
placer le code et les donnes du programme et cre la pile d'excution de ce qui est en train de devenir un

processus. Il alloue alors une structure de donne descriptive du processus destine regrouper toutes les
informations du contexte du processus : le bloc de contrle du processus. Le processus est alors cr. Il
est prt s'excuter.

Fig 2 : Excution d'un programme

1.1.3 Le processus
Dfinition : Processus

Un processus est un programme en cours d'excution auquel est associ un environnement


processeur (CO, PSW, RSP, registres gnraux) et un environnement mmoire appels contexte
du processus.
Un processus est l'instance dynamique d'un programme et incarne le fil d'excution de celui-ci
dans un espace d'adressage protg (objets propres : ensemble des instructions et donnes
accessibles)
Un programme rentrant est un programme pour lequel il peut exister plusieurs processus en
mme temps

1.1.3.1 Les tats du processus

Lors de son excution, un processus est caractris par un tat :

lorsque le processus obtient le processeur et s'excute, il est dans l'tat lu. L'tat lu est l'tat
d'excution du processus.

lors de cette excution, le processus peut demander accder une ressource (ralisation d'une
entre/sortie, accs une variable protge) qui n'est pas immdiatement disponible : le processus
ne peut pas poursuivre son excution tant qu'il n'a pas obtenu la ressource (par exemple, le
processus doit attendre la fin de l'entre/sortie qui lui dlivre les donnes sur lesquelles il ralise les
calculs suivants dans son code) : le processus quitte alors le processeur et passe dans l'tat bloqu.
L'tat bloqu est l'tat d'attente d'une ressource autre que le processeur.

lorsque le processus a enfin obtenu la ressource qu'il attendait, celui-ci peut potentiellement
reprendre son excution. Cependant, nous nous sommes placs dans le cadre de systmes
multiprogramms, c'est--dire qu'il y a plusieurs programmes en mmoire centrale et donc plusieurs
processus.. Lorsque le processus est pass dans l'tat bloqu, le processeur a t allou un autre
processus. Le processeur n'est donc pas forcment libre. Le processus passe alors dans l'tat prt.
L'tat Prt est l'tat d'attente du processeur.

Le passage de l'tat prt vers l'tat lu constitue l'opration d'lection. Le passage de l'tat lu vers
l'tat bloqu est l'opration de blocage. Le passage de l'tat bloqu vers l'tat prt est l'opration de
dblocage.

Un processus est toujours cre dans l'tat prt. Un processus se termine toujours partir de l'tat lu (sauf
anomalie).

Fig 3 : Etats d'un processus

Exemple sous Unix


La figure ci-dessous prsente le graphe d'tats simplifi pour un processus Unix. Un processus volue entre trois
modes au cours de son excution : le mode utilisateur qui est le mode normal d'excution, le mode noyau en
mmoire qui est le mode dans lequel se trouve un processus prt ou bloqu (endormi) et le mode swapp qui est le
mode dans lequel se trouve un processus bloqu (endormi) dcharg de la mmoire centrale. En effet, le systme
Unix dcharge de la mmoire centrale les processus endormis depuis trop longtemps (ils sont alors dans l'tat
Endormi swapp). Ces processus rintgrent la mmoire centrale lorsqu'ils redeviennent prts (transition de
l'tat prt swapp vers l'tat prt). Un processus qui se termine passe dans un tat dit zombi. Il y reste tant que
son PCB n'est pas entirement dmantel par le systme.

Etats d'un processus Unix -graphe simplifi-

1.1.3.2 Le bloc de contrle du processus (PCB)

Le bloc de contrle d'un processus (PCB) contient les informations suivantes :

un identificateur unique du processus (un entier) : le PID

l'tat courant du processus (lu, prt, bloqu)

le contexte processeur du processus : la valeur du CO, la valeur des autres registres du processeur

le contexte mmoire : ce sont des informations mmoire qui permettent de trouver le code et les
donnes du processus en mmoire centrale

des informations diverses de comptabilisation pour les statistiques sur les performances systme

des informations lies l' ordonnancement du processus. Le PCB permet la sauvegarde et la


restauration du contexte mmoire et du contexte processeur lors des oprations de commutations
de contexte .

Fig 4 : Bloc de contrle d'un processus

Exemple sous Unix


Nous prenons en exemple la structure du bloc de contrle de processus dans le systme d'exploitation Unix. Le
bloc de contrle du processus est divis en deux parties :
chaque processus dispose d'une entre dans une table gnrale du systme, la table des processus. Cette
entre contient les informations sur le processus qui sont toujours utiles au systme quel que soit l'tat du
processus : l'identificateur du processus (pid), l'tat du processus, les informations d'ordonnancement, les
informations mmoire, c'est--dire l'adresse des rgions mmoire alloues au processus.
chaque processus dispose galement d'une autre structure, la Zone U. Cette Zone U contient d'autres
informations concernant le processus, mais ce sont des informations qui peuvent tre temporairement
"swappes" sur le disque.

Bloc de contrle d'un processus Unix

Processus >Processus>Les processus Unix

1.2 Processus Unix : cration, vie et mort


1.2.1 Cration d'un processus Unix
La primitive FORK permet la cration dynamique d'un nouveau processus qui s'excute de manire
concurrente avec le processus qui l'a cr. Tout processus Unix hormis le processus 0 est cre l'aide de
cette primitive. Le processus crateur (le pre) par un appel la primitive FORK cre un processus fils qui
est une copie exacte de lui-mme (code est donnes).

Dfinition : Primitive FORK


pid_t fork (void) : permet la cration d'un processus Unix par duplication complte du crateur.

Lors de l'excution de l'appel systme Fork, si les ressource s noyaux sont disponibles, le systme effectue
les oprations suivantes :

le systme alloue une entre la table des processus pour le nouveau processus

le systme alloue un PID unique au nouveau processus

le systme duplique le contexte du processus parent : le code, les donnes, et la pile

le systme retourne au processus pre le PID du processus cre et au nouveau processus (le fils) la
valeur 0.

Lors de cette cration le processus fils hrite de tous les attributs de son pre sauf :

l'identificateur de son pre

son propre identificateur

les temps d'excution du nouveau processus sont nuls.

Notamment, le fils hrite de tous les descripteurs de fichiers ouverts par son pre et partage donc ces
fichiers avec lui.

A l'issue de l'excution de la primitive Fork, chaque processus, le pre et le fils, reprend son excution
aprs le Fork. Le code et les donnes tant strictement identiques, il est ncessaire de disposer d'un
mcanisme pour diffrencier le com port ement des deux processus aprs le Fork. On utilise pour cela le
code retour du Fork qui est diffrent chez le fils (toujours 0) et le pre (PID du fils cr).

Dans l'exemple de la figure ci-dessous, le processus n12222 est le processus pre. Le processus 12224
est le processus fils cre par le processus de 12222 l'issue de l'appel la primitive Fork. Une fois la
primitive Fork excute par le pre, les deux processus (le pre et le fils) reprennent leur excution de
manire concurrente. Le processus fils a pour retour de la primitive Fork la valeur 0. Il va donc excuter la

partie de l'alternative pour laquelle (if pid = = 0) est vrai. Le processus pre au contraire a pour retour de la
primitive Fork la valeur du PID du processus cr c'est--dire une valeur positive. Il va donc excuter l'autre
partie de l'alternative. Dans cet exemple, la primitive GETPID retourne un processus la valeur de son
PID.. La primitive GETPPID retourne au processus le PID de son pre.

Exemple de cration d'un processus avec la primitive Fork

1.2.2 Terminaison d'un processus Unix


Un appel la primitive EXIT provoque la terminaison du processus effectuant l'appel avec un code retour
valeur. Un processus qui se termine passe dans l'tat zombi et reste dans cet tat tant que son pre n'a
pas pris en compte sa terminaison.

Dfinition : Primitive EXIT


void exit (int valeur) : provoque la terminaison du processus appelant

Lorsqu'un processus se termine, le systme dmantle tout son contexte, sauf l'entre de la table des
processus le concernant. Le processus pre, par un appel la primitive WAIT, rcupre la mort de son fils,
cumule les statistiques de celui-ci avec les siennes et dtruit l'entre de la table des processus concernant
son fils dfunt. Le processus fils disparat compltement. La communication entre le fils zombi et le pre
s'effectue par le biais d'un signal transmis du fils vers le pre (signal SIGCHLD ou mort du fils). Si le pre
n'attend pas la mort de son fils par un appel la primitive WAIT alors la table des processus n'est pas
libre et il y a risque de saturation de cette table.

Dfinition : Primitive WAIT


pid_t wait (int *status) : attente de la mort du fils

Synchronisation pre fils assurant une bonne libration des ressources du systme
la mort du fils.

Un processus fils dfunt reste zombi jusqu' ce que son pre ait pris connaissance de sa mort. Un
processus fils orphelin, suite au dcs de son pre (le processus pre s'est termin avant son fils) est
toujours adopt par le processus numro 1 (INIT) et non par son grand-pre.

1.2.3 Les primitives de recouvrement


Il s'agit d'un ensemble de primitives (famille EXEC) permettant un processus de charger en mmoire, un
nouveau code excutable. L'excution d'une de ces primitives EXEC entrane l'crasement du code hrit
au moment de la cration ( primitive Fork ) par le code excutable spcifi en paramtre de la primitive.
Des donnes peuvent tre passes au nouveau code excutable via les arguments de la primitive EXEC.

Dfinition : Primitives EXEC


Ensemble de primitives (famille EXEC) permettant un processus de charger en mmoire, un nouveau
code excutable :
int execl (const char *ref, const char *arg, ..., NULL) : ref est le chemin d'un excutable partir du
rpertoire courant, const char *arg, ..., NULL est la liste des arguments.
int execlp (const char *ref, const char arg, ..., NULL) : ref est le chemin d'un excutable partir de
la variable d'environnement PATH, const char *arg, ..., NULL est la liste des arguments.
int execv (const char *ref, const char *arg[]) : ref est le chemin d'un excutable partir du
rpertoire courant, const char *arg [] est un tableau contenant les arguments.
int execvp (const char *ref, const char *arg[]) : ref est le chemin d'un excutable partir de la
variable d'environnement PATH, const char *arg [] est un tableau contenant les arguments.

L'interface du programme principal d'un excutable (le main) se prsente toujours de la manire suivante :

int main (int argc, char *argv[], char *arge[]);

argc est le nombre de composants de la commande

argv est un tableau de pointeurs de caractres donnant accs aux diffrentes composantes de la
commande

arge est un tableau de pointeurs de caractres donnant accs l'environnement du processus.

Exemple
calcul 3 4

on a argc = 3, argv[0]="calcul",argv[1]="3"

et argv[2] = "4"

Calcul.c

main(argc,argv)

int somme;

if (argc <> 3) {printf("erreur"); exit();}

somme = atoi(argv[1]) + atoi(argv[2]); -- atoi : conversion caractre -->


entier

exit();

La figure ci-dessous donne un exemple de l'utilisation d'une des primitives EXEC : la primitive EXECL.
Dans l'exemple ci-dessous, le processus fils rsultant de l'excution du Fork va excuter la partie de
l'alternative pour laquelle PID == 0 est vrai. Dans cette alternative, le processus fils fait appel la primitive
EXECL en demandant l'excution d'un programme excutable qui a pour nom calcul et qui admet pour
paramtre argv[0] = "calcul", argv [1] = "3"et argv[2] ="2". Il faut noter que les arguments sont transmis
comme des chanes de caractres. C'est pourquoi une conversion de caractre vers entier est ncessaire.
Dans l'exemple donn, cette conversion est ralise l'aide de la primitive atoi.

Exemple de programmation avec une primitive de la famille Exec..

1.2.4 Architecture du systme Unix


Tout le systme UNIX repose sur ce concept arborescent de processus pre et de processus fils cr par
duplication du processus pre puis par recouvrement par un code excutable spcifique du code hrit du
processus pre. Le seul processus Unix qui n'est pas cre par un appel la primitive Fork puis par un
appel une des primitives Exec est le premier processus de la machine c'est--dire le processus 0. Une
fois cr, le processus 0 cre un deuxime processus, le processus 1 appel galement processus INIT.
Le processus 0 devient alors le processus Swapper c'est--dire le processus responsable de swapper hors
de la mmoire centrale les processus utilisateurs endormis depuis trop longtemps. Le processus INIT va
crer son tour un certain nombre de processus : d'une part les processus DEMONS responsable de
fonctions systme telles que la surveillance du rseau (inetd), la gestion de l'imprimante (lpd)..., d'autre part
des processus GETTY chargs de la surveillance des terminaux. Le processus INIT trouve l'ensemble des
processus crer dans un fichier qui est fichier /etc/inittab. Lorsqu'un utilisateur vient pour utiliser la
machine, il se logue sur un terminal. Le processus GETTY cre alors un nouveau processus, le processus
LOGIN charg de lire le login de l'utilisateur, son mot de passe et de vrifier dans le fichier /etc/passwd que
l'utilisateur est autoris se connecter la machine. Si l'utilisateur est autoris se connecter la
machine, alors le processus LOGIN va crer son tour un nouveau processus le processus SHELL c'est-dire l'interprteur de commande pour le nouvel utilisateur. Cet interprteur de commandes va prendre en
charge les commandes tapes par l'utilisateur et pour chacune d'elles il va cre un nouveau processus
charg d'excuter la commande. Ce processus existera le temps de l'excution du programme ou de la
commande.

L'arborescence de processus Unix

Processus >Processus>Les processus lgers

1.3 La notion de processus lger


1.3.1 Dfinition
Le processus lger constitue une extension du modle traditionnel de processus. Un processus classique
est constitu d'un espace d'adressage avec un seul fil d'excution, ce fil d'excution tant reprsent par
une valeur de compteur ordinal et une pile d'excution. Un processus lger est un espace d'adressage
dans lequel plusieurs fils d'excution peuvent voluer en parallle. Ces fils d'excution sont chacun
caractriss par une valeur de compteur ordinal propre et une pile d'excution prive.

Dfinition : Processus lger


Un processus lger est un espace d'adressage dans lequel plusieurs fils d'excution peuvent voluer en
parallle. Ces fils d'excution sont chacun caractriss par une valeur de compteur ordinal propre et une
pile d'excution prive.

Le gros avantage li la notion de processus lger est un allgement des oprations de commutations de
contexte : en effet lorsque le processeur commute d'un fil d'excution un autre fil et que ces deux fils
appartiennent au mme espace d'adressage, alors la commutation est trs allge puisqu'elle consiste
seulement changer de pile et de valeur de compteur ordinal, le contexte mmoire restant le mme. Un
inconvnient majeur est que l'espace d'adressage est compltement partag entre tous les fils d'excution
qui voluent au sein de celui-ci et donc les oprations de synchronisation sont plus souvent requises. .

1.3.2 Primitives associes aux processus lger

int pthread_create (pthread_t *thread, const pthread_attr_t *attr, void * (*start_routine)(void *), void
*arg) : Cration d'un processus lger : un processus lger identifi par l'identificateur *thread est
cre et attach l'excution de la routine (*start_routine)(void *), void *arg).

nt pthread_join ( pthread_t thread, void **value_ptr) : synchronisation entre processus lgers :


permet au processus lger principal d'attendre la terminaison de ses fils.

int pthread_exit (void **value_ptr) : terminaison de processus lger

La figure ci-dessous donne un exemple d'un programme dans lequel un processus lger principal (le main)
cre 4 autres processus lgers qui sont chacun rattachs la fonction void t_pthread(int i). Chaque
processus lger affiche le pid du processus auquel il appartient (l'espace d'adressage) par l'appel la
fonction getpid, puis son propre identifiant par l'appel la fonction pthread_self().

Exemple de programmation avec les processus lgers. .

Chapitre 3 : Ordonnancement
Ce chapitre est consacr l'tude de l' ordonnancement

Cours : Ordonnancement de processus


Notions lies l'ordonnancement de processus
Qu'est-ce que l'ordonnancement de processus ?
Ordonnancement premptif ou non premptif
Les entits systme responsables de la fonction d'ordonnancement
Les politiques d'ordonnancement
Objectifs des politiques d'ordonnancement
Les principales politiques d'ordonnancement
Politique d'ordonnancement "premier arriv, premier servi" (FIFO).
Politique d'ordonnancement "plus court d'abord"
Politique d'ordonnancement par tourniquet (Round Robin)
Politique d'ordonnancement par priorits constantes
Politique d'ordonnancement par files de priorits constantes multiniveaux avec ou sans extinction de priorit
Les politiques d'ordonnancement sous le systme Linux

Ordonnancement sous le systme Unix


Structures de donnes lies l'ordonnancement
Algorithmes d'ordonnancement mis en oeuvre
Ordonnancement temps rel
Caractristiques de l'ordonnancement temps rel
Les algorithmes d'ordonnancement temps rel
Classification des algorithmes d'ordonnancement temps rel
Modlisation de l'application temps rel pour la certification
Les tches priodiques
Les tches apriodiques

Ordonnancement en ligne premptifs pour des tches priodiques indpendantes.


L'ordonnancement Rate Monotonic (RM)
Ordonnancement Inverse Deadline (ID)
Ordonnancement Earliest Deadline (EDF)

Une application temps rel sous RT-Linux


Les tches RT-Linux.
Mise en uvre.
Format d'une application.

L'ordonnancement.
Exercices dirigs
Primitives de recouvrement Exec
Exercice 1
Exercice 2
Exercice 3

Ordonnancement>Ordonnancement de processus

1 Cours : Ordonnancement de processus


1.1 Notions lies l'ordonnancement de processus
1.1.1 Qu'est-ce que l'ordonnancement de processus ?
La figure 1 schmatise le fonctionnement d'une machine multiprocessus. Plusieurs processus sont
prsents en mmoire centrale. P1 est lu et s'excute sur le processeur. P2 et P4 sont dans l'tat bloqu
car ils attentent tous les deux une fin d'entre/sortie avec le disque. Les processus P3, P5 et P6 quant
eux sont dans l'tat prt : ils pourraient s'excuter (ils ont leur disposition toutes les ressource s
ncessaires) mais ils ne le peuvent pas car le processeur est occup par P1. Lorsque P1 quittera le
processeur parce qu'il a termin son excution, les trois processus P3, P5 et P6 auront tous les trois le droit
d'obtenir le processeur. Mais le processeur ne peut tre allou qu' un seul processus la fois : il faudra
donc choisir entre P3, P5 et P6 : c'est le rle de l' ordonnancement qui lira un des trois processus .

Fig 1 : qu'est-ce l'ordonnancement ?

Dfinition : Ordonnancement
La fonction d'ordonnancement gre le partage du processeur entre les diffrents processus en attente
pour s'excuter, c'est--dire entre les diffrents processus qui sont dans l'tat prt. L'opration d'lection
consiste allouer le processeur un processus.

1.1.2 Ordonnancement premptif ou non premptif


La figure 2 reprend le graphe d'tats tel qu'il a t vu la leon prcdente concernant les processus. Une
transition a t cependant ajoute entre l'tat lu et l'tat prt : c'est la transition de premption. La
premption correspond une opration de rquisition du processeur, c'est--dire que le processeur est
retir au processus lu alors que celui-ci dispose de toutes les ressources ncessaires la poursuite de
son excution. Cette rquisition port e le nom de premption .

Fig 2 : Ordonnancement premptif

Dfinition : Premption
Selon si l'opration de rquisition du processeur est autorise ou non, l'ordonnancement sera qualifi
d'ordonnancement premptif ou non premptif :
si l'ordonnancement est non premptif, la transition de l'tat lu vers l'tat prt est interdite : un
processus quitte le processeur si il a termin son excution ou si il se bloque.
si l'ordonnancement est premptif, la transition de l'tat lu vers l'tat prt est autorise : un
processus quitte le processeur si il a termin son excution , si il se bloque ou si le processeur est
rquisitionn.

1.1.3 Les entits systme responsables de la fonction d'ordonnancement


Le systme d'ordonnancement gre une file des processus (bloc de contrle) prts et une file des
processus bloqus. La file des processus prts est classe selon une politique d'ordonnancement qui
assure que le processus en tte de file est le prochain processus lire au regard de la politique mise en
oeuvre. Ce classement est effectu par l' ordonnanceur et est ractualis chaque fois qu'un processus
est prempt ou qu'un processus est dbloqu (ajout d'un nouvel lment prt). C'est le rpartiteur qui lit
le processus en tte de file, c'est--dire qui lui alloue un processeur libre. La figure montre le cas d'un
systme multiprocesseur ; le rpartiteur doit alors choisir quel processeur allouer. Dans un systme
monoprocesseur, cette question ne se pose videmment pas et souvent alors, ordonnanceur et rpartiteur

sont confondus. Une fois lu par le rpartiteur, le processus s'excute. S'il quitte le processeur, sur
premption, il rintgre la file des processus prts ; au contraire, s'il quitte le processeur sur un blocage, il
intgre la file des processus bloqus. Dans les deux cas, un nouveau processus est lu (la tte de file des
processus prts). Plus prcisment, la file d'attente des processus bloqus est souvent organise en files
multiniveaux, chaque niveau correspondant une attente d'un vnement/ ressource particulier auquel
peut tre ventuellement associ une priorit. Dans le cas o des vnements se produisent
simultanment, cette priorit sert alors dterminer quel vnement doit tre trait en premier.

Fig 3 : Ordonnanceur et rpartiteur

Dfinition : Ordonnanceur
L'ordonnanceur est un programme systme dont le rle est d'allouer le processeur un processus prt.

Ordonnancement>Ordonnancement de processus>Algorithmes d'ordonnancement

1.2 Les politiques d'ordonnancement


Dfinition : Politique d'ordonnancement
La politique d'ordonnancement dtermine le choix d'un processus lire parmi tous ceux qui sont prts.

1.2.1 Objectifs des politiques d'ordonnancement


Les buts de l' ordonnancement diffrent en fonction du type de systmes.

Systmes de traitements par lots. Le but est de maximiser le dbit du processeur ; c'est--dire le
nombre moyen de processus traits par unit de temps.

Systmes interactifs. Les buts principaux de l'ordonnancement sont premirement de maximiser le


taux d'occupation du processeur, c'est--dire le rap port entre le temps o le processeur est actif et
le temps total. En thorie, ce taux peut varier entre 0% et 100 % ; dans la pratique, on peut observer
un taux d'occupation variant entre 40 % et 95 %. Deuximement, on va chercher minimiser le
temps de rponse des processus, c'est--dire la dure sparant l'instant de soumission du
processus au systme de la fin d'excution du processus. Au mieux, le temps de rponse peut tre
exactement gal au temps d'excution du processus, lorsque le processus a immdiatement t lu
et s'est excut sans tre prempt.

Systmes temps rel. Le but principal est d'assurer le respect des contraintes de temps lies aux
processus.

1.2.2 Les principales politiques d'ordonnancement


Nous dcrivons ci-dessous les politiques mises en oeuvre dans des systmes interactifs ou traitements
par lots. Les politiques spcifiques aux systmes temps rel sont abordes dans la leon suivante.

1.2.2.1 Politique d'ordonnancement "premier arriv, premier servi" (FIFO).


C'est une politique l'anciennet, sans rquisition ; l'unit centrale est alloue selon l'ordre de soumission
des processus. Dans cette politique, des processus de faible temps d'excution peuvent tre pnaliss
parce qu'un processus de longue dure les prcde dans la file.

Fig 4 : Politique Premier Arriv, Premier Servi

1.2.2.2 Politique d'ordonnancement "plus court d'abord"


Cette politique tente de remdier l'inconvnient mentionn pour la politique prcdente. Maintenant,
l'unit centrale est alloue au processus de plus petit temps d'excution. Cette politique est galement une
politique sans rquisition. Elle a la proprit de minimiser le temps de rponse moyen pour l'ensemble des
algorithmes d'ordonnancement sans rquisition. Elle pnalise les travaux longs. Elle impose galement
d'estimer la dure des processus ce qu'on ne connat pas habituellement. Il existe une version avec
rquisition de cette politique appele "temps restant le plus court d'abord" : dans ce cas, le processus en
excution restitue le processeur lorsqu'un nouveau processus de temps d'excution infrieur son temps
d'excution restant devient prt.

1.2.2.3 Politique d'ordonnancement par tourniquet (Round Robin)


On dfinit une tranche de temps appele quantum qui peut varier de 10 ms 100 ms. Chaque processus
prsent dans la file des processus prts acquiert le processeur tour de rle, et ce pour au maximum un
temps gal au quantum de temps. Si le processus a termin son excution avant la fin du quantum, il libre
le processeur et le processus suivant dans la file des processus prts est lu. Si le processus n'a pas
termin son excution avant la fin du quantum, il perd le processeur et est rinsr en fin de file des
processus prts. Cette politique du tourniquet est usuellement utilise dans les systmes en temps partag.
Sa performance dpend largement de la taille du quantum. Un quantum trop grand augmente les temps de
rponse alors qu'un quantum trop petit multiplie les commutations de contexte jusqu' les rendre non
ngligeables.

Fig 6 : Politique par tourniquet

1.2.2.4 Politique d'ordonnancement par priorits constantes


Un niveau de priorit constant est affect chaque processus et un instant donn, le processus lu est
toujours celui de plus forte priorit. Cet algorithme prsente une version sans rquisition et une version
avec rquisition. Le dfaut de cette politique est le risque de famine encouru par le processus de faible
priorit. Une solution ce problme est de faire "vieillir" la priorit des processus en attente, c'est--dire
d'augmenter celle-ci en fonction du temps d'attente. La priorit des processus devient ainsi variable.

Complment :
La famine est la situation o un processus ne peut disposer d'une ressource qu'il demande (ici le processeur)

Fig 7 : Politique par priorits constantes

1.2.2.5 Politique d'ordonnancement par files de priorits constantes multiniveaux avec ou


sans extinction de priorit

Les politiques prsentes jusqu' prsent utilisent une seule file d'attente des processus prts. On choisit
ici de dfinir plusieurs files de processus prts, chaque file correspondant un niveau de priorit ; on peut
alors avoir n files de priorits diffrentes variant de 0 n-1. Dans une file donne, tous les processus ont la
mme priorit et sont servis soit selon une politique l'anciennet sans premption , soit selon une
politique de tourniquet. Le quantum peut tre diffrent selon le niveau de priorit de la file. L' ordonnanceur
sert d'abord tous les processus de la file de priorit n, puis ceux de priorit n-1 ds que la file de niveau n
est vide et ainsi de suite...
On peut dfinir deux variantes de l'algorithme, fonction de l'volution de la priorit des processus :

les priorits des processus sont constantes tout au long de leur excution. A ce moment-l, un
processus en fin de quantum est toujours rinsr dans la mme file d'attente, celle correspondant
son niveau de priorit.

les priorits des processus voluent dynamiquement en fonction du temps de service dont a
bnfici le processus. Ainsi un processus de priorit n, la fin du quantum de la file n, si il n'a pas
termin son excution, n'est pas rinsr dans la file de priorit n, mais dans la file de priorit n-1. Et
ainsi de suite... On cherche ici minimiser les risques de famine pour les processus de faible priorit
en faisant petit petit baisser la priorit des processus de plus forte priorit.

Fig 8 : Politique par priorits multiniveaux avec ou sans extinction de priorit

1.2.2.6 Les politiques d'ordonnancement sous le systme Linux

Il existe trois politiques (classes) d' ordonnancement dans Linux qui correspondent aux politiques dfinies
dans la norme pour les systmes d'exploitation ouverts, POSIX.: deux sont dites temps rel, SCHED_FIFO
et SCHED_RR, la troisime est classique SCHED_OTHER. On peut attribuer un processus l'une de ces
trois classes grce l'appel systme : sched_setscheduler(). Comme dans les systmes Unix, la politique
d'ordonnancement SCHED_OTHER de Linux a plusieurs objectifs : avoir de bons temps de rponses,
assurer une bonne capacit de traitement et essayer de rpartir quitablement le temps CPU entre les
diffrents processus. Elle correspond ce qu'on appelle la politique "en temps partag". Chaque processus
Linux a une priorit variable qui dpend de nombreux facteurs parmi lesquels nous pouvons citer le taux
d'utilisation de la CPU et l'intensit des entres / sorties.
Il existe deux autres classes d'ordonnancement dites temps rel : SCHED_FIFO et SCHED_RR.Les
rubriques "policy" et "rt_priority" stockes dans la structure des processus Linux permettent de leur attribuer
une classe d'ordonnancement et une priorit temps rel. SCHED_FIFO et SCHED_RR ne sont pas des
classes temps rel strictes, mais relatives. Quand un processus temps rel est prt, tous les processus de
priorit infrieure sont mis de ct. Un processus de la classe SCHED_FIFO peut s'excuter jusqu' la fin
de son traitement ou jusqu' ce qu'un processus de la classe SCHED_FIFO de priorit temps rel plus forte
soit prt. Un processus de la classe SCHED_RR est interrompu la fin de son quantum de temps ou ds
qu'un processus de priorit temps rel (SCHED_FIFO ou SCHED_RR) suprieure est prt. Il existe dans
cette classe un principe de tourniquet parmi les processus de mme priorit.

Ordonnancement>Ordonnancement de processus>Un petit test ordonnancement

Exercice
Quelques questions d'ordonnancement
Question : Soient trois processus A, B, C soumis dans cet ordre de temps d'excution respectif 4, 2, 9. Quelles propositions
sont exactes ?
Avec une politique FIFO, l'ordre d'excution est C, B puis A
Avec une politique Plus Court d'Abord, l'ordre d'excution est B, A, puis C
Avec une politique par priorit fixe, l'ordre d'excution est A, B, puis C
Rponse :
Avec une politique Plus Court d'Abord, l'ordre d'excution est B, A, puis C
Question : Le processus A de priorit 5 s'excute. Le processus B de priorit 7 se rveille. Quelles sont les propositions
justes ?
B interrompt l'excution de A car B est plus prioritaire et l'ordonnancement est premptif
A continue son excution car il est plus prioritaire et l'ordonnancement est premptif
A continue son excution car l'ordonnancement est non premptif
B interrompt l'excution de A car B est plus prioritaire et l'ordonnancement est non premptif
Rponse :
A continue son excution car il est plus prioritaire et l'ordonnancement est premptif ou A continue son
excution car l' ordonnancement est non premptif
Question : Un processus rentrant est :
Un programme excutable lanc plusieurs fois en parallle
Un processus qui a termin son excution
Un programme excutable qui modifie son code.
Rponse :
un programme excutable lanc plusieurs fois en parallle

Ordonnancement>Ordonnancement de processus>Ordonnancement sous Unix

1.3 Ordonnancement sous le systme Unix

Les oprations relatives l' ordonnancement sont ralises par le systme Unix chaque fois qu'un
processus s'apprte passer du mode systme au mode utilisateur, donc la suite de l'occurrence soit
d'une interruption, d'un appel systme ou d'une trappe. La politique d'ordonnancement du systme Unix est
une politique multiples niveaux de priorit avec quantum de temps. Le noyau recalcule la priorit d'un
processus quand il passe du mode noyau au mode utilisateur. Dans une premire approche, ce calcul
permet une extinction de priorit des processus qui s'excutent de manire permettre l'excution de tous
les processus et viter les problmes de famine

1.3.1 Structures de donnes lies l'ordonnancement


La priorit de chaque processus est code dans l'entre de la table des processus qui lui correspond. La
plage des priorits des processus est partitionne en deux sous-ensembles. Chaque ensemble contient
plusieurs niveaux de priorits et chaque niveau de priorit est associ une file d'attente (fig 9) :

Fig 9 : Files de priorits pour l'ordonnancement sous Unix

les priorits utilisateurs : ce sont les processus prempts par l' ordonnanceur au moment de leur
retour en mode utilisateur. Un processus qui se rveille quitte la priorit noyau pour rintgrer les

priorits utilisateur. La procdure de traitement de l'interruption horloge ajuste les priorits des
processus en mode utilisateur toutes les secondes et fait entrer le noyau dans son algorithme
d'ordonnancement pour viter qu'un processus monopolise l'unit centrale

les priorits noyau : ce sont des processus endormis en attente d'un vnement. La file o le
processus s'endort est fonction de l'vnement attendu et la priorit correspond une "prfrence"
sur les rveils suite un vnement. Un processus endormi en priorit noyau demeure toujours
dans la file o il s'est endormi

1.3.2 Algorithmes d'ordonnancement mis en oeuvre


L'algorithme mis en uvre s'appuie sur la routine d'interruption horloge qui fait rgulirement passer le
processus en mode noyau. Plus prcisment :

A chaque interruption horloge, le systme incrmente de une unit la valeur du champ "utilisation du
processeur" pour le processus lu.

Toutes les secondes c'est--dire toutes les 50 100 interruptions horloge, la valeur du
champ "utilisation du processeur" pour tous les processus est divise par deux. Puis la priorit des
processus est recalcule selon la formule suivante : priorit du processus = Utilisation du processeur
/2 + (priorit de base du niveau utilisateur) Du fait de ce recalcul des priorits; les processus se
dplacent dans les files de priorit

Un exemple de mise en uvre


On considre trois processus A, B et C qui ont chacun une priorit initiale de 60. La priorit de base du niveau
utilisateur est galement la priorit 60. L'interruption horloge se dclenche 60 fois par seconde. A l'instant 0, le
processus A est lu. Chaque seconde, l'interruption horloge survient et le champ "utilisation du processeur "
(compte UC sur la figure 10) est incrment de une unit. Au bout de 60 secondes (instant t = 1), la priorit des
processus est recalcule. Du fait que les processus B et C ne se sont pas encore excuts leur priorit est
inchange (le compte UC est nul pour ces processus). La priorit du processus A par contre baisse et devient gale
75 (60 + 30/2). C'est donc le processus B qui est prsent lu. A l'instant 2, de nouveau les priorits sont
recalcules. Le compte UC du processus C tant toujours nul , la priorit de ce processus n'est pas modifie. Les
priorits du processus A et B par contre voluent et deviennent respectivement gales 67 pour le processus A
(60 + 15/2) et 75 pour le processus B. On voit prsent que le processus A a une priorit qui remonte du fait
qu'il n'a pas pu utiliser l'unit centrale.

Fig 10 : Exemple de mise en uvre de l'ordonnancement sous Unix

Ordonnancement>Ordonnancement de processus>Ordonnancement temps rel

1.4 Ordonnancement temps rel


1.4.1 Caractristiques de l'ordonnancement temps rel
Dans un systme temps rel, le but principal de l'ordonnancement est de permettre le respect des
contraintes temporelles associes l'application et aux tches. Chaque tche possde un dlai critique qui
est le temps maximal dont elle dispose pour s'excuter depuis sa date de rveil. La date butoir rsultante
est appele chance. Le dpassement d'une chance est appel faute temporelle. Beaucoup
d'applications temps rel sont des applications embarques et critiques et il est ncessaire de certifier l'
ordonnancement ralis, c'est--dire de vrifier avant le lancement de l'application (hors ligne) le respect
des contraintes temporelles. Cette certification s'effectue l'aide de tests d'acceptabilit qui prennent en
compte les paramtres temporels des tches et notamment les temps d'excutions des tches. Il faut donc
pouvoir connatre ces temps d'excutions et surtout pouvoir les borner. Pour cela l'excutif doit tre
dterministe. Les tests d'acceptabilit sont rarement des conditions ncessaires et suffisantes. On tablit
donc soit des conditions ncessaires, soit des conditions suffisantes. Les tests d'acceptabilit utilisent les
temps d'excution maximum des tches pour pouvoir certifier les excutions. Il faut donc tre capable de
calculer ces temps d'excutions maximums. Pour cela, le sup port d'excution, l'excutif temps rel, doit
tre dterministe. Un excutif temps rel dterministe est un excutif pour lequel les temps de certaines
oprations systme et matrielles lmentaires peuvent tre borns : temps de commutation, temps de
prise en compte des interruptions, etc...

1.4.2 Les algorithmes d'ordonnancement temps rel


1.4.2.1 Classification des algorithmes d'ordonnancement temps rel

L'ordonnancement peut tre en ligne ou hors ligne. Un ordonnancement hors ligne tablit avant le
lancement de l'application une squence fixe d'excution des tches partir de tous les paramtres de
celles-ci. Cette squence est range dans une table et excute en ligne par un automate. Avec un
ordonnancement en ligne, la squence d'excution des tches est tablie dynamiquement par
l'ordonnanceur au cours de la vie de l'application en fonction des vnements qui surviennent (rveils des
tches, blocage, etc...). Dans ce dernier cas, l' ordonnanceur choisit le prochaine tche lire en fonction
d'un critre de priorit.

1.4.2.2 Modlisation de l'application temps rel pour la certification

On distingue deux types de tches pour la modlisation de l'application :

les tches priodiques : Elles correspondent aux mesures sur le procd ; elles se rveillent

rgulirement (toutes les P units de temps)

les tches apriodiques : Elles correspondent aux vnements ; elles se rveillent de manire
alatoire

Les tches priodiques

On distingue :

priodiques strictes : contraintes temporelles dures respecter absolument

priodiques relatives : contraintes temporelles molles qui peuvent tre non respectes de temps
autre (sans chance)

priodiques chance sur requte (dlai critique = priode)

Une tche priodique Tp (r0, C, R, P) est caractrise par les paramtres temporels suivants avec 0 ???C
?????R ????P :

r0, sa date de premier rveil

P, sa priode

rk, la date de rveil de la kme requte, rk = r0 + kP

C, son temps d'excution maximum

R, son dlai critique et dk, sa date d'chance qui est telle que chance d = rk + R

C(t) : le temps d'excution restant t

R(t) : le dlai critique dynamique c'est- dire le temps restant t jusqu' d.

Une tche priodique relative n'a pas de paramtre R dfini. Une tche priodique chance sur requte
est une tche pour laquelle R = P.

Fig 11 : Modle de tche priodique


Les tches apriodiques

On distingue :

apriodiques strictes : contraintes temporelles dures respecter absolument

apriodiques relatives : contraintes temporelles molles qui peuvent tre non respectes de temps
autre (sans chance)

Une tche apriodique Tap (r0, C, R) est caractrise par les paramtres temporels suivants avec 0 ???C
????R :

r, sa date de rveil

C, son temps d'excution maximum

R, son dlai critique et dk, sa date d'chance qui est telle que chance d = rk + R

C(t) : le temps d'excution restant t

R(t) : le dlai critique dynamique c'est- dire le temps restant t jusqu' d.

Une tche apriodique relative n'a pas de paramtre R dfini.

Fig 12 : Modle de tche apriodique

1.4.2.3 Ordonnancement en ligne premptifs pour des tches priodiques indpendantes.

Nous ordonnanons un ensemble de tches priodiques (configuration). Les priorits affectes aux tches

sont soit constantes (values hors ligne et fixes par la suite), soit dynamiques (elles changent dans la vie
de la tche) L'ordonnancement d'un ensemble de tches priodiques est cyclique et la squence se rpte
de manire similaire sur ce que l'on appelle la priode d'tude. Pour un ensemble de tches dpart
simultane (t = 0), la priode d'tude est : [0, PPCM(Pi)]
L'ordonnancement Rate Monotonic (RM)

Avec cet algorithme, la priorit d'une tche est fonction de sa priode, de telle sorte que la tche de plus
petite priode est la tche la plus prioritaire. Pour un ensemble de tches chance sur requte, le test
d'acceptabilit d'une configuration de n tches est (condition suffisante) donn sur la figure qui suit. La
figure ci-dessous donne un exemple pour trois tches priodiques chance sur requte, Tp1(r0=0, C=3,
P=20), Tp2(r0=0, C=2, P=5) et Tp3(r0=0, C=2, P=10). La tche la plus prioritaire est la tche Tp2 et la
tche la moins prioritaire est la tche Tp1. La squence est dcrite sur la priode d'tude, soit l'intervalle [0,
20]. Les trois tches respectent leurs contraintes temporelles. La condition suffisante est vrifie ; on a
: 3/20 + 2/5 + 2/10 = 0.75 < 0.77

Fig 13 : Ordonnancement Rate Monotonic


Ordonnancement Inverse Deadline (ID)

Avec cet algorithme, la priorit d'une tche est fonction de son dlai critique. La tche la plus prioritaire est
la tche de plus petit dlai critique. Cet algorithme constitue une gnralisation de l'algorithme Rate
Monotonic des tches quelconques. Une condition suffisante d'acceptabilit de tches est donn sur la
figure qui suit : La figure ci-dessous donne un exemple pour trois tches priodiques Tp1(r0=0, C=3, R=7,
P=20), Tp2(r0=0, C=2, R=4, P=5) et Tp3(r0=0, C=2, R=9, P=10). La tche la plus prioritaire est la tche
Tp2 et la tche la moins prioritaire est la tche Tp3. La condition suffisante n'est pas vrifie ; en effet on a :

3/7 + 2/4 + 2/9 = 1.14 > 1. Mais le chronogramme construit sur la priode d'tude de la configuration prouve
que l' ordonnancement des trois tches s'effectue sans faute temporelle.

Fig 14 : Ordonnancement Inverse Deadline


Ordonnancement Earliest Deadline (EDF)

La priorit maximale l'instant t est accorde la tche dont l'chance est la plus proche. La priorit des
tches est maintenant dynamique. La figure ci-dessous donne un exemple pour trois tches priodiques
Tp1(r0=0, C=3, R=7, P=20), Tp2(r0=1, C=2, R=4, P=5) et Tp3(r0=0, C=1, R=8, P=10). l'instant t=0, les
trois tches sont rveilles et la tche pour laquelle l'chance est la plus proche est la tche Tp2, qui donc
s'excute. l'instant t=2, la tche Tp2 a termin son excution et c'est maintenant la tche Tp1 qui est la
plus prioritaire. l'instant t=5, la tche Tp1 se termine et la tche Tp2 se rveille de nouveau. Mais, c'est
maintenant la tche Tp3 pour laquelle la date d'chance est t=8 qui est devenue la plus prioritaire. C'est
donc elle qui s'excute. On voit donc que contrairement ce qui se passe avec les algorithmes priorit
fixe o les priorits des tches sont calcules une fois pour toutes l'initialisation du systme, ici les
priorits des tches voluent les unes par rapport aux autres en fonction de leur urgence. Ainsi, l'instant
t=0, la tche Tp2 est plus prioritaire que la tche Tp3, mais le rap port d'urgence est invers l'instant t=5.

Fig 15 : Ordonnancement Earliest Deadline

Ordonnancement>Ordonnancement de processus>LinuxRT

1.5 Une application temps rel sous RT-Linux


Le systme RT-Linux est une extension du systme Linux classique vers le temps rel. Il est constitu par
un noyau temps rel Rt-Linux qui partage le processeur avec le noyau de base Linux et excute des tches
temps rel.

1.5.1 Les tches RT-Linux.


1.5.1.1 Mise en uvre.

Les tches RT-Linux s'excutent dans l'espace adresse du noyau Linux au mme titre que l' ordonnanceur
temps rel. Il existe dans les versions rcentes de Linux la possibilit de charger dynamiquement des
modules dans l'espace adresse du noyau et de les "lier" au code du noyau. On parle de "modules
chargeables". En effet, pour limiter la taille du noyau Linux et librer ainsi plus de place mmoire pour
l'utilisateur, on vite de compiler le noyau avec des composants qui ne sont pas ncessaires tout
moment. Ces composants sont par exemple des gestionnaires de priphriques. Lorsqu'on a besoin
d'ajouter ou de supprimer l'un de ces composants, on n'a plus besoin de recompiler tout le noyau comme
cela tait le cas auparavant: le composant est charg ou dcharg dynamiquement l'aide d'un module. Il
faut simplement configurer le noyau avant sa compilation pour qu'il accepte de grer les modules
chargeables:

Ainsi, les tches RT-Linux sont cres l'aide d'un "module chargeable".

Il y a plusieurs avantages mettre les tches dans l'espace adresse du noyau:

Elles partagent le mme espace adresse.

Comme elles sont dans l'espace adresse du noyau, on limine la charge occasionne par tout
changement de niveau de protection.

Un avantage plus pratique que performant. Dans l'espace adresse du noyau, il est permis de faire
rfrence aux objets et aux fonctions par leur nom plutt que par leur descripteur. C'est l'dition de
lien dynamique des "modules chargeables" qui rsoudra les symboles en adresse.

En conclusion cette solution, qui consiste mettre les tches temps rel dans l'espace adresse du noyau
permet d'optimiser les performances de RT-Linux. En contrepartie, cette solution com port e un risque :
Un "Bug" dans une tche temps rel peut mettre en danger tout le systme. Ce risque est renforc avec
l'utilisation du langage C, notamment les pointeurs. La seule garantie ce niveau est la rigueur du
programmeur.

Le mode opratoire consiste en gnral crer toutes les tches lors du chargement du module (fonction
init_module()) et les supprimer uniquement au dchargement (fonction cleanup_module). La structure
"rt_task_struct" (ou RT_TASK par " typedef struct rt_task_struct RT_TASK ;") des tches temps rel dans
RT-Linux est la suivante :

int *stack ; /* hardcoded */

int uses_fp ; /* this one is too*/

int magic ;

int state; Etat de la tche : RT_TASK_READY,...

int *stack_bottom ; Pointeur de pile.

int priority ; Politique d' ordonnancement base sur la priorit seule.

RTIME period; P : Priode si la tche est priodique.

RTIME resume_time;

struct rt_task_struct *next; Chanage simple de l'ensemble des tches cres dans l'application.

RTL_FPU_CONTEXT fpu_regs ;

r : Prochaine heure de rveil .

Les fonctions de gestion des tches temps rel dans RT-Linux sont listes ci-dessous. Les tats voqus
sont prsents dans les figures qui suivent.

int rt_task_init (RT_TASK *task, void (fn)(int data), int data, int stack_size, int priority) : Cration
d'une tche RT_Linux pointe par "task". Il y a rservation d'espace mmoire dans le noyau
(kmalloc) hauteur de stack_size. "fn" est le code excut par la tche. "data" est le paramtre
pass "fn" au dmarrage. "priority" est la priorit de la tche dont la valeur peut aller de 1, la plus
forte priorit, "RT_LOWEST_PRIORITY" (1000000), la plus faible.

int rt_task_delete (RT_TASK *task) : Suppression logique d'une tche : Pas de libration de l'espace
mmoire "kfree" ce niveau. Son tat passe RT_TASK_ZOMBIE.

int rtl_delete_zombies (void) : Suppression relle de l'ensemble des tches logiquement supprimes
par "rt_task_delete". "kfree" est effectu ici.

int rt_task_make_periodic (RT_TASK *task, RTIME start_time, RTIME period) : Rend la tche "*task"
priodique avec une priode "period" partir de la premire date de rveil "start_time".

int rt_task_wait (void) : Suspension de la tche priodique jusqu' sa prochaine date de rveil. Elle
met la tche qui l'a appele dans l'tat RT_TASK_DELAYED. En gnral toute tche priodique
indique par cette fonction qu'elle a termin son traitement : ce doit donc tre la dernire instruction
du code de la tche. Les tches apriodiques ne s'en servent pas car l'tat RT_TASK_DELAYED ne
leur correspond pas.

int rt_task_wakeup (RT_TASK *task) : Dclenche la tche "task", c'est--dire la met dans l'tat prt
RT_TASK_READY.

int rt_task_suspend (RT_TASK *task) : Inactive la tche "task", c'est--dire la met dans l'tat
RT_TASK_DORMANT. En gnral, cette routine est utilise par les tches apriodiques la place
de rt_task_wait pour signaler la fin de leur traitement. Une tche priodique ou apriodique peut tre

suspendue par une autre tche ou par l' ordonnanceur .

Les figures jointes donnent les graphes d'tat des tches priodiques et apriodiques pour Rt-Linux

Tches priodiques.

Tches apriodiques.

1.5.1.2 Format d'une application.

La dclaration des tches priodiques et apriodiques dans RT-Linux se fait l'aide d'un module noyau
dont nous prsentons le squelette ci-dessous :

On suppose que ce module s'appelle RT_PROCESS.C et qu'il va crer deux tches : T1 et T2. T1 est une
tche priodique et T2 apriodique.

Le module s'installe dans le noyau par : insmod RT_PROCESS.O On le dcharge du noyau par : rmmod
RT_PROCESS
#define MODULE

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/version.h>

#include <linux/errno.h>

#include <rtl_sched.h >

#include <linux/arch/i386/kernel/irq.h>

#define NTASKS 2

RT_TASK tasks[NTASKS]

Fonction 1
/*-- Fonction 1 = traitement de la tche priodique 1 --*/
Code de la fonction excute par la tche priodique 1; l'affectation de cette fonction la tche 1 est faite par
rt_task_init (Cf. plus bas). Toute tche priodique doit terminer son traitement par l'appel la fonction
rt_task_wait(). Cette routine met la tche dans l'tat RT_TASK_DELAYED, rinitialise la prochaine date de
rveil et fait appel l'ordonnanceur rtl_schedule().
void f_tche_1(int par1)
{

rt_task_wait() ;
}

Fonction 2
/*-- Fonction 2 = traitement de la tche apriodique 2 --*/
Code de la fonction excute par la tche apriodique 2. Toute tche apriodique doit
terminer son traitement par l'appel la fonction rt_task_suspend() sur elle-mme. Cette
routine met la tche dans l'tat RT_TASK_DORMANT et fait appel l'ordonnanceur
rtl_schedule().

void f_tche_2(int par2)


{
rt_task_suspend(&(tasks[2])) ;
}

Interruption Tache 2
/*-- Gestionnaire de l'interruption associe la tche 2 --*/
La tche apriodique 2 est associe un niveau d'interruption dont l'apparition active
le gestionnaire T2_Handler(). L'association entre le numro d'interruption et le
gestionnaire sera vue plus bas. Ce gestionnaire a au moins pour rle de rveiller la
tche apriodique concerne. Cette fonction met la tche dans l'tat RT_TASK_READY et
appelle l'ordonnanceur.

int T2_handler()
{
rt_task_wakeup(&(tasks[2])) ;
}

/*-- Ordres lancs l'installation du module: RT_PROCESS --*/


Lorsqu'un module est charg sous Linux (>insmmod RT_Process.o), il commence par
effectuer la fonction init_module(). Cette fonction doit donc figurer dans tous les
modules chargeables. Dans RT-Linux, on lui attribue le rle de l'initialisation des
tches temps rel (rt_task_init), de l'initialisation des priodes et des dates de
rveil pour les tches priodiques (rt_task_make_periodic) et de l'association des
niveaux d'interruptions aux gestionnaires associs (request_RTirq).

int init_module(void)
{

rt_task_init(&(tasks[0]), f_tche_1, 0, 3000, 4) ;


rt_task_init(&(tasks[1]), f_tche_2, 1, 3000, 5) ;
rt_task_make_periodic(&(tasks[0]), 5, 10) ;
request_RTirq(2, &T2_handler) ;
return 0 ;

/*-- Ordres lancs la suppression du module: RT_PROCESS --*/


void cleanup_module(void)
Lorsqu'un module est dcharg sous Linux, il excute systmatiquement la fonction
cleanup_module(). Cette fonction doit donc figurer dans tous les modules chargeables.
Dans RT-Linux, on lui attribue le rle de suppression des tches temps rel
(rt_task_delete) ainsi que celui de la libration des interruptions (free_Rtirq).
{

rt_task_delete(&(tasks[0])) ;
rt_task_delete(&(tasks[1])) ;
free_Rtirq(2) ;

1.5.2 L'ordonnancement.
Dans la version 1.2 de RT-Linux, prsente sur le site officiel du systme, trois ordonnanceur s premptifs
ont dj t installs :

Un ordonnanceur " priorit fixe" : il s'appuie sur le paramtre "priority" dfini au niveau de chacune
des tches. Lorsque plusieurs tches sont prtes, celle qui a la priorit la plus forte (la valeur la plus
petite) est lue. Une tche qui se rveille (RT_TASK_READY) pourra prempter la tche active si sa
priorit est plus forte.

Un ordonnanceur "Rate-Monotonic" : nous ne nous y intresserons pas, compte-tenu des limites de


cette politique vis--vis des tches apriodiques.

Un ordonnanceur "EDF" ("Earliest Deadline First") : Il utilise l'urgence comme critre de slection de
la prochaine tche lire.

Ordonnancement>Exercices dirigs

2 Exercices dirigs
2.1 Primitives de recouvrement Exec
Prambule : rappel du format des primitives de la famille exec

2.1.1 Exercice 1
Ecrivez un programme o un processus cre un fils, ce fils excutant la commande ls l :. Le pre attend la
fin de son fils. Par ailleurs, chacun des processus affiche son pid ; le fils affiche le pid de son pre et le pre
affiche le pid de son fils.

2.1.2 Exercice 2
On reprend le programme essai.c de l'exercice 4 de l'ed 2, dont le code est redonn ci-aprs.

On souhaite modifier ce code de manire remplacer la partie fils par un appel une primitive exec.
Donnez la modification du programme essai.c rsultante et le code du programme lire_fichier.c excut par
le fils.

2.1.3 Exercice 3
On souhaite crire un pseudo-code correspondant lalgorithme suivi par le shell. les tapes (simplifies)
du shell sont les suivantes :

Le shell lit une ligne de commande sur son entre standard et l'interprte selon un ensemble de
rgles fixes (on ne s'intresse pas au dtail de cette analyse)

le shell gre deux types de commandes :

les commandes en premier plan qui correspondent des processus pouvant lire et crire sur le

terminal.

les commandes en arrire plan qui sont "dtaches" du terminal, c'est--dire qui ne peuvent plus lire
et crire sur celui-ci.

Lorsqu'il traite une commande en premier plan, le shell attend la fin de celle-ci avant de prendre en compte
une nouvelle commande. Au contraire lorsque le shell traite une commande en second plan, il n'attend pas
la fin de celle-ci pour prendre en compte une nouvelle commande.
Ecrivez la boucle d'excution du shell. Voir la correction

Chapitre 4 : Outils de communication centraliss entre


processus
Ce chapitre est consacr l'tude de deux outils de communication centraliss entre processus Unix : les tubes anonymes et
les messages queues.

Cours : Les tubes anonymes


Dfinition et proprits d'un tube anonyme.
Les primitives associes au tube anonyme
La cration d'un tube
La fermeture du tube
Lecture dans le tube p
Ecriture dans le tube p
Un exemple de programmation avec les tubes anonymes.
Dfinition et proprits des MSQ
Les primitives associes aux MSQ
Cration et accs une MSQ
Envoi d'un message dans la file de messages
Rception d'un message depuis la file de messages
Destruction d'une file de messages
Un exemple de programmation avec les MSQ.
Exercices dirigs
Primitives d'utilisation des tubes
Exercice 1
Exercice 2
Table des figures

Outils de communication centraliss entre processus>Les tubes anomymes

1 Cours : Les tubes anonymes


Ce cours s'intresse un premier outil de communication entre processus placs sur une mme machine :
les tubes anonymes.

Un tube (pipe en anglais) est un fichier particulier. Il existe deux types de tube:

. les tubes anonymes . les tubes nomms

Le fichier tube est un outil de communication unidirectionnel qui est gr par le noyau comme une file de
donnes FIFO. Les lectures sont destructives car tout caractre lu est extrait de la file d'attente. Deux
nombres im port ants caractrisent le tube:

le nombre de lecteurs : si ce nombre est nul, les lectures ne sont pas autorises dans tube.

le nombre d'crivains : si ce nombre est nul, . il est quivalent une fin de fichier.

1.1 Dfinition et proprits d'un tube anonyme.

Un tube anonyme encore appeler tube ordinaire est associ un nud du systme de gestion de fichiers,
mais il reprsente un fichier qui n'a pas de nom. Ce fichier est supprim ds qu'il n'y a plus de processus
pour l'utiliser. Un tube anonyme n'ayant pas de nom, il ne peut tre connu que par la possession des
descripteurs qui lui donnent accs. La connaissance de ces descripteurs par un processus s'effectue de
deux moyens:

Le processus connat les descripteurs associs au tube car il a cr le tube.

Le processus connat les descripteurs associs au tube car il a hrit de ces descripteurs. On voit
donc que seuls les processus de la descendance du crateur du tube dont les anctres connaissent
eux-mmes les descripteurs sont habilits utiliser le tube. Un tube anonyme permet donc la
communication entre des processus de mme filiation pre-fils ou frres s'excutant sur une mme
machine. Il faut noter galement que les tubes ne prservent pas la limite des messages posts
dans le tube.

Dfinition : Tube anonyme


Un tube anonyme est un outil de communication unidirectionnel permettant de faire communiquer entre
eux des processus de mme filiation, ayant connaissance des descripteurs permettant l'accs au tube.

1.2 Les primitives associes au tube anonyme

1.2.1 La cration d'un tube


En crant le tube le processus1 se dote de 2 descripteurs:

. un descripteur en Lecture sur le tube

. un descripteur en Ecriture sur le tube

La primitive pipe (p) o le paramtre p est un tableau de deux entiers correspondant aux deux descripteurs
d'accs au tube permet la cration du tube anonyme p, avec p[0] comme descripteurs en lecture et p[1]
comme descripteur en criture.

Dfinition : Primitive pipe


int pipe (int p[2]) : cration du tube p.

1.2.2 La fermeture du tube


La fermeture du tube et sa destruction ont lieu lorsqu'il n'existe plus aucun processus utilisant le tube, c'est-dire qu'il n'existe plus aucun descripteurs ouverts pour ce tube, que ce soit en lecture ou en criture. La
primitive close (idf) permet de fermer le descripteur idf .

Dfinition : Primitive close


int close (int idf) : fermeture du descripteur idf.

1.2.3 Lecture dans le tube p


La primitive nb_lu = read (p[0], buf, nb) permet la lecture dans le tube p d'au plus nb caractres. Elle
retourne les caractres dans le tampon buf et nb_lu contient le nombre de caractres effectivement lus.
L'opration de lecture rpond la smantique suivante :

si le tube n'est pas vide, et contient N caractres, le nombre de caractres effectivement lus, nb_lu
est gal min (N, nb).

Si le tube est vide et que le nombre d'crivains sur le tube est nul, la fin de fichier est atteinte. Nb_lu
= 0.

Si le tube est vide et que le nombre d'crivains sur le tube n'est pas nul, le processus est bloqu
jusqu' ce le tube ne soit plus vite (un crivain a crit). En effet, par dfaut, l'opration de lecture sur
un tube vide est bloquante. Il est possible de rendre la lecture non bloquante, mais nous n'abordons
pas cette option dans le cours.

Dfinition : Primitive read (tube)


nb_lu = read (p[0], buf, nb) : lecture dans le tube p d'au plus nb caractres. Les caractres lus sont
retourns dans le tampon buf. nb_lu contient le nombre de caractres effectivement lus. Par dfaut, la
lecture sur un tube vide est bloquante.

1.2.4 Ecriture dans le tube p


La primitive nb_crit = write (p[1], buf, nb) permet l'criture dans le tube p des nb caractres placs dans le

tampon buf et nb_lu contient le nombre de caractres effectivement crits. L'opration d'criture rpond la
smantique suivante :

Si le nombre de lecteurs dans le tube est nul, une erreur est leve par le systme (signal SIGPIPE
lev) et le processus crivain est termin. En effet, le systme considre que si il n'y a plus de
lecteurs dans le tube, il est inutile d'y crire puisque les caractres crits ne pourront jamais tre lus.

Si le nombre de lecteurs dans le tube n'est pas nul, le retour de la primitive n'a lieu que lorsque les
nb caractres ont effectivement t crits. En effet par dfaut, l'criture sur le tube est bloquante. Il
est possible de rendre l'criture non bloquante, mais nous n'abordons pas cette option dans le
cours.

Dfinition : Primitive write (tube)


nb_crit = write (p[1], buf, nb) : criture dans le tube p des nb caractres placs dans le tampon buf.
nb_lu contient le nombre de caractres effectivement crits.

1.3 Un exemple de programmation avec les tubes anonymes.


#include <stdio.h>

int pip[2];

/* descripteur de pipe */

char buf [6];

{ main()

pipe(pip); /* creation pipe */

switch (fork())

{case -1: perror("fork"); exit(1);

case 0: fils();

default: pere();}

pere(){close pip[0]; write (pip[1],"hello",5); exit(0);} /* criture pipe */

fils() {close pip[1]; read (pip[0],buf,5); exit(0);}

/* lecture pipe */

On voit dans l'exemple ci-dessus :

La cration du tube a lieu avant la cration du processus fils, afin que celui-ci puisse hriter des
descripteurs du tube et donc l'utiliser pour communiquer avec son pre.

Chacun des processus, le pre et le fils, ferme le descripteur qui lui est inutile : ainsi le pre ferme
pip[0], le descripteur en lecture puisqu'il est crivain sur le tube. Inversement, le fils ferme pip[1], le
descripteur en criture puisqu'il est lecture sur le tube.

Outils de communication centraliss entre processus>Les tubes anomymes>Les files de message ou MSQ

Nous prsentons prsent un second outil de communication entre processus Unix : les files de messages
ou MSQ.

1.4 Dfinition et proprits des MSQ

Les files de messages UNIX constitue un autre mcanisme de communication entre processus UNIX
placs sur une mme machine. la diffrence du mcanisme des tubes, le mcanisme des files de
message est externe au systme de gestion de fichiers du systme UNIX. Le systme gre une table
spcifique pour cet outil, qui est identifi par une cl de type key_t. Cette cl est une valeur numrique et
tout processus ayant connaissance de la clef peut utiliser la file de messages pour envoyer ou recevoir des
messages. On voit donc qu' la diffrence des tubes, la file de message peut tre utilise par des
processus non ncessairement affilis entre eux. La file de message constitue l'implmentation UNIX du
concept de botes aux lettres. Il offre deux proprits : la prservation de la limite des messages ce qui est
diffrent des tubes, et la possibilit de multiplexage c'est--dire qu'une seule file peut servir pour plusieurs
destinataires. Les messages posts dans une file de messages sont obligatoirement constitus de deux
parties:

Un type qui est un entier long. Ce type est utile pour raliser le multiplexage.

Les donnes

Un exemple de messages

struct message {

long mtype; -- le type

float n1 ;

int tab[4];

Dfinition : File de messages (MSQ)


Une file de messages est un outil de communication entre processus Unix non ncessairement affilis
placs sur une mme machine qui implmente le concept de botes aux lettres. Une file de message ou
MSQ est identifie par une cl.

1.5 Les primitives associes aux MSQ

1.5.1 Cration et accs une MSQ


La primitive MSGGET permet un processus soit de crer une nouvelle file de messages, soit de
rcuprer une file de messages existantes afin de l'utiliser.

Dfinition : Primitive msgget


int msgid = msgget (key_t cle, int option) : permet de crer une nouvelle file de messages ou de rcuprer
une file de messages existante.

Le premier paramtre de la primitive, cl, permet de spcifier l'identifiant de la MSQ. Le second paramtre,
option, est une combinaison des constantes IPC_CREAT, IPC_EXCL et des droits d'accs associs la
file. La primitive en cas de succs retourne un identifiant interne au programme msgid. Plus prcisment, la
cration d'une file est obtenue grce aux combinaisons suivantes :

Positionnement de IPC_CREAT et de IPC_EXCL : cration d'une nouvelle file de messages avec les
droits spcifis dans option, condition que la file ayant pour rfrence cl n'existe pas dj. Sinon,
il y a erreur

Positionnement de IPC_CREAT seul: cration d'une nouvelle file de messages avec les droits
spcifis dans option, si celle-ci n'existe pas

La rcupration d'une file existante s'obtient en mettant les options 0.


CREATION D'UNE FILE de cl 17 en lecture criture pour tous

#define CLE 17

int msqid;

msqid = msgget (CLE, IPC_CREAT | IPC_EXCL | 0666);

RECUPERATION D'UNE FILE de cl 17

#define CLE 17

int msqid;

msqid = msgget (CLE,0);

1.5.2 Envoi d'un message dans la file de messages


La primitive msgsnd permet l'envoi d'un message dans une file de messages.

Dfinition : Primitive msgsnd


int msgsnd (int msgid, struct message *buf, int lg, int option) : envoi du message buf de taille lg octets
dans la MSQ d'identifiant msgid. Les options permettent de rendre l'envoi non bloquant si la file est
pleine.

1.5.3 Rception d'un message depuis la file de messages


La primitive msgrcv permet de recevoir un message depuis une file de messages. C'est ce niveau
qu'intervient le multiplexage dont nous avons parl prcdemment, c'est--dire que le rcepteur peut
dsigner parmi les messages prsents dans le file, un message qu'il souhaite plus spcifiquement
recevoir.

Dfinition : Primitive msgrcv


int msgrcv (int msgid, struct message *buf, int lg, long montre, int option) : rception du message buf de
taille lg octets dans la MSQ d'identifiant msgid. Le paramtre montre spcifie le type de message
extraire. Les options permettent de rendre la rception non bloquante si la file ne contient pas de
message avec le type attendu.

Le multiplexage utilise le paramtre type des messages. Les interprtations possibles du paramtre montre
spcifi dans la primitive msgrcv sont les suivantes :

Si montre > 0 alors le message le plus vieux dont le type est gal montre est extrait.

Si montre = 0 alors le message le plus vieux, quel que soit son type,, est extrait.

Si montre < 0, alors le message le plus vieux de type le plus petit infrieur ou gal |montre| est
extrait.

1.5.4 Destruction d'une file de messages


La primitive msgctl permet l'accs et la modification des informations contenues dans la table des files de
messages gre par le systme. Plus prcisment, utilise avec comme opration la valeur IPC_RMID, elle
permet la destruction de la file de message dont l'identifiant est pass en paramtre.

Dfinition : Primitive msgctl


int msgctl (int msgid, int op, struct msgid_ds *buf) : accs et modification des informations contenues
dans la table des files de messages gre par le systme int msgctl (msgid, IPC_RMID, NULL) :
destruction de la file de message identifie par msgid.

1.6 Un exemple de programmation avec les MSQ.


Processus 1 : cre la file et envoi un message dans cette file

/* cration d'une MSQ et envoi message*/

#include <sys/types;h>

#include <ipc.h>

#include <msqg.h>

#define CLE 17

struct msgbuf msgp;

char *msg="ceci est un message";

main()

{ int msqid; /* identificateur msq */

msqid = msgget((key_t)CLE,0666| IPC_CREAT | IPC_EXCL);/* creation msq */

msgp.mtype=12; /* le type */

strcpy(msgp.mtext,msg); /* le message */

msgsnd(msqid, &msgp, strlen(msg), 0) /* envoi message */

exit(0); }

Processus 2 : reoit un message depuis la file 17 puis la dtruit.

/* lecture message et destruction msq*/

#include <sys/types;h>

#include <ipc.h>

#include <msqg.h>

#define CLE 17

struct msgbuf msgp;

main()

{ int msqid; int x;

msqid = msgget((key_t)CLE, 0);

/* rcup msqid */

x = msgrcv (msqid, &msgp, 19, (long)12, 0) /* lecture type 12*/

msgp.text[x] = 0;

printf ("message lu %sn",msgp.mtext);

msgctl(msqid,IPC_RMID, NULL); /* destruction */

exit(0); }

Outils de communication centraliss entre processus>Exercices dirigs

2 Exercices dirigs
2.1 Primitives d'utilisation des tubes
Prambule : rappel du format des primitives permettant l'utilisation des tubes

2.1.1 Exercice 1
Ecrivez un programme o un pre cre un fils.
Le fils et le pre communiquent par l'intermdiaire de deux tubes pip1 et pip2. Le pre crit dans pip1, qui
est lu par le fils, le message "hello"et attend sur pip2 une rponse du fils. Le fils lit dans pip1 le message du
pre et lui renvoie la chaine"bonjour" dans pip2.

2.1.2 Exercice 2
Programmez la commande ps -e | wc -l qui compte le nombre de lignes de la commande ps -e, laquelle
affiche les caractristiques de tous les processus . Voir la correction

Chapitre 5 : Allocation mmoire


Ce chapitre est consacr l'tude de l'allocation de la mmoire centrale

Cours : Allocation mmoire


Allocation de la mmoire centrale et multiprogrammation.
Prsentation du problme
Diffrentes mthodes d'allocation mmoire
Allocation mmoire d'un seul tenant.
La pagination
Principe
Traduction de l'adresse pagine vers l'adresse physique.
La segmentation
Principe
Traduction de l'adresse segmente vers l'adresse physique.
Segmentation et Pagination
Exercices dirigs
Primitives d'utilisation des messages queues
Exercice 1
Exercice 2
Table des figures

Allocation mmoire >Allocation mmoire

1 Cours : Allocation mmoire


Ce cours s'intresse aux diffrentes mthodes permettant l'allocation de l'espace mmoire aux
programmes excuter. Il aborde les diffrentes mthodes d'allocation et notamment les mcanismes de
pagination et de segmentation

1.1 Allocation de la mmoire centrale et multiprogrammation.


1.1.1 Prsentation du problme
Nous commenons par un bref rappel du concept de mmoire au niveau matriel. La mmoire physique est
constitue d'un ensemble de mots mmoire contigus dsigns chacun par une adresse physique. Le
processeur accde aux mots de la mmoire centrale par le biais de deux registres, le registre Adresse RAD
et le registre donne RDO. Le registre RAD contient l'adresse du mot lire ou l'adresse du mot o crire
tandis que le registre RDO contient soit la donne crire, soit la donne lue. Les lignes d'adresses, de
donnes et de commandes du bus font la liaison entre les registres processeur et la mmoire. Dans un
systme en monoprogrammation, la mmoire centrale est occupe d'une part par les procdures du
systme d'exploitation , d'autre part par un seul programme utilisateur . Comme nous l'avons vu plusieurs
fois dj, l'occurrence d'oprations d'entres/sorties demandes par le processus peut entrainer une
inactivit du processeur si celles-ci sont gres par DMA. Par exemple, avec un processus effectuant 50 %
de calcul et 50 % d'entres/sorties, le processeur est inactif durant 50% du temps. Une telle inactivit du
processeur n'est pas souhaitable : on place donc un second programme en mmoire centrale de mme
profil. Le processeur est maintenant occup 100 % (cas idal et non rel) car il excute le second
processus durant l'entre/sortie du premier processus . Le systme est maintenant multiprogramm.

Dfinition : Degr de multiprogrammation


on dfinit le degr de multiprogrammation comme tant le nombre de processus prsents en mmoire
centrale.

Le schma ci-dessous reprsente le taux d'activit du processeur en fonction du nombre de processus


prsents en mmoire centrale et en fonction du temps d'entre-sortie de ces processus.

Fig 1 : Degr de multiprogrammation

Dans un systme multiprogramm, trois problmes sont rsoudre vis--vis de la mmoire centrale :

Il faut dfinir un espace d'adressage indpendant pour chaque processus

Il faut protger les espaces d'adressage des processus les uns vis--vis des autres

Il faut allouer de la mmoire physique chaque espace d'adressage.

1.1.2 Diffrentes mthodes d'allocation mmoire


Les mthodes d'allocation mmoire peuvent tre divises en deux grandes familles :

pour la premire famille, un programme est un ensemble de mots contigus inscable. L'espace
d'adressage du processus est linaire. On trouve ici les mthodes d'allocations en partitions
variables que nous allons tudier en premier.

pour la seconde famille, un programme est un ensemble de mots contigus scable, c'est--dire que
le programme peut tre divis en plus petits morceaux, chaque morceau tant lui-mme un
ensemble de mots contigus. Chaque morceau peut alors tre allou de manire indpendante. On
trouve ici les mcanismes de segmentation et de pagination..

1.2 Allocation mmoire d'un seul tenant.

Dans cette mthode d'allocation, le programme est considr comme un espace d'adressage inscable. La
mmoire physique est dcoupe en zones disjointes de taille variable, adaptables la taille des

programmes : ces zones sont appels des partitions . Initialement, la mmoire centrale est uniquement
occupe par les procdures du systme d'exploitation. La zone rserve aux programmes utilisateurs est
vide et constitue une unique zone libre. Au fur et mesure des chargements de programmes, la zone libre
va se rduire et l'instant t, elle n'occupe plus qu'une fraction de la mmoire centrale (mmoire basse).
Lorsque l'excution des programmes se termine (ici P2 et P4), la mmoire est libre : il se cre alors pour
chaque zone libre, une nouvelle zone libre. Finalement, la mmoire centrale se retrouve constitue d'une
ensemble de zones alloues et de zones libres rparties dans toute la mmoire. Les zones libres sont
organises en une liste chane de zones libres repre par une tte de liste.

Fig 2 : Allocation en partitions variables

Dans ce contexte, charger un nouveau programme consiste trouver une zone libre suffisamment grande
pour pouvoir y placer le programme. Une premire stratgie pour trouver et choisir cette zone libre est de
prendre la premire zone libre suffisamment grande trouve au cours du parcours de la mmoire (parcours
de la liste chane) : c'est la stratgie First Fit. Ici, donc, le programme 7 est place dans la zone libre de
120K ce qui cre une nouvelle zone libre rsiduelle de 40K.

Fig 3 : Stratgie First Fit

Une seconde stratgie pour trouver et choisir cette zone libre est de prendre la zone libre dont la taille est la
plus proche de celle du programme allouer, donc celle engendrant le plus petit trou rsiduel : c'est la
stratgie Best Fit. Ici, donc, le programme 7 est place dans la zone libre de 100K ce qui cre une nouvelle
zone libre rsiduelle de 20K.

Fig 4 : Stratgie Best Fit

Au fur et mesure des oprations d'allocations et de dsallocations, la mmoire centrale devient compose
d'un ensemble de zones occupes et de zones libres parpilles dans toute l'tendue de la mmoire
centrale. Ces zones libres peuvent devenir trop petites pour permettre l'allocation de nouveaux
programmes (problme de fragmentation de la mmoire). Par exemple, sur la figure 5, la mmoire centrale
com port e 3 zones libres mais aucune d'elles n'est assez grande pour contenir un programme 8 de 180K.
Pourtant l'ensemble des 3 zones libres forme un espace de 120 + 20 + 150 = 350K suffisant pour le
programme 8. Pour permettre l'allocation du programme 8, il faut donc runir l'ensemble des zones libres
pour ne former plus qu'une zone libre suffisante : c'est l'opration de compactage de la mmoire centrale .

Fig 5 : Fragmentation et compactage de la mmoire centrale

Dfinition : Fragmentation
Allocations et dsallocations successives des programmes en mmoire centrale crent des trous, c'est-dire des zones libres de taille insuffisante en mmoire centrale : la mmoire centrale est alors fragmente.

Dfinition : Compactage de la mmoire centrale


Le compactage de la mmoire centrale consiste dplacer les programmes en mmoire centrale de
manire ne crer qu'une seule et unique zone libre.

Le compactage de la mmoire centrale est une opration coteuse. Il n'existe pas d'algorithme simple
permettant d'optimiser le nombre d'octets dplacs lors d'une telle opration. Par ailleurs elle suppose une
translation des adresses dynamiques. Dans le mcanisme de chargement dynamique, les adresses du
programme charg en mmoire centrale ne sont pas translates de la valeur de l'adresse d'implantation au
moment du chargement, mais seulement au moment de l'excution. L'adresse d'implantation du
programme est conserve dans un registre processeur - le registre de translation - .Ainsi lors de l'opration

de compactage, dplacer un programme consiste seulement changer la valeur d'adresse d'implantation


charger dans le registre de translation.

L'allocation en mmoire centrale d'un seul tenant souffre donc de deux dfauts principaux :

Elle ncessite une opration de compactage de la mmoire qui est une opration trs coteuse

Elle exige d'allouer le programme en une zone d'un seul tenant.

Une solution est de diviser le programme en portions de taille fixe et gales l'unit d'allocation de la
mmoire centrale. On dit alors que le programme est dcoup en pages. Le mcanisme d'allocation
associ s'appelle la pagination.

1.3 La pagination
1.3.1 Principe
Dans le mcanisme de pagination, l'espace d'adressage du programme est dcoup en morceaux linaires
de mme de taille : la page.
L'espace de la mmoire physique est lui-mme dcoup en morceaux linaires de mme taille : la case.
La taille d'une case est gale la taille d'une page. Dans ce contexte, charger un programme en mmoire
centrale consiste placer les pages dans n'importe quelle case disponible.

Fig 6 : Principe de la pagination

1.3.2 Traduction de l'adresse pagine vers l'adresse physique.


L'espace d'adressage du processus tant dcoup en pages, les adresses gnres dans cet espace

d'adressage sont des adresses pagines, c'est--dire qu'un octet est repr par son emplacement
relativement au dbut de la page laquelle il appartient. L'adresse d'un octet est donc form par le couple
<nde page laquelle appartient l'octet, dplacement relativement au dbut de cette page >.
Les octets dans la mmoire physique eux ne peuvent tre adresss au niveau matriel que par leur
adresse physique. Pour toute opration concernant la mmoire, il faut donc convertir l'adresse pagine
gnre au niveau du processeur en une adresse physique quivalente. L'adresse physique d'un octet
s'obtient partir de son adresse virtuelle en remplaant le numro de page de l'adresse virtuelle par
l'adresse physique d'implantation de la case contenant la page et en ajoutant cette adresse physique
d'implantation le dplacement de l'octet dans la page. C'est la MMU (Memory Management Unit) qui est
charge de faire cette conversion. Il faut donc savoir pour toute page, dans quelle case de la mmoire
centrale celle-ci a t place : cette correspondance s'effectue grce une structure particulire appele la
table de pages.

Dans une premire approche, la table des pages est une table contenant autant d'entres que de pages
dans l'espace d'adressage d'un processus. Chaque processus a sa propre table des pages. Chaque entre
de la table est un couple < nde page, nde case physique dans laquelle la page est charge >. Dans
l'exemple de la figure ci-dessous, le processus a 4 pages dans son espace d'adressage, donc la table des
pages a 4 entres. Chaque entre tablit l'quivalence nde page, nde case relativement au schma de la
mmoire centrale.

Dfinition : Table des pages


La table des pages est une table contenant autant d'entres que de pages dans l'espace d'adressage d'un
processus. Chaque processus a sa propre table des pages. Chaque entre de la table est un couple <
nde page, nde case physique dans laquelle la page est charge >.

Fig 7 : Table des pages

Puisque chaque processus dispose de sa propre table des pages, chaque opration de commutation de
contexte se traduit galement par un changement de table des pages, de manire ce que la "table active"
corresponde celle du processus lu. Deux approches existent pour la ralisation de la table des pages :

l'aide de registres du processeur : la table des pages est sauvegarde avec le contexte processeur
dans le PCB du processus.

placer les tables des pages en mmoire centrale : la table active est repre par un registre spcial
du processeur le PTBR. Chaque processus sauvegarde dans son PCB la valeur de PTBR
correspondant sa table.

Dans la premire approche accder un emplacement mmoire ncessite seulement un accs la


mmoire : celui ncessaire la lecture ou l'criture de l'octet recherch puisque la table des pages est
stocke dans des registres du processeur. Dans la deuxime approche accder un emplacement
mmoire partir d'une adresse pagine <p,d> ncessite au contraire deux accs la mmoire :

un premier accs permet de lire l'entre de la table des pages correspondant la page cherche :
c'est l'opration (p + adresse table) qui dlivre une adresse physique de page dans la mmoire
centrale.

un second accs est ncessaire la lecture ou l'criture de l'octet recherch l'adresse <adresse
physique > + d.

Fig 8 : Traduction d'une adresse pagine en adresse physique

Pour acclrer les accs la mmoire centrale et compenser le cot li la pagination, un cache associatif
est plac en amont de la mmoire centrale. Ce cache associatif contient les couples <nde page, adresse
d'implantation de la case> les plus rcemment accds. Lorsque la MMU doit effectuer une conversion
d'adresse pagine, elle cherche tout d'abord dans le cache si la correspondance nde page, adresse
d'implantation de la case recherche n'est pas dans le cache. Si non, elle accde la table des pages en
mmoire centrale et place le nouveau couple rfrenc dans le cache. Si oui, elle effectue directement la
conversion : un seul accs mmoire est alors ncessaire pour accder l'octet recherch.

Fig 9 : Traduction d'une adresse pagine en adresse physique avec ajout d'un cache
associatif

1.4 La segmentation
1.4.1 Principe
La pagination constitue un dcoupage de l'espace d'adressage du processus qui ne correspond pas
l'image que le programmeur a de son programme. Pour le programmeur, un programme est gnralement
constitu des donnes manipules par ce programme, d'un programme principal, de procdures spares
et d'une pile d'excution. La segmentation est un dcoupage de l'espace d'adressage qui cherche
conserver cette vue du programmeur. Ainsi, lors de la compilation, le compilateur associe un segment
chaque morceau du programme compil. Un segment est un ensemble d'emplacements mmoire
conscutifs non scable. A la diffrence des pages, les segments d'un mme espace d'adressage peuvent
tre de taille diffrente. D''une manire gnrale, on trouvera un segment de code, un segment de donnes
et un segment de pile.

1.4.2 Traduction de l'adresse segmente vers l'adresse physique.


D'une manire similaire ce qui se passe avec la pagination, la segmentation de l'espace d'adressage d'un
processus gnre des adresses segmentes, c'est--dire qu'un octet est repr par son emplacement
relativement au dbut du segment auquel il appartient. L'adresse d'un octet est donc form par le couple
<nde segment laquelle appartient l'octet, dplacement relativement au dbut du segment >.

Pour toute opration concernant la mmoire, il faut ici encore convertir l'adresse segmente gnre au
niveau du processeur en une adresse physique quivalente. L'adresse physique d'un octet s'obtient partir
de son adresse segmente en remplaant le numro de segment de l'adresse segmente par l'adresse
physique d'implantation du segment en mmoire centrale et en ajoutant cette adresse physique
d'implantation, le dplacement de l'octet dans le segment. C'est la MMU (Memory Management Unit) qui
est charge de faire cette conversion. Il faut donc connaitre pour tout segment, l'adresse d'implantation
dans la mmoire centrale du segment : cette correspondance s'effectue grce une structure particulire
appele la table des segments .

Fig 10 : Table des segments

Dans une premire approche, la table des segments est une table contenant autant d'entres que de
segments dans l'espace d'adressage d'un processus. Chaque entre de la table est un couple < nde
segment, adresse d'implantation du segment >. Ici le processus a 4 segments dans son espace
d'adressage, donc la table des segments a 4 entres. Chaque entre tablit l'quivalence nde segment,
adresse d'implantation du segment relativement au schma de la mmoire centrale.

Dfinition : Table des segments


La table des segments est une table contenant autant d'entres que de segments dans l'espace
d'adressage d'un processus. Chaque entre de la table est un couple < nde segment, adresse
d'implantation du segment >.

Plus prcisment la conversion d'une adresse segmente <s,d> avec s, numro de segment et d
dplacement dans le segment suit les tapes suivantes, en mettant en jeu un registre processeur qui
contient en partie haute, le nombre maximal de segments de l'espace d'adressage couramment actif (LT) et
en partie basse l'adresse de la table des segments de l'espace d'adressage couramment actif.

s est compar LT. Si s >= LT alors il y a erreur : le segment adress n'existe pas.

sinon s est additionn l'adresse de la table des segments de manire indexer l'entre de la table
concernant le segment s. On rcupre alors l'adresse d'implantation du segment s en mmoire
centrale (adr dbut)

Une information sur la taille du segment peut tre conserve dans la table : d est alors compar
cette information. Si d est suprieure l'information taille, alors une erreur est gnre car le
dplacement est en dehors du segment. Sinon , le dplacement d est ajout l'adresse
d'implantation du segment pour gnrer l'adresse physique.

Fig 11 : Traduction d'une adresse segmente en adresse physique

L'allocation des segments en mmoire centrale s'effectue selon le mme principe que pour l'allocation de
partitions variables. Pour allouer un segment de taille S, il faut trouver une zone libre dont la taille soit au
moins gale la taille du segment S. Elle engendre les mmes problmes de fragmentation . Une solution,
trs largement rpandue, est de combiner pagination et segmentation, c'est--dire de paginer les

segments.

1.5 Segmentation et Pagination

Dans la cas o pagination et segmentation sont simultanment employes, une table des segments est
dfinie pour chaque segment de l'espace d'adressage du processus. Chaque segment est son tour
pagin, il existe donc une table des pages pour chaque segment. Ainsi une entre de la table des segment
ne contient plus l'adresse du segment correspondant en mmoire physique mais contient l'adresse de la
table des pages en mmoire physique pour ce segment. L'adresse d'un octet dans l'espace d'adressage du
processus est un couple <s,d>, le dplacement d tant son tour interprt comme un couple numro de
page p, dplacement d' dans cette page. Les mcanismes de traduction d'adresses vus dans les
paragraphes prcdents se superposent l'un l'autre.

Fig 12 : Traduction d'une adresse segmente et pagine en adresse physique

Allocation mmoire >Exercices dirigs

2 Exercices dirigs
2.1 Primitives d'utilisation des messages queues
Prambule : rappel du format des primitives permettant l'utilisation des messages queues

2.1.1 Exercice 1
On considre deux processus A et B communiquant via une MSQ de cl 17. Le processus A cre la MSQ,
puis crit le message "ceci est un message" destination du processus B. Le processus B lit le message et
l'afiche, puis dtruit la MSQ.
Ecrivez les programmes correspondants.

2.1.2 Exercice 2
On considre l'architecture logicielle suivante :

A - Le serveur attend des questions de la part de clients. Une question correspond la demande d'envoi
de n nombres tirs au sort par le serveur, n tant un nombre alatoire compris entre 1 et NMAX tir au sort
par le client et envoy par le client au serveur.
Ecrivez les programmes correspondants. On vous donne les fonctions suivantes :

Un appel la fonction
#include <stdlib.h>
Int rand(void); renvoie un nombre pseudo-alatoire dans l'intervalle [O RAND-MAX]. Il est ncessaire
d'initialiser le gnrateur par un appel la fonction
#include <stdlib.h> void srand (unsigned int val) Cette fonction peut tre appele avec comme paramtre
soit le numro du processus srand (unsigned int) getpid ()) soit la date courante srand (unsigned int) time
(NULL).

B - On souhaite remplacer la message queue par des tubes anonymes. Comment faut-il modifier
l'architecture logicielle prcdente ?
Donnez les grandes tapes du code en considrant seulement deux clients.
Voir la correction

Chapitre 6 : Mmoire virtuelle


Ce chapitre est consacr l'tude du principe de la mmoire virtuelle.

Cours : La mmoire virtuelle


Principe de la mmoire virtuelle
Notion de dfaut de pages
Les algorithmes de remplacement de pages
Algorithme de remplacement de pages FIFO
Algorithme de remplacement de pages LRU
Complment sur le format d'une entre de la table des pages d'un processus.
Algorithme pour la conversion d'une adresse logique pagine en adresse physique.
Notion d'croulement
Un petit test de mmoire
Exercices dirigs
Exercices sur la mmoire virtuelle
Exercice 1 : Gestion d'une mmoire par zones
Question 1
Question 2
Question 3
Question 4
Question 5

Exercice 2 : Pagination
Question 1
Question 2
Question 3
Question 4
Question 5

Table des figures

Mmoire virtuelle >Mmoire virtuelle

1 Cours : La mmoire virtuelle


Ce cours s'intresse au principe de la mmoire virtuelle. Il aborde notamment les notions lies aux dfauts
de pages.

1.1 Principe de la mmoire virtuelle

La multiprogrammation implique de charger plusieurs programmes en mmoire centrale de manire


obtenir un bon taux d'utilisation du processeur. Supposons comme sur la figure 1 ici que l'excution des
programmes 1, 2 et 3 soit ncessaire pour obtenir ce taux d'utilisation du cpu satisfaisant. On peut
remarquer qu'une fois les programmes 1 et 2 chargs dans la mmoire, toutes les cases sont occupes : le
programme 3 ne peut pas tre charg.

Fig 1 : Cas de figure

Lorsque l'on regarde l'excution d'un processus, on s'aperoit qu' un instant donn le processus n'accde
qu' une partie de son espace d'adressage (par exemple la page de code couramment excute par le
processeur et la page de donnes correspondante). Les autres pages de l'espace d'adressage ne sont pas

accdes et sont donc inutiles en mmoire centrale. Une solution pour pouvoir charger plus de
programmes dans la mmoire centrale est donc de ne charger pour chaque programme que les pages
couramment utilises. Ici par exemple, seules les pages 1,2 et 4 du processus 1 sont charges ainsi que la
page 3 du processus 2 et les pages 1,2,3 du programme 3.

Puisque les pages d'un espace d'adressage de processus ne sont pas toutes charges en mmoire
centrale, il faut que le processeur puisse dtecter leur ventuelle absence lorsqu'il cherche effectuer une
conversion d'adresse pagine vers l'adresse physique. Chaque entre de la table des pages com port e
alors un champ supplmentaire, le bit Validation V, qui est vrai (1 ou V) si la page est effectivement
prsente en mmoire centrale.

La figure 2 montre les valeurs des bits de validation pour les tables des pages des trois processus 1, 2 et 3,
en tenant compte des chargements de leurs pages en mmoire centrale. Ainsi pour le processus 1, la page
1 est charge dans la case 2, le bit de validation est vrai (V). La page 2 est charge dans la case 4, le bit
de validation est vrai. Par contre la page 3 n'est pas prsente en mmoire centrale et donc le bit de
validation est faux (I pour Invalide) : dans ce cas, le champs n de case n'a pas de signification.

Fig 2 : Bit de validation

1.2 Notion de dfaut de pages


Que se passe-t-il prsent lorsque qu'un processus tente d'accder une page de son espace
d'adressage qui n'est pas en mmoire centrale ? Ici le processus 2 gnre une adresse pagine portant sur
la page 2. La MMU accde la table des pages pour effectuer la conversion adresse pagine, adresse
physique et teste la valeur du bit de validation : elle le trouve faux, ce qui veut dire que la page n'est pas

charge dans une case et donc la conversion ne peut tre ralise. Il se produit alors un dfaut de page :
c'est un droutement qui oblige le processeur suspendre l'excution du programme en cours pour lancer
une entre/sortie qui charge la page manquante en mmoire centrale dans une case libre.

Dfinition : Dfaut de page


Le dfaut de page est un droutement qui oblige le processeur suspendre l'excution du programme en
cours pour lancer une entre/sortie qui charge la page manquante en mmoire centrale dans une case
libre.

Les figures 3 et 4 illustrent le mcanisme de dfaut de page. Le processus cherche convertir l'adresse
logique <p,d>. Il accde donc l'entre de sa table des pages correspondant l'entre de la page p, et
teste la valeur du bit de validation. Celui-ci est faux (I) indiquant ainsi que la page n'est pas prsente.
Automatiquement, puisque la traduction vers l'adresse physique ne peut pas tre faite, le systme lve un
dfaut de page, qui entraine une entre/sortie pour charger la page manquante en mmoire centrale. Le
dfaut de page charge la page manquante dans une case libre de la mmoire centrale, puis le systme met
jour l'entre de la table des pages correspondant la page p : le bit de validation passe vrai et le
numro de case physique contenant la page p est renseign. Enfin, la traduction vers l'adresse physique
reprend.

Fig 3 : Mcanisme du dfaut de pages

Fig 4 : Mcanisme du dfaut de pages

1.3 Les algorithmes de remplacement de pages

Lors d'un dfaut de page, la page manquante est charge dans une case libre. La totalit des cases de la
mmoire centrale peut tre occupe : il faut donc librer une case de la mmoire physique globalement
(parmi l'ensemble des cases) ou localement (parmi les cases occupes par les pages du processus en
dfaut). Le systme d'exploitation utilise un algorithme pour choisir une case librer. Les deux principaux
algorithmes sont :

FIFO (First In, First Out)

LRU (Least Recently Used)

1.3.1 Algorithme de remplacement de pages FIFO


Avec cet algorithme, c'est la page la plus anciennement charge qui est remplace. La figure 5 donne un
exemple du fonctionnement de cet algorithme o l'on suppose une mmoire centrale compose de trois
cases initialement vides. La lettre D signale l'occurrence de dfaut de pages.

Fig 5 : Remplacement de pages FIFO

1.3.2 Algorithme de remplacement de pages LRU


Avec cet algorithme, c'est la page la moins rcemment accde qui est remplace. La figure 6 donne un
exemple du fonctionnement de cet algorithme o l'on suppose une mmoire centrale compose de trois
cases initialement vides. La lettre D signale l'occurrence de dfaut de pages.

Fig 6 : Remplacement de pages LRU

1.3.3 Complment sur le format d'une entre de la table des pages d'un
processus.
Finalement, une entre de la table des pages d'un processus comprendra souvent les champs suivants :

le bit V de validation pour indiquer si la page est prsente ou non en mmoire centrale

le champ A pour Accs qui contient les informations pour l'algorithme de remplacement de pages.
Par exemple, pour l'algorithme FIFO, ce champ contiendra la date de chargement de la page; pour
l'algorithme LRU, la date du dernier accs la page.
Le bit M pour Modification permet de savoir si la page a t modifie lors de sa prsence en

mmoire centrale. Si oui, il faudra rcrire cette page sur le disque avant de l'craser par une
nouvelle page.
Le champ D pour Droits, qui contient la dfinition des droits d'accs la page en lecture / criture /

excution.
Le champ n de case physique, pour la conversion vers l'adresse physique.

1.4 Algorithme pour la conversion d'une adresse logique pagine en adresse


physique.

Nous donnons ci-dessous le schma gnral de l'algorithme suivi par le systme d'exploitation lors de la
conversion d'une adresse logique vers une adresse physique. Une daresse est un couple constitu des
champs page et dplacement.
Procedure Conversion (in adresse_virtuelle, out adresse_physique)

debut

entre := adresse_virtuelle.page + adresse_table(processus)

Si (entre.V = FAUX)

alors

-- defaut de page

Charger_page(adresse_virtuelle.page, adresse_case);

entre.V = vrai;

entre. case := adresse_case;

fsi

adresse physique := adresse_case + adresse_virtuelle.deplacement;

return (adresse_physique);

fin

Procedure Charger_Page (in page, out case)

debut

Si (Trouver_case_Libre( ) = FAUX)

alors

Choisir_case__librer (case__liberer, page_victime);

si (page_victime.M = Vrai)

alors

Ecrire_Disque(page_victime)

Fsi

Fsi

Lire_Disque(case__liberer, page)

return (case__liberer)

fin

1.5 Notion d'croulement

Dfinition : Ecroulement
On appelle Ecroulement, une haute activit de pagination. Un processus s'croule lorsqu'il passe plus de
temps paginer qu' s'excuter.

La figure 7 illustre ce phnomne. Elle reprsente le taux d'utilisation du processeur en fonction du degr
de multiprogrammation , c'est--dire en fonction du nombre de processus chargs en mmoire centrale.
Sur cette figure, on voit clairement que l'utilisation du processeur augmente jusqu' un certain seuil au del
duquel cette utilisation chute compltement : cette chute correspond une trop grande activit de
pagination des processus qui passent le plus clair de leur temps en entre/sortie car ils n'ont pas
suffisamment de cases mmoires disponibles pour contenir les pages relatives leur espace de travail
courant.

Fig 7 : Phnomne d'croulement

Mmoire virtuelle >QCM : un petit test de mmoire

2 Un petit test de mmoire


Exercice
Quelques questions sur la gestion mmoire et la mmoire virtuelle
Question : Le compactage de la mmoire centrale a pour objet
De charger des pages en mmoire centrale
De rassembler des zones libres parses pour en gnrer une seule et unique
De charger un segment dans une zone libre de la mmoire centrale
Rponse :
De rassembler des zones libres parses pour en gnrer une seule et unique
Question : Un processus dispose d'une table des pages a trois entres. Deux pages de son espace d'adressage, les pages 1
et 3 sont charges en mmoire centrale dans les cases 4 et 8. Il accde l'adresse logique <page 3, deplacement 10>
Il se produit un dfaut de page
L'adresse physique gnre est <case 5, deplacement 10 >
L'adresse physique gnre est <case 8, deplacement 10 >
Il y a remplacement de pages
Rponse :
L'adresse physique gnre est <case 8, deplacement 10 >
Question : Le mme processus gnre maintenant l'adresse logique <page 2, dep 24>
Il se produit un dfaut de page
L'adresse physique gnre est <case 5, deplacement 10 >
L'adresse physique gnre est <case 8, deplacement 10 >
Il y a remplacement de pages
Rponse :
Il se produit un dfaut de pages.
Question : Une mmoire centrale comporte 3 cases libres initialement vides. Un processus effectue les accs suivants ses
pages : 1,2,3,1, 4. Lors de l'accs la page 4 :
Avec une stratgie FIFO, la page 1 est remplace
Avec une stratgie FIFO, la page 3est remplace
Avec une stratgie LRU, la page 1 est remplace
Avec une stratgie LRU, la page 3 est remplace
Rponse :
Avec une stratgie FIFO, la page 1 est remplace

Mmoire virtuelle >Exercices dirigs

3 Exercices dirigs
3.1 Exercices sur la mmoire virtuelle
3.1.1 Exercice 1 : Gestion d'une mmoire par zones
On se propose de dfinir des algorithmes de gestion par zones d'une mmoire. Cette mmoire est gre
par un allocateur qui utilise les deux procdures ALLOUER_ZONE(T,A) et LIBERER_ZONE(T,A) o T est
la taille de la zone et A l'adresse d'implantation en mmoire de la zone. L'allocateur entretient une liste des
zones non utilises de la mmoire (appeles zones libres). Chaque zone libre com port e un en-tte de
deux mots qui contient la taille de la zone et l'adresse de la zone libre suivante dans la liste. On suppose
que cette liste est ordonne suivant les adresses croissantes d'implantation en mmoire de ces zones.
Pour que l'allocateur puisse allouer une zone libre, il faut videmment que cette zone soit de taille
suprieure ou gale celle qui est requise. D'autre part, quand la taille de la zone libre est suprieure la
taille demande, le rsidu est rcupr et forme une nouvelle zone libre.

3.1.1.1 Question 1
Reprsenter sous forme d'un schma la structure de la liste des zones libres en mmoire.

3.1.1.2 Question 2
On suppose que l'algorithme d'allocation est "first fit", c'est--dire que la zone libre choisie est celle qui
apparat la premire dans la liste. Ecrire la procdure ALLOUER_ZONE.

3.1.1.3 Question 3
On suppose que l'algorithme d'allocation est "best fit", c'est--dire que la zone libre choisie est celle dont la
taille est la plus proche de celle demande. Ecrire la procdure ALLOUER ZONE.

3.1.1.4 Question 4
A un instant t, la configuration de la mmoire est la suivante et on souhaite encore excuter le processus
P5 de taille gale 500K. Que convient-il de faire ?

3.1.1.5 Question 5
On impose qu'il n'y ait pas de zones contigus en mmoire. Lorsqu'une zone est libre et qu'il s'avre
qu'elle est contige une zone libre, elles sont fusionnes pour ne plus en former qu'une.
Ecrire la procdure LIBERER_ZONE.

3.1.2 Exercice 2 : Pagination


3.1.2.1 Question 1
Dcrivez le format d'une entre de la table des pages d'un processus.

3.1.2.2 Question 2
Dcrivez sous forme algorithmique les oprations ralises lors d'un accs une adresse virtuelle de type
<n de page, dplacement dans la page>

3.1.2.3 Question 3
Soit la liste des pages virtuelles rfrences aux instants t = 1, 2,..., 11
3 5 6 8 3 9 6 12 3 6 10

La mmoire centrale est compose de 4 cases initialement vides. Reprsentez l'volution de la mmoire
centrale au fur et mesure des accs pour chacune des deux politiques de remplacement de pages FIFO
et LRU. Notez les dfauts de pages ventuels.

3.1.2.4 Question 4
Dcrivez le principe de la pagination applique la segmentation de la mmoire. Comment s'effectue la
traduction d'une adresse virtuelle ?

3.1.2.5 Question 5
On considre une mmoire segmente pagine pour laquelle les cases en mmoire centrale sont de 4Ko.
La mmoire centrale compte au total 15 cases numrotes de 1 15. Dans ce contexte, on considre deux
processus A et B.

Le processus A a un espace d'adressage compos de trois segments S1A, S2A et S3A qui sont
respectivement de 8 Ko, 12 Ko et 4 Ko.

Le processus B a un espace d'adressage compos de deux segments S1B et S2B qui sont
respectivement de 16 Ko et 8 Ko. Pour le processus A, seules les pages 1 et 2 du segment S1A, la
page 2 du segment S2A et la page 1 du segment S3A sont charges en mmoire centrale
respectivement dans les cases 4, 5, 10, 6. Pour le processus B, seules les pages 2 et 3 du segment
S1B et la page 1 du segment S2B sont charges en mmoire centrale respectivement dans les
cases 11, 2 et 15.

Reprsentez sur un dessin les structures alloues (table des segments, tables des pages) et la mmoire
centrale correspondant l'allocation dcrite. Voir la correction

Chapitre 7 : Interblocage
Ce chapitre est consacr l'tude de la synchronisation entre les processus . Il aborde tout d'abord la notion d interblocage .

Cours : Interblocage
Dfinitions des situations dinterblocage, de famine et de coalition
Conditions ncessaires lobtention dun interblocage
Les diffrentes mthodes de traitement des interblocages
Les politiques de gurison
Les politiques de prvention
Les politiques dvitement
La politique de lautruche
Table des figures

Interblocage>Interblocage

1 Cours : Interblocage
Dans un systme multiprocessus, l' ordonnanceur alloue le processeur chaque processus selon un
algorithme d' ordonnancement : la politique choisie conditionne l'ordre d'excution des processus et trs
souvent, les excutions des processus s'entrelacent les unes avec les autres. Chaque processus dispose
d'un espace d'adressage propre et indpendant, protg par rap port aux autres processus. Malgr tout, les
processus peuvent avoir besoin de communiquer entre eux pour changer des donnes par exemple : ils
ne sont donc pas totalement indpendants et effectuent des accs concurrents aux ressource s logicielles
ou matrielles.

Dfinition : Ressource
Une ressource dsigne toute entit dont a besoin un processus pour s'excuter. La ressource peut tre
matrielle comme le processeur ou en priphrique ou elle peut tre logicielle comme une variable. Une
ressource est caractrise :
Par un tat : elle est libre ou occupe
Par son nombre de points d'accs, c'est--dire le nombre de processus pouvant lutiliser en mme
temps.

Lutilisation d'une ressource par un processus seffectue en trois tapes : lorsque le processus a besoin de
la ressource il s'alloue cette ressource : c'est l'tape d'allocation de ressources. Une fois que le processus a
pu obtenir la ressource, il utilise la ressource durant un certain temps puis il rend la ressource : c'est l'tape
de restitution de la ressource. Les phases d'allocation et de restitution d'une ressources doivent assurer
que la ressource est utilise conformment son nombre de points daccs

1.1 Dfinitions des situations dinterblocage, de famine et de coalition


Dfinition : Interblocage
Un ensemble de n processus est dit en situation dinterblocage lorsque l'ensemble de ces n processus
attend chacun une ressource dj possde par un autre processus de l'ensemble. Dans une telle
situation aucun processus ne peut poursuivre son excution. L'attente des processus est infinie.

Considrons un exemple. Soient deux ressources R1 et R2 qui sont toutes les deux un seul point daccs
cest--dire que seul un processus la fois a le droit dutiliser la ressource. Soient galement deux
processus P1 et P2. Ils utilisent tous les deux les ressources R1 et R2 pour effectuer un traitement. Les
processus P1 et P2 sont programms tels que P1 demande d'abord s'allouer R1 puis R2 avant de
commencer son traitement tandis que le processus P2 demande d'abord s'allouer la ressource R2 puis la
ressource R1 avant de commencer son traitement. Les deux processus sont prts s'excuter.
L'ordonnanceur choisit d'abord dexcuter P1. P1 demande prendre la ressource R1 et comme les
ressources sont initialement libres, P1 obtient la ressource R1. Puis lordonnanceur commute et choisit
maintenant d'excuter le processus P2. P2 demande s'allouer la ressource R2 et puisque la ressource R2

est libre, P2 obtient la ressource R2. Maintenant P2 continue son excution et demande accder la
ressource R1. P2 est bloqu puisque R1 a t alloue au processus P1. Puisque P2 est bloqu, l'
ordonnanceur reprend l'excution de P1 qui demande pour sa part maintenant accder la ressource
R2. Comme R2 a t alloue au processus P2, P1 est son tour bloqu. Les deux processus P1 et P2
sont maintenant en situation d'interblocage : en effet le processus P1 attend le processus P2 pour disposer
de la ressource R2 tandis que le processus P2 attend le processus P1 pour disposer de la ressource
R1.Comme aucun des deux processus ne peut poursuivre son excution et donc rendre les ressource s
qu'il possde, le blocage est permanent : on dit que les processus P1 et P2 sont en situation d'interblocage
(ou treinte fatale).

Dfinition : Coalition et famine


On parle de coalition de n processus contre p autres processus lorsqu un ensemble de n processus
monopolisent des ressources au dtriment des p autres processus. On dit galement que les p
processus qui ne peuvent pas s'excuter faute de ressources sont en situation de famine.

1.2 Conditions ncessaires lobtention dun interblocage

Les quatre conditions listes ci-dessus doivent tre simultanment vrifies pour qu'un interblocage puisse
se produire :

Exclusion mutuelle : une ressource au moins doit se trouver dans un mode non partageable

Occupation et attente : un processus au moins occupant une ressource attend d'acqurir des
ressources supplmentaires dtenues par d'autres processus. Les processus demandent les
ressources au fur et mesure de leur excution.

Pas de rquisition : les ressources sont libres sur seule volont des processus les dtenant

Attente circulaire : il existe un cycle dattente entre au moins deux processus. Les processus
impliqus dans ce cycle sont en interblocage.

La figure 1 donne un exemple dattente circulaire entre deux processus P1 et P2. Les deux processus P1 et
P2 utilisent les trois mmes ressources : un lecteur de bandes magntiques, un disque dur et une
imprimante. Le processus P1 commence par demander la bande magntique puis l'imprimante et enfin le
disque avant d'effectuer son traitement. Le processus P2 commence par demander le disque puis
l'imprimante et enfin la bande magntique avant de commencer son traitement. Sur le schma de la figure
1, le processus P1 s'est excut et a obtenu la bande magntique ainsi que l'imprimante. Le processus P2
lui a obtenu le disque et il demande maintenant obtenir l'imprimante. L'imprimante a dj t alloue au
processus P1, donc le processus P2 est bloqu. Le processus P1 ne peut pas poursuivre son excution car
il est en attente du disque qui a dj t allou au processus P2. On a donc une attente circulaire entre P1
et P2 : en effet le processus P2 attend l'imprimante dtenue par le processus P1 tandis que le processus
P1 attend le disque dtenu par le processus P2. .

Fig 1 : Un exemple dattente circulaire

1.3 Les diffrentes mthodes de traitement des interblocages

Il y a 4 mthodes de traitement des situations d'interblocage : les politiques de gurison, les politiques de
prvention ou d'vitements et la politique de "l'autruche".

1.3.1 Les politiques de gurison


Une premire politique est celle de dtection/gurison des interblocages. Dans cette politique on autorise
les interblocages se produire, on les dtecte et on les rsout. Pour cette politique, le systme maintient un
graphe reprsentant l'allocation des ressources et les attentes des processus. Dans ce graphe dont un
exemple est donn sur la figure 2, on distingue deux types de sommets : les processus figurs par un rond
et les ressources figures par un rectangle. Une flche depuis un rectangle vers un rond indique que la
ressource a t alloue au processus. A contrario une flche depuis un rond vers un rectangle indique que
le processus attend la ressource . Un cycle dans le graphe indique la prsence d'un interblocage et tous les
processus appartenant ce cycle sont en interblocage. Ainsi dans la figure 2, le graphe prsente deux
cycles. Un premier cycle existe entre le processus P1, le processus P2, la ressource R1 et la ressource R2.
Un second cycle existe qui englobe le processus P1, le processus P2, le processus P3 ainsi que les
ressources R1, R3 et R2.
Le systme met jour le graphe chaque nouvelle allocation de ressources ou demande d'allocation de
ressources. Rgulirement le systme parcourt le graphe la recherche de cycle. Si un cycle est
dcouvert, celui-ci est cass en avortant les processus en interblocage appartenant au cycle. Ainsi sur

l'exemple de la figure 2, l' interblocage est cass en avortant le processus P2 et en rallouant la ressource
R1 au processus P1.
Ce type de politique prsente plusieurs difficults. Sa mise en oeuvre est coteuse. Il faut maintenir le
graphe d'allocation, rgulirement parcourir le graphe la recherche de cycles et enfin remdier
l'interblocage par destruction de processus. Une autre difficult tient la priode de parcours du graphe : si
cette priode est petite, le graphe est parcouru souvent et consomme ainsi les ressources du systme
inutilement car la probabilit dun interblocage est faible. Si la priode de parcours est grande, le graphe
sera parcouru moins souvent et la probabilit de trouver un interblocage sera plus forte. Mais, le nombre de
processus impliqus dans un linterblocage risque dtre dautant plus grand que la priode de parcours du
graphe est grande. Par ailleurs le choix des processus avorter pour remdier un interblocage nest pas
forcment facile. Une solution est de systmatiquement dtruire tous les processus impliqus dans
linterblocage mais on peut essayer de raffiner cette solution en choisissant les processus avorter : se
pose ici le problme du choix qui va conduire liminer linterblocage en minimisant le nombre de
processus avorts ou le cot pour le systme de ces avortements. Ainsi dans le cas de la figure 1, on
pourra choisir d'avorter P2 plutt que P1 car P1 dtient dj deux ressources sur trois.

Fig 2 : Graphe pour la politique de gurison

1.3.2 Les politiques de prvention


Dans les politiques de prvention, on ajoute des contraintes sur l'allocation des ressources afin de faire en
sorte qu'au moins une des 4 conditions ncessaires l'interblocage ne sera jamais vrifie. Les deux
seules conditions ncessaires sur lesquelles il est possible d'agir sont la condition d'occupation et d'attente
ainsi que la condition d'attente circulaire.

Pour la condition doccupation et dattente, on interdit un processus de demander les ressources au fur et
mesure de ses besoins. Un processus ne peut dmarrer son excution que lorsque toutes les ressources
ont pu lui tre alloues (phase 0). Ainsi la deuxime condition d'occupation et attente ne peut jamais se
produire. Cependant l'utilisation rsultante des ressources est mauvaise puisqu'un processus dispose des
ressources durant toute son excution mme s'il n'utilise celles-ci que pour un trs petit temps.

Pour la condition dattente circulaire, une solution est d'imposer un ordre total sur l'ordre d'allocations des
diffrentes ressources du systme : ainsi par exemple l'unit de bande doit toujours tre demande avant
le disque et le disque doit lui-mme tre toujours demand avant l'imprimante. Ainsi il ne peut pas se
produire d'attente circulaire.

1.3.3 Les politiques dvitement


La troisime catgorie de solutions est celle des politiques d'vitement : ici, chaque demande d'allocation
de ressource faite par un processus, le systme droule un algorithme appel algorithme de suret qui
regarde si cette allocation peut mener le systme en interblocage. Lalgorithme de suret utilise des
informations fournies par les processus notamment pour chaque processus, leur plus grand besoin possible
en ressources. Si tel est le cas, l'allocation est retarde. Cest une vision pessimiste qui prdomine car
lallocation est interdite ds que la possibilit de linterblocage est dtecte. Mais cela ne veut pas dire que
cet interblocage aura rellement lieu. Un exemple de la mise en uvre de cette politique est lalgorithme
appel algorithme du banquier.

1.3.4 La politique de lautruche


Une dernire solution, trs simple, est de nier l'existence des interblocages et donc de ne rien prvoir pour
les traiter. Simplement la machine est redmarre lorsque trop de processus sont en interblocage. Les trois
premires stratgies voques (prvention, vitement dtection/gurison) sont des politiques qui cotent
excessivement chres mettre en uvre. Aussi, comme la frquence des interblocages dans un systme
est relativement faible, la politique de l'autruche qui parat dans un premier abord trs "curieuse" se justifie
souvent.

Chapitre 8 : Synchronisation entre processus


Ce chapitre est consacr l'tude de la synchronisation entre les processus . Il prsentela programmation des diffrents
schmas de synchronisation l'aide de l'outil smaphore.

Cours 1 : Exclusion mutuelle


Un exemple simple pour dfinir le problme
Ralisation d'une section critique l'aide des interruptions matrielles
L'outil smaphore. Utilisation de cet outil pour raliser l'exclusion mutuelle
Prsentation de l'outil smaphore
L'opration INIT (Sem, Val)
L'opration P (Sem)
L'opration V (Sem)
Signification de la valeur du compteur K

Ralisation d'une section critique l'aide des smaphores


Cours 2 : Allocation de ressources
Le schma de l'allocation de ressources
Cours 3 : Le schma lecteurs/rdacteurs.
Le schma lecteurs/rdacteurs
Le rdacteur (crivain)
Le lecteur
Fonctionnement du schma
Cours 4 : Le schma producteur/consommateur.
Le schma producteur/consommateur
Programmation du schma producteur/consommateur
Fonctionnement du schma producteur/consommateur
Exercices dirigs
Les processus
Exercice 1
Question 1
Question 2

Exercice 2
Question 1
Question 2
Question 3
Question 4
Question 5

Exercice 3
Question 1
Question 2
Question 3

Exercice 4
Question 1
Question 2

Table des figures

Synchronisation entre processus>Exclusion mutuelle

1 Cours 1 : Exclusion mutuelle


Les processus disposent chacun d'un espace d'adressage protg inaccessible aux autres processus. Pour
communiquer et s'changer des donnes, les processus peuvent utiliser des outils de communications
offerts par le systme. La manipulation de ces outils de communication doit se faire dans le respect de
rgles de synchronisation qui vont assurer que les donnes changes entre les processus restent
cohrentes et ne sont pas perdues. Un premier problme de synchronisation est celui de l'accs par un
ensemble de processus une ressource critique , c'est--dire une ressource un seul point d'accs donc
utilisable par un seul processus la fois.

1.1 Un exemple simple pour dfinir le problme

Nous allons mettre en lumire le problme qui peut se poser sur un exemple simple : on considre donc un
petit programme de rservation de place (dans un avion, un train, ).
Rservation :

Si nb_place > 0

alors

Rserver une place

nb_place = nb_place - 1

fsi

Ce programme rservation peut tre excut par plusieurs processus la fois (autrement dit, le programme
est rentrant). La variable nb_place, qui reprsente le nombre de place restant dans l'avion par exemple,
est ici une variable d'tat du systme (de rservation) On considre l'excution de deux processus Client_1
et Client_2 (figure 1) : Client_1 est commut par l' ordonnanceur juste aprs avoir test la valeur de la
variable nb_place (nb_place = 1). Client_2 s'excute son tour, teste nb_place qu'il trouve galement
gale 1 et donc effectue une rservation en dcrmentant de une unit la variable nb_place. Nb_Place
devient gale 0. Comme le processus Client_2 a termin son excution, Client_1 reprend la main.

Comme Client_1 avait trouv la variable nb_place comme tant gale 1 juste avant d'tre commut, il
continue son excution en dcrmentant son tour nb_place. De ce fait, nb_place devient gale 1 ce
qui est incohrent !!! Une mme place a t alloue deux clients diffrents !

Fig 1 : Un exemple de concurrence

La variable nb_place doit tre accde par un seul processus la fois pour rester cohrente : ici en
l'occurrence le processus Client_1 qui a commenc la rservation en premier. Nb_Place est donc une
ressource critique.

Dfinition : Ressource critique


Une ressource critique est une ressource accessible par un seul processus la fois.

Dfinition : Section critique


Le code d'utilisation de la ressource critique s'appelle une section critique. La section critique doit offrir
au moins une proprit essentielle : celle de l'exclusion mutuelle c'est--dire assurer qu'effectivement elle
ne sera jamais excute par plus d'un processus la fois. Pour ce faire, la section critique est prcde
par un prlude et suivie d'un postlude (le prlude et le postlude sont du code) qui doivent assurer cette
proprit d'exclusion mutuelle.

Dfinition : Exclusion mutuelle


La proprit d'exclusion mutuelle assure qu'une ressource critique ne peut jamais tre utilise par plus
de un processus la fois.

Pour garantir l'exclusion mutuelle, il faut donc entourer l'utilisation de la variable nb_place d'un prlude et
d'un postlude. Le prlude prend la forme d'une "protection"qui empche un processus de manipuler la
variable nb_place si un autre processus le fait dj. Ainsi le processus Client_2 est mis en attente ds qu'il
cherche accder la variable nb_place dj possde par le processus Client_1. Le postlude prend la
forme d'une"fin de protection" qui libre la ressource nb_place et la rend accessible au processus Client_2.

1.2 Ralisation d'une section critique l'aide des interruptions matrielles

Nous rappelons que le mcanisme sous-jacent au r ordonnancement des processus peut tre la survenue
d'une interruption horloge. Aussi une solution pour raliser l'exclusion mutuelle est de masquer les
interruptions dans le prlude et de les dmasquer dans le postlude. Ainsi les interruptions sont masques
ds qu'un processus accde la ressource nb_place et aucun vnement susceptible d'activer un autre
processus ne peut tre pris en compte. Cependant, cette solution est moyennement satisfaisante car elle
empche l'excution de tous les processus y compris ceux ne dsirant pas accder la ressource critique .
De plus, le masquage et le dmasquage des interruptions sont des oprations rserves au mode
superviseur et ne sont donc pas accessibles pour les processus utilisateurs.
Une autre solution est d'utiliser un outil de synchronisation offert par le systme : les smaphores.

1.3 L'outil smaphore. Utilisation de cet outil pour raliser l'exclusion mutuelle
1.3.1 Prsentation de l'outil smaphore
Une smaphore Sem est une structure systme compose d'une file d'attente L de processus et d'un
compteur K, appel niveau du smaphore et contenant initialement une valeur Val. Cette structure ne peut
tre manipule que par trois oprations P(Sem), V(Sem) et Init(Sem, Val). Une proprit im port ante de
ces oprations est qu'elles sont indivisibles c'est--dire que l'excution de ces oprations ne peut pas tre
interrompues. Un outil smaphore peut tre assimil un distributeur de jetons; l'acquisition d'un jeton
donnant le droit un processus de poursuivre son excution.

1.3.1.1 L'opration INIT (Sem, Val)

L'opration INIT a pour but d'initialiser le smaphore, c'est--dire qu'elle met vide la file d'attente L et
initialise avec la valeur Val le compteur K : on dfinit ainsi le nombre de jetons initiaux dans le smaphore.
Init (Sem, Val)

dbut

masquer_it

Sem. K := Val;

Sem. L := vide;

demasquer_it

fin

1.3.1.2 L'opration P (Sem)

L'opration P(Sem) "attribue un jeton" au processus appelant si il en reste au moins un et sinon bloque le
processus dans Sem.L. L'opration P est donc une opration ventuellement bloquante pour le processus
lu qui l'effectue. Dans le cas du blocage, il y aura rordonnancement. Concrtement, le compteur K du
smaphore est dcrment de une unit. Si la valeur du compteur devient ngative, le processus est
bloqu.
P (Sem)

dbut

masquer_it

Sem.K := Sem.K 1;

Si Sem.K < 0

alors

ajouter ce processus Sem.L

bloquer ce processus

fsi

demasquer_it

fin

1.3.1.3 L'opration V (Sem)

L'opration V(Sem) a pour but de "rendre un jeton" au smaphore. De plus, si il y a au moins un processus
bloqu dans la file d'attente L du smaphore, un processus est rveille. La gestion des rveils s'effectue
gnralement en mode FIFO (on rveille le processus le plus anciennement endormi). L'opration V est
une opration qui n'est jamais bloquante pour le processus appelant.
V (Sem)

Dbut

masquer_it

Sem.K := Sem.K + 1;

Si Sem.K <= 0

alors

sortir un processus de Sem.L

rveiller ce processus

fsi

dmasquer_it

fin

1.3.1.4 Signification de la valeur du compteur K

Si Sem.K > 0, alors Sem.K est le nombre d'oprations P(Sem) passantes

Si Sem.K <= 0,alors valeur_absolue(Sem.K) est le nombre de processus bloqus dans Sem.L

1.3.2 Ralisation d'une section critique l'aide des smaphores


La ralisation d'une section critique l'aide de l'outil smaphore s'effectue en utilisant un smaphore
MUTEX, dont le compteur K est initialis 1. Le prlude de la section critique correspond une opration
P(MUTEX). Le postlude de la section critique correspond une opration V(MUTEX).
INIT (MUTEX, 1);

P(MUTEX);

Section critique

V(MUTEX)

La figure 2 illustre le fonctionnement de la section critique : Client_1 effectue en premier la demande de


rservation : le P(Mutex) est passant et le "jeton" est allou au processus Client_1. Juste aprs le test de la
valeur de Nb_Place, Client_1 perd donc la main ; Client_2 est lu mais le P(Mutex) est bloquant : il n'y a
plus de jeton disponible dans le compteur du smaphore. Comme Client_2 est bloqu, Client_1 reprend la
main. Lorsqu'il a achev sa rservation, Client_1 relche le jeton par un V(Mutex) : Client_2 est alors
rveill et le jeton lui est attribu.

Fig 2 : Fonctionnement de la section critique

Synchronisation entre processus>Allocation de ressources

2 Cours 2 : Allocation de ressources


Un deuxime problme de synchronisation est celui de l'accs par un ensemble de processus un
ensemble de n ressource s critiques : c'est une gnralisation du cas prcdent.

2.1 Le schma de l'allocation de ressources

Le schma d'allocation de N exemplaires de ressources exclusives est une gnralisation du schma


prcdent : on considre prsent que l'on a N sections critiques. Le smaphore d'allocation de
ressources appel Res ici est initialis au nombre d'exemplaires de ressources initialement disponibles
(N ici). Une opration d'allocation correspond une opration P(Res) allocation d'une jeton si il y en a au
moins un disponible et la restitution de ressource correspond une opration V(Res).

INIT (Res, N)

Allocation : P(Res)

Utilisation de la ressource Res

Restitution : V(Res)

Fig 3 : Allocation de ressource : P4 est bloqu

Fig 4 : Allocation de ressources : P4 est dbloqu

Les figures 3 et 4 montrent sur un exemple le mcanisme d'allocation de ressources. Les processus P1, P2
et P3 demandent successivement accder un exemplaire de ressources. Les trois oprations P sont

passantes (on a initialement 3 jetons) et chaque processus obtient sa ressource. Cependant, le processus
P4 est bloqu : il n'y a plus de jeton dans le compteur du smaphore et plus d'exemplaires de ressources.
Lorsque le processus P2 a termin d'utiliser son exemplaire de ressources, il restitue celle-ci par une
opration V(Res). Le jeton est rendu et attribu au processus P4 ainsi que l'exemplaire de ressource libr.

Synchronisation entre processus>Le schma lecteurs/rdacteurs.

3 Cours 3 : Le schma lecteurs/rdacteurs.


3.1 Le schma lecteurs/rdacteurs

Dans ce problme, on considre la situation o un fichier ou une zone de mmoire commune (une table par
exemple) est accde simultanment en lecture et en criture. On a donc deux types de processus : des
lecteurs et des crivains (ou des rdacteurs). Le contenu du fichier doit videmment rester cohrent donc
les critures ne doivent pas avoir lieu en mme temps. Les lecteurs doivent lire une information stable, c'est-dire que les lecteurs ne doivent pas lire une information en cours de modification. Il faut donc :

une seule criture en cours

une ou plusieurs lectures en cours (les lectures simultanes ne gnent pas puisqu'une lecture ne

ou

modifie pas le contenu du fichier)

3.1.1 Le rdacteur (crivain)


Dans ce schma donc, un crivain exclut les autres crivains et les lecteurs : un crivain accde donc
toujours seul la ressource , autrement dit il effectue des accs en exclusion mutuelle des autres crivains
et des lecteurs. L'accs de l'crivain est donc grer selon ce schma d'exclusion mutuelle l'aide d'un
smaphore ACCES initialis 1.
ECRIVAIN

INIT (Acces, 1);

M'assurer que l'accs au fichier est libre : P(Acces)

entrer en criture

Librer l'accs au fichier :

3.1.2 Le lecteur

V(Acces)

Un lecteur exclut les crivains mais pas les autres lecteurs. Il faut donc :

le premier lecteur doit s'assurer qu'il n'y a pas d'accs en criture en cours

le dernier lecteur doit rveiller un ventuel crivain

On voit donc qu'il faut compter le nombre de lecteurs qui accdent la ressource. On utilise pour cela une
variable NL, initialise 0. Cette variable NL va tre accde en concurrence par tous les lecteurs qui vont
soit incrmenter cette variable (un lecteur de plus), soit la dcrmenter (un lecteur de moins). Pour que le
contenu de la variable reste cohrent, il faut que NL soit accde en exclusion mutuelle. L'accs la
variable sera donc gard par un smaphore MUTEX initialis 1. La figure 5 donne le schma complet
correspondant au lecteur.

Fig 5 : Le lecteur

3.1.3 Fonctionnement du schma


La figure 6 donne un exemple du fonctionnement du schma lecteurs/rdacteurs et rsume le passage du
jeton entre les lecteurs et les rdacteurs. Le premier lecteur Lecteur_1 obtient le jeton par l'opration
P(ACCES). Les lecteurs suivants accdent directement au fichier. Un rdacteur survenant ce moment l
est arrt par l'opration P(ACCES). Le dernier lecteur libre le jeton par l'opration V(ACCES). Le
rdacteur peut alors l'acqurir. Si pendant l'accs du rdacteur, un lecteur cherche accder au fichier,
celui-ci va acqurir le smaphore Mutex, incrmenter NL et se bloquer sur le P(ACCES). Les lecteurs
suivants seront quant eux bloqus sur le P(MUTEX), car le smaphore Mutex n'aura pas t libr par le
premier lecteur. Il est noter que la solution donne ici au schma lecteurs/rdacteurs favorise la coalition
des lecteurs contre les crivains. D'autres solutions existent qui interdisent les accs en lecture ds qu'un
crivain est mis en attente.

Fig 6 : Fonctionnement du schma lecteurs/rdacteurs

Synchronisation entre processus>Le schma producteur/consommateur

4 Cours 4 : Le schma producteur/consommateur.


4.1 Le schma producteur/consommateur

Le dernier problme de communication / synchronisation que nous aborderons est celui du producteur /
consommateur. On considre ici deux processus communiquant par un tampon de N cases. Le producteur
dpose des messages dans le tampon dans la case pointe par l'index i. Le consommateur prlve les
messages dans la case pointe par l'index j. Le tampon est gr selon un mode FIFO circulaire en
consommation et en dpt, c'est--dire :

le producteur dpose les messages depuis la case 0 jusqu' la case N-1, puis revient la case 0

le consommateur prlve les messages depuis la case 0 jusqu' la case N-1, puis revient la case
0.

Pour qu'aucun message ne soit perdu, les trois rgles suivantes doivent tre respectes :

Un producteur ne doit pas produire si le tampon est plein

Un consommateur ne doit pas faire de retrait si le tampon est vide

Producteur et consommateur ne doivent jamais travailler dans une mme case

4.2 Programmation du schma producteur/consommateur

Dans ce problme deux types de ressource s distinctes peuvent tre mises en avant :

le producteur consomme des cases vides et fournit des cases pleines

le consommateur consomme des cases pleines et fournit des cases vides

On a donc des ressources cases vides et des ressources cases pleines. Le problme peut maintenant se
rapprocher d'un problme d'allocation de ressources critiques tel que nous l'avons vu prcdemment. On
associe donc un smaphore chacune des ressources identifies et on initialise ce smaphore au nombre
de cases respectivement vides ou pleines initialement disponibles (N et 0). On a donc deux smaphores
VIDE initialis N et PLEIN initialis 0.

Un producteur va s'allouer une case vide par une opration P(VIDE), remplir cette case vide et de ce fait
gnrer une case pleine. Le producteur va signaler cette nouvelle case pleine par une opration V(PLEIN),
cette opration rveillera ventuellement le consommateur en attente d'une case pleine. Un consommateur
va s'allouer une case pleine par une opration P(PLEIN), vider cette case pleine et de ce fait gnrer une
case vide. Le consommateur va signaler cette nouvelle case vide par une opration V(VIDE), cette

opration rveillera ventuellement le producteur en attente d'une case vide.

Fig 7 : Schma producteur / consommateur

4.3 Fonctionnement du schma producteur/consommateur

Les deux figures ci-dessous illustrent le fonctionnement du schma sur un tampon de deux cases.

Fig 8 : Fonctionnement du schma producteur / consommateur

Fig 9 : Fonctionnement du schma producteur / consommateur

Synchronisation entre processus>Exercices dirigs

5 Exercices dirigs
5.1 Les processus
5.1.1 Exercice 1
Soit un systme compos de trois processus cycliques Acquisition, Excution et Impression, et de deux
tampons Requte et Avis , respectivement composs de M et N cases.

Le processus Acquisition enregistre chacune des requtes de travail qui lui sont soumises par des
clients et les place dans le tampon Requte destination du processus Excution.

Le processus Excution excute chaque requte de travail et transmet ensuite au processus


Impression un ordre d'impression de rsultats dpos dans le tampon Avis.

Le processus Impression prlve les ordres d'impression dposs dans le tampon Avis et excute
ceux-ci.

5.1.1.1 Question 1
Programmez la synchronisation des trois processus l'aide des smaphores et des variables ncessaires
la gestion des tampons

5.1.1.2 Question 2
On tend la systme trois processus Acquisition, trois processus Excution et trois processus Impression.
Compltez la synchronisation prcdente pour que celle-ci demeure correcte.

5.1.2 Exercice 2
Dans le service de gestion d'un magasin, un employ est charg d'enregistrer les commandes des clients
dans un fichier COM, et d'diter les bons de commandes correspondants, sur une imprimante IMP. D'autre
part, un processus facturation, lanc priodiquement lit les commandes facturer dans COM et dite les
factures correspondantes sur l'imprimante IMP. Notons qu'une commande peut concerner plusieurs

articles, et donc qu'un bon de commande ou une facture peut com port er plusieurs lignes.

5.1.2.1 Question 1
Sachant que l'opration de transfert lmentaire (lecture, criture) concerne une ligne de commande,
montrer que l'tat de COM peut tre incohrent, de mme que les impressions sur IMP. En dduire les
rgles d'accs COM et IMP.

5.1.2.2 Question 2
Afin de rsoudre le problme prcdent, on fournit deux procdures qui garantissent un accs exclusif
une ressource R:

rserver (R) autorise l'accs R par le demandeur Si R est libre ou bloque le demandeur Si R est
occupe.

librer (R) autorise l'accs un autre demandeur s'il y en a en attente, sinon indique que R est libre.

On propose la solution suivante processus employ :

5.1.2.3 Question 3
Montrer que cette programmation permet d'diter de manire conscutive, toutes les factures pour une
priode donne.

5.1.2.4 Question 4
Donner une dfinition de l'interblocage. Montrer que la programmation risque de conduire un interblocage
.

5.1.2.5 Question 5
Modifier le processus de facturation pour supprimer le risque d'interblocage.

5.1.3 Exercice 3
On considre un systme de gestion de comptes bancaires permettant d'effectuer les deux oprations
suivantes :

CredDeb_Compte (Numero_Compte, operation, somme) crdite ou dbite le compte


Numero_Compte de la valeur somme en fonction de l'opration demande (opration = dbiter ou
crditer).

Donner_Solde (Numero_Compte, var Solde) renvoie le solde du compte. Un client peut accder
chacune de ces oprations indpendamment les unes des autres et plusieurs clients accdent en
parallle au systme de gestion des comptes bancaires. On supposera que chaque compte
bancaire est stock sur disque dans un fichier appel Fichier_Numro_Compte.

On donne ci-dessous le pseudo code de ces deux fonctions :

5.1.3.1 Question 1
En prenant un exemple, montrez que des incohrences peuvent survenir sur le solde d'un compte si
plusieurs utilisateurs accdent un compte en parallle.

5.1.3.2 Question 2
On accepte les lectures en parallle des critures, mais pas les critures en parallle. Ajoutez aux pseudo
code des deux procdures les oprations de synchronisation bases sur les smaphores qui sont utiles.

5.1.3.3 Question 3
On interdit prsent les lectures en parallle des critures et les critures en parallle. Modifiez le pseudo
code des deux procdures pour raliser cette synchronisation.

5.1.4 Exercice 4
Lors de l'utilisation d'une ressource critique par une tche, il est habituel d'ajouter aux paramtres de
description de la tche ceux supplmentaires suivant :

Cia : squence d'instructions prcdant l'appel de la ressource,

Cib : squence d'instruction de la section critique ,

Cig : squence d'instruction suivant la libration de la ressource avec Ci = Cia + Cib + Cig.

Toute tche en cours d'utilisation d'une ressource critique peut tre prempte par une tche plus prioritaire
qu'elle, et qui n'a pas besoin de cette ressource. On considre l'exemple d'une configuration de trois tches
priodiques. Les tches Tp1 et Tp3.

5.1.4.1 Question 1
Dcrire graphiquement la squence obtenue avec l'ordonnancement RM sur une dure correspondant la
priode d'tude. Indiquer l'instant o se produit une inversion de priorit entre Tp1 et Tp2 sur le graphe de
la squence. Pour viter cette inversion de priorit, on applique aux tches se partageant des ressources le
principe de l'hritage de priorit : une tche qui bloque une tche plus prioritaire qu'elle, parce qu'elle utilise
une ressource dont elle a besoin, excute sa section critique avec la priorit de la tche bloque.

5.1.4.2 Question 2
En appliquant le principe prcdent, dcrire graphiquement la squence obtenue pour l'ordonnancement
RM sur la priode d'tude. Indiquer sur le graphe de la squence l'instant o se produit le blocage de Tp2
d l'hritage de priorit, et en consquence la disparition de l'inversion de priorit Voir la correction

Chapitre 9 : Inversion de Priorit


Ce chapitre est consacr l'tude de la synchronisation entre les processus . Il prsente le problme de l' inversion de
priorits .

Cours : Inversion de priorit


Rappels
Solutions mises en oeuvre
Le protocole de l'hritage de priorit
Le protocole de la priorit plafonne
Evitement de l'interblocage
Table des figures

Inversion de Priorit>Inversion de priorit

1 Cours : Inversion de priorit


1.1 Rappels
Dfinition : Ressource critique
Une ressource critique est une ressource un seul point d'accs, c'est--dire accessible par un seul
processus la fois. L'utilisation s'effectue en exclusion mutuelle. L'allocation et la dsallocation d'une
ressource critique peuvent tre gres l'aide d'un smaphore R initialis 1. L'allocation se traduit
alors par un P(R) et la restitution par un V(R).

Dfinition : Inversion de priorits


L'inversion de priorit est la situation pour laquelle une tche de priorit intermdiaire (T3) s'excute la
place d'une tche de forte priorit (T1) parce que la tche de forte priorit (T1) est en attente d'une
ressource acquise par une tche de plus faible priorit (T2). A priori, on ne peut pas borner le temps
d'attente de la tche de haute priorit qui risque ainsi de dpasser son chance car l'excution de T3
n'tait pas prvisible.

Fig 1 : Exemple d'inversion de priorits

1.2 Solutions mises en oeuvre


Les solutions mises en uvre ne cherchent pas viter le phnomne d'inversion de priorit, mais
permettent seulement de borner le temps d'attente des tches sur l'accs aux ressource s. Ces bornes B,
peuvent ensuite tre ajoutes au temps d'excution des tches et ainsi tre intgres dans les tests
d'acceptation des configurations. Il existe deux protocoles principaux :

le protocole de l'hritage de priorit

le protocole de la priorit plafonne

Ces protocoles sont mis en oeuvre de faon standard dans certains excutifs temps rel dans les
oprations P et V des smaphores.

1.2.1 Le protocole de l'hritage de priorit


Principe : une tche T dtentrice d'une ressource R hrite de la priorit des tches T' plus prioritaires mises
en attente sur cette ressource R, jusqu' ce qu'elle libre la ressource R. Ainsi T est ordonnance au plus
vite pour librer le plus rapidement possible la ressource R. En effet, les tches de priorit intermdiaire ne
peuvent plus s'excuter puisque leur priorit devient infrieure celle de la tche T.

Inconvnient : ce protocole ne prvient pas les interblocage s

Fig 2 : Protocole de l'hritage de priorits

On voit bien sur la figure 3 que l'excution de la tche T3 est repousse au del de l'excution de T2 et T1
et ne vient plus de ce fait retarder l'excution de T2.

1.2.2 Le protocole de la priorit plafonne


Principe : Chaque ressource R possde une priorit qui est celle de la tche de plus haute priorit pouvant
demander son accs. Le principe est ensuite similaire au prcdent : une tche T dtentrice d'une
ressource R hrite de la priorit des tches T' plus prioritaires mises en attente sur cette ressource R,

jusqu' ce qu'elle libre la ressource R. Ainsi T est ordonnance au plus vite pour librer le plus rapidement
possible la ressource R Cependant, la tche T ne peut obtenir la ressource R que si la priorit de R est
strictement suprieure celles de toutes les ressources dj possdes par les autres tches T''. Par ce
biais, on prvient l'interblocage.

Fig 3 : Protocole de la priorit plafonne

1.2.3 Evitement de l'interblocage


Nous approfondissons ici la manire dont les protocoles que nous venons de voir se com port ent vis--vis
du problme de l'interblocage. Nous considrons deux tches T1 et T2 telles que T1 utilise tout d'abord la
ressource R1 puis la ressource R2 tandis que T2 utilise d'abord la ressource R2 depuis la ressource R1. La
figure 4 dcrit ce qui se passe en appliquant la protocole de l'hritage de priorit : ici la tche T2 s'excute
et obtient la ressource R2, puis T1 s'excute et obtient la ressource R1.T1 est ensuite bloque lorsqu'elle
demande accder la ressource R2 et T2 hrite de la priorit de T1. T2 poursuit son excution, demande
accder R1 et se bloque son tour. Rien n'empche les deux tches de tomber en interblocage.

Fig 4 : Interblocage et Protocole de l'hritage de priorit

Observons maintenant sur la figure 5 ce qui se passe avec le protocole de la priorit plafonne. Lorsque T1
demande accder R1, la ressource ne lui est pas accorde car la priorit de R1 n'est pas suprieure
la priorit de R2, dj possde par T2. De cette manire, T2 poursuit son excution en hritant de la
priorit de T1, librant au plus vite les ressource s R2 et R1. L'interblocage est vit.

Fig 5 : Interblocage et Protocole de la priorit plafonne

Chapitre 10 : Communication inter processus sur le rseau


Ce chapitre est consacr l'tude de la programmation socket qui permet de faire communiquer des processus placs sur des
machines distantes, en utilisant les protocoles rseau UDP/IP et TCP/IP.

Cours : Rappels sur l'interconnexion de rseau et le protocole TCP/IP


Le modle client serveur
Introduction
Les diffrents types de serveur
L'interconnexion de rseau
Ladressage IP dans le rseau virtuel
La couche de protocoles TCP/IP
Exercices dirigs
Gestion du disque
Exercice 1 : COMPARAISON DES POLITIOUES DE GESTION DU DISQUE
Question 1
Question 2

Exercice 2 : GESTION DE FICHIERS UNIX


Exercice 3
Question 1
Question 2
Question 3

Table des figures

Communication inter processus sur le rseau>Rappels sur l'interconnexion de rseau et le protocole


TCP/IP

1 Cours : Rappels sur l'interconnexion de rseau et le


protocole TCP/IP
1.1 Le modle client serveur
1.1.1 Introduction
Le modle de communication client serveur est un modle de communication asymtrique. D'un ct, le
serveur ouvre un service et attend des requtes provenant de clients. Pour chacune de ces requtes, le
serveur effectue un traitement puis renvoie une rponse. De l'autre ct, le client met des requtes, puis
attend la rponse du serveur. Le client et le serveur tant placs sur des machines diffrentes, la
communication entre ces deux entits s'effectue par messages.

1.1.2 Les diffrents types de serveur


Il est possible de caractriser un serveur selon deux critres :

la manire dont il traite les requtes provenant des clients : on distingue le serveur itratif du serveur
parallle

la manire dont il ragit vis--vis des pannes. On distingue le serveur sans tat et le serveur tats .

Dfinition : Serveur itratif


Un serveur itratif est un serveur qui ne peut traiter qu'une seule requte client la fois. Il est compos
d'un processus unique qui effectue les oprations de rception de requtes, de traitement de requtes et
d'mission des rponses.

Dfinition : Serveur parallle


Un serveur parallle est un serveur qui peut traiter plusieurs requtes client la fois. Il est compos d'un
processus pre qui effectue les oprations de rception de requtes et pour chaque requte reue, d'un
processus fils qui effectue le traitement de la requte et l'mission de la rponse.

Dfinition : Serveur sans tat


Un serveur sans tat est un serveur qui ne conserve aucune informations sur les requtes en cours de
traitements. C'est un serveur sans mmoire qui en cas de panne, repart " zro".

Dfinition : Serveur tats


Un serveur tat est un serveur qui conserve, sur un support non volatile, des informations sur les
requtes en cours de traitements. C'est un serveur mmoire qui en cas de panne, peut restaurer une
partie de son tat au moment de la panne et reprendre des requtes en cours.

1.2 L'interconnexion de rseau

Linterconnexion de rseaux a pour but dinterconnecter entre eux des rseaux htrognes. Le but
recherch est de crer un rseau virtuel qui masque compltement les rseaux physiques emprunts. Une

machine M1 dialoguant avec une machine M2 passe par diffrents rseaux physiques sans en avoir
conscience. Le masquage des rseaux physiques emprunts suppose de disposer de deux lments :

Il faut un adressage des diffrentes machines appartenant au rseau virtuel construit


indpendamment de ladressage physique particulier chaque rseau travers : Cest ladressage
IP.

Il faut un protocole de trans port de bout en bout permettant dacheminer les donnes dune machine
M1 vers la machine M2 travers le rseau virtuel : cest la pile de protocoles TCP/IP.

1.2.1 Ladressage IP dans le rseau virtuel


Dans le rseau virtuel, une machine est dsigne par une adresse que lon appelle ladresse IP. Une
adresse IP est un entier 32 bits divis en deux parties : une partie adresse du rseau et une partie adresse
de la machine dans le rseau. Comme le montre la figure ci-dessous, il existe trois classes dadresse IP, la
classe A, le la classe B, et la classe C, qui permettent chacune dadresser plus ou moins de machines dans
un rseau. On associe une adresse IP une notation que lon appelle la notation dcimale pointe qui
associe chacun des octets composant lentier de 32 bits sa valeur dcimale spar par un point.

Dfinition : Adresse IP
Une adresse IP est un entier 32 bits divis en deux parties : une partie adresse du rseau et une partie
adresse de la machine dans le rseau. Elle permet de dsigner une machine dans linterconnexion de
rseau. On associe une adresse IP une notation que lon appelle la notation dcimale pointe qui
associe chacun des octets composant lentier de 32 bits sa valeur dcimale spar par un point.
Exemple : 128.163.10.12.

Fig 1 : Ladressage IP

chaque adresse IP, correspond un nom symbolique form de caractres alphanumriques. La


composition du nom symbolique repose sur la notion de domaine. Le domaine correspond un groupe
gographique (fr, jp) ou institutionnel (com , mil, edu). Le nom symbolique dune machine est alors form de
son nom suivi de lensemble des domaines auxquels elle appartient, chaque lment tant spars par un
point. Ainsi la machine fermi.cnam.fr correspond la machine de nom fermi dans le domaine cnam,
appartenant lui-mme au domaine fr. Le nom symbolique est utilis pour dsigner une machine parce
qutant composs de caractres alphanumriques, il est plus aisment manipulable par un tre humain.
Ce nom symbolique ne correspond rien pour le rseau virtuel et doit tre converti en ladresse IP
correspondante. Cette conversion seffectue grce des serveurs de nom et sappelle la rsolution de
noms. Enfin lors de la traverse des rseaux physiques, ladresse IP doit tre reconvertie vers ladresse
physique du rseau, par exemple ladresse ethernet pour un rseau de type Ethernet. Cette conversion de
ladresse IP vers ladresse physique s'appelle la rsolution dadresses.

Dfinition : Nom symbolique


chaque adresse IP, correspond au nom symbolique form de caractres alphanumriques. La
composition du nom symbolique repose sur la notion de domaine. Le domaine correspond un groupe
gographique (fr, jp) ou institutionnel (com , mil, edu). Le nom symbolique d'une machine est alors form
de son nom suivi de l'ensemble des domaines auxquels elle appartient, chaque lment tant spars par
un point. Exemple : fermi.cnam.fr.

Fig 2 : Ladressage dans linterconnexion de rseau

1.2.2 La couche de protocoles TCP/IP


La figure 3 ci-dessous reprsente la couche de protocoles pour linterconnexion de rseaux, cette couche
de protocoles tant couramment appele couche de protocole TCP/IP. La couche IP correspond au niveau

rseau. Elle permet de faire un adressage de machine machine par le biais des adresses IP de chacune
des machines. La communication au niveau de la couche IP est une communication en mode minimal, cest-dire en mode non connect et sans fiabilit : il ny a pas de garantie de bon transfert des datagrammes
IP, lesquels sont achemins indpendamment les uns des autres. La remise peut tre faite dans le
dsordre, il peut y avoir perte de datagrammes ainsi que des duplications.

Fig 3 : La pile de protocoles TCP/IP

La couche suprieure UDP/TCP correspond au niveau transport. A ce niveau, ladressage seffectue


dapplications applications par le biais de la notion de port. Un port est un entier de 16 bits qui permet de
dsigner une application travers le rseau. Pour chacun des protocoles transport, il existe des ports.
Parmi ces ports, certains sont rservs aux applications courantes du rseau. Par exemple le port UDP 513
correspond lapplication who. Le port TCP 21 correspond lapplication ftp tandis que le port TCP 23
correspond lapplication telnet.

Dfinition : Port
Le port est un entier de 16 bits permettant dadresser une application sur la couche de protocole TCP/IP.

Le protocole UDP est en protocole transport non fiable bas sur IP. Les datagrammes UDP sont achemins
indpendamment les uns des autres, il sensuit quil peut y avoir perte de datagrammes, duplication de
datagrammes et la remise nest pas forcment effectue selon lordre dmission. Le protocole TCP/IP, au
contraire est un protocole de transport fiable orient connexion, galement bas sur IP. Avant lchange
des donnes, une connexion est tablie entre les deux entits communicantes : cette connexion est fiable :
il ne peut pas y avoir de perte de messages, il n'y a pas de duplication et la remise seffectue dans lordre
dmission.

Communication inter processus sur le rseau>Exercices dirigs

2 Exercices dirigs
2.1 Gestion du disque
2.1.1 Exercice 1 : COMPARAISON DES POLITIOUES DE GESTION DU
DISQUE
2.1.1.1 Question 1
Expliquez comment se dcompose l'accs un secteur du disque. Quelle phase de cet accs est-elle la
plus coteuse ?

2.1.1.2 Question 2
On considre un disque compos de 300 pistes numrotes de 0 299. Le bras est couramment
positionne sur la piste 50.
La liste des requtes (n de piste cherche) servir donne selon l'ordre d'arrive est la suivante :
62, 200, 150, 60, 12, 120, 250, 45, 10, 100 Donnez l'ordre de service des requtes et le dplacement de
bras total en rsultant dans le cas d'un service FCFS, d'un service SSTF et d'un service SCAN sens initial
montant.

2.1.2 Exercice 2 : GESTION DE FICHIERS UNIX


Un processus lit squentiellement un fichier de 8 Mo, raison de 256 octets la fois. On suppose que les
blocs disque sont de 1024 octets et qu'un numro de bloc occupe 4 octets. par ailleurs, le temps d'accs
moyen au disque est de 40 ms.
1/ Rappelez la structure d'une inode et d'un fichier Unix
2/ Le systme ne gre pas de mcanisme de buffer cache.Donnez le nombre total d'accs disque
ncessaire et le temps d'attente en entres/sorties
3/ Le systme gre un mcanisme de buffer cache
3.a/ Rappelez le fonctionnement de ce mcanisme. Pourquoi la gestion de remplacement est-elle LRU
plutt que FIFO ?
3.b/ Donnez le nombre total d'accs disque ncessaire et le temps d'attente en entres/sorties
3.c/ L'criture physique des blocs modifis ne se fait que lorsqu'un bloc du buffer cache doit tre libr.
Quel avantage et inconvnient cela prsente-t-il ? Quel est alors le rle de la primitive systme SYNC ?

2.1.3 Exercice 3
On considre un systme de gestion de fichiers qui fait de l'allocation par zone. L'ensemble du disque est

constitu de 100 blocs, numrots de 0 99. Trois fichiers existent sur le disque, dfinis comme suit, le
reste de l'espace tant libre.
F1, Dbut = bloc5, Taille=20blocs,
F2, Dbut = bloc 25, Taille 5 blocs,
F3, Dbut = bloc 50, Taille 10 blocs.
Les trois questions sont indpendantes, c'est--dire que dans chaque cas, on part de la situation ci dessus.

2.1.3.1 Question 1
On veut rajouter 10 blocs au fichier FI. Quelles solutions proposez-vous suivant que l'implantation
squentielle est simple ou avec extensions. Justifiez votre raisonnement et valuez le cot de ces
solutions.

2.1.3.2 Question 2
On veut crer un fichier F4 de 10 blocs. O proposez-vous de le mettre, en justifiant votre raisonnement.

2.1.3.3 Question 3
On veut crer un fichier F4 de 40 blocs. Quelles solutions proposez-vous suivant que l'implantation
squentielle est simple ou avec extensions. Justifiez votre raisonnement et valuez le cot de ces
solutions. Voir la correction

Chapitre 11 : Programmation socket


Ce chapitre est consacr l'tude de la programmation socket qui permet de faire communiquer des processus placs sur des
machines distantes, en utilisant les protocoles rseau UDP/IP et TCP/IP.

Cours 1 : Utilitaires pour la programmation socket


Les fichiers de bases
La dfinition d'une adresse machine
Les primitives de conversion pour la reprsentation des entiers
Le fichier /etc/hosts
Cours 2 : La cration d'une socket
L'interface socket
La cration d'une socket
L'attchement d'une adresse une socket
Un exemple : la fonction creesock
Cours 3 : La programmation en mode UDP
Cration des points de communication
Echange de donnes en mode UDP
Un exemple de programmation en mode UDP
Cours 4 : La programmation en mode TCP
Etablissement d'une connexion TCP/IP
Echange de donnes en mode TCP
Un exemple de programmation TCP : ralisation d'un serveur itratif
Un exemple de programmation TCP : ralisation d'un serveur parallle
Exercices dirigs
Programmation des sockets
Exercice 1
Exercice 2
Exercice 3
Table des figures

Programmation socket>Utilitaires pour la programmation socket

1 Cours 1 : Utilitaires pour la programmation socket


1.1 Les fichiers de bases

Les fichiers suivants doivent tre inclus dans tout programme ncessitant l'utilisation des sockets
# include <sys/types.h>

# include <netdb.h>

# include <netinet/in.h>

# include <arpa/inet.h> -- pour les conversions

1.2 La dfinition d'une adresse machine

Une adresse machine est dfinie selon le type ci-dessous :


struct in_addr {

u_long s_addr;

1.3 Les primitives de conversion pour la reprsentation des entiers

La manipulation des adresses au niveau des sockets va amener manipuler deux entiers, l' adresse IP
d'une part qui est un entier de quatre octets, le port qui est un entier de deux octets. Les machines
admettent deux formats de reprsentation pour les entiers longs et les entiers courts. Dans le format dit Big
Endian, les octets composant un mot de 16 bits ou de 32 bits sont numrots de la gauche vers la droite,
c'est--dire que l'octet de poids faible reoit le plus gros numro. Dans le format Little Endian, les octets
composant un mot de 16 bits ou de 32 bits sont numrots de la droite vers la gauche, c'est--dire que
l'octet de poids faible reoit le plus petit numro. Une machine travaillant au format Big Endian interprtera
mal les entiers de format Little Endian qu'elle recevra. Aussi il est convenu que toute adresse mise sur le

rseau doit tre mise selon un format dit format rseau, par opposition au format local de la machine. Par
convention ce format rseau est le format Big Endian. Ainsi une machine en mission convertira toujours
les adresses IP et les numros de ports de son format local vers le format rseau tandis qu'une machine en
rception convertira toujours les adresses IP et les numros de port du format rseau vers le format local.
Quatre primitives sont fournies pour permettre la conversion des entiers courts et des entiers longs du
format local vers le format rseau et vice versa.
Fonctions de conversion d'entiers du format local au format rseau

-- conversion d'un entier court du format local au format rseau

u_short htons (hostshort)

u_short hostshort;

-- conversion d'un entier long du format local au format rseau

u_long htonl (hostlong)

u_long hostlong;

-- conversion d'un entier court du format rseau au format local

u_short ntohs (netshort)

u_short netshort;

-- conversion d'un entier long du format rseau au format local

u_long ntohl (netlong)

u_long netlong ;

1.4 Le fichier /etc/hosts

Le fichier /etc/hosts permet de faire la correspondance entre le nom symbolique d'une machine et son
adresse IP. Ce fichier contient une ligne par machine et donne pour chaque machine son adresse IP, son
nom symbolique principal, ses alias et ventuellement un commentaire.
/etc/hosts

Correspondance adresse IP et nom symbolique

Adresse IP nom symbolique alias, commentaire

163.173.128.6 Asimov.cnam.fr cnam iris

La fonction gethostbyname(nom) permet d'obtenir les informations relatives une entre du fichier
/etc/hosts en spcifiant comme paramtre de recherche le nom symbolique de la machine. Cette fonction
retourne une structure de type hostent dont la structure est donne ci-aprs. La ligne #define h_addr
h_addr_list[0] permet de connatre la premire adresse IP de la machine.
struct hostent {

char *h_name; /* official name of host */

char **h_aliases; /* alias list */

int h_addrtype; /* host address type */

int h_length; /* length of address */

char **h_addr_list; /* list of addresses from name server */

#define h_addr

h_addr_list[0] /* address, for backward compatiblity */

};

-- obtenir l'entre etc/host de la machine de nom "nom"

struct hostent *gethostbyname (nom)

char *nom;

Programmation socket>La cration d'une socket

2 Cours 2 : La cration d'une socket


2.1 L'interface socket

Comme le montre la figure 1 ci-dessous, l'interface socket correspond deux choses :

L'interface correspond tout d'abord une interface de programmation, c'est--dire un ensemble de


primitives permettant de programmer au dessus des couches transport TCP et UDP.

Par ailleurs la socket correspond galement un point de communication sur la pile de protocole
TCP/IP c'est--dire qu'elle reprsente l'adresse d'une application donc un couple adresse IP numro de port.

De plus, l'interface des sockets est compatible avec l'interface des fichiers Unix. Lors de la cration d'une
socket, un descripteur de socket est allou dans la table des fichiers ouverts du processus crateur. Ce
descripteur pointe sur une structure de socket plutt que de pointer sur une structure de fichiers (inode).
Notamment la socket rpond aux critres d'hritage pre fils qui s'applique aux descripteurs de fichiers.

Fig 1 : l'interface socket

2.2 La cration d'une socket

La cration d'une socket s'effectue par un appel la primitive SOCKET dont le prototype est donn cidessous. Le premier paramtre domaine prend la valeur AF_INET. Le second paramtre qui correspond au
type de service prend pour valeur soit SOCK_STREAM pour une communication en mode connect, soit
SOCK_DGRAM pour une communication en mode datagramme. Le troisime paramtre protocole
correspond au protocole utilis, donc soit TCP, soit UDP. Le champ peut tre mis zro ce qui laisse alors
le systme choisir le bon protocole en fonction du type spcifi.
int socket (domaine, type, protocole)

int domaine ;

int type ;

int protocole ;

La primitive de cration socket retourne un entier correspond au descripteur de la socket cre. l'issue de
l'opration de cration, la socket tout comme un fichier est utilisable par le processus crateur et les
processus crs par ce processus crateur aprs la cration de la socket.

Dfinition : Primitive Socket


int socket (int domaine, int type, int protocole) : cration d'une socket de communication

2.3 L'attchement d'une adresse une socket

Pour que des processus extrieurs la famille du processus crateur puissent accder la socket il faut
maintenant attcher une adresse cette socket. La primitive permettant d'attcher une adresse une
socket est la primitive BIND . Le prototype de la primitive BIND est donn ci-dessous. Le premier paramtre
correspond au descripteur de socket cr par l'appel socket. Le second paramtre correspond une
structure de type sockaddr_in. Cette structure permet de stocker une adresse d'application c'est--dire
notamment une adresse IP et un numro de port . Le dernier paramtre lg correspond la taille de la
structure d'adresse en octets.
int bind (sock, p_adresse, lg)

int sock;

struct sockaddr_in *p_adresse;

int lg;

struct sockaddr_in {

short sin_family; -- AF_INET

ushort sin_port; -- le numro de port

struct in_adrr sin_addr ; -- l'adresse IP

char sin_zero[8]; -- huit 0

Dfinition : Primitive Bind


int bind (int sock, sockaddr_in *p_adresse, int lg) : attchement de l'adresse p_adresse la socket sock

2.4 Un exemple : la fonction creesock


int creesock(port, type)

int port; /* le numero de port au format local */

int type ; /* le type de la socket : SOCK_DGRAM ou SOCK_STREAM

int sock;

struct sock_addr_in nom;

int longueur;

/* Cration de la socket */

if((sock = socket(AF_INET,type,0)) < 0)

perror("socket");

exit(1);

/* preparation de l'adresse */

/* la zone mmoire pour l'adresse est mise 0 */

bzero(&nom,sizeof(nom));

nom.sin_family = AF_INET;

nom.sin_port = htons(port) ; /* passage au format rseau */

nom.sin_addr.s_addr = INADDR_ANY ; /* n'importe quelle adresse IP de la machine


locale */

/attchement de la socket */

if(bind(sock, &nom, sizeof(nom)) < 0)

perror("bind");

exit(2);

return(sock) ;

Programmation socket>La programmation en mode UDP

3 Cours 3 : La programmation en mode UDP


La communication en mode UDP est un mode de communication non fiable, sans connexion. Une fois, les
points de communication cres sur la pile de protocole, le client et le serveur s'changent directement les
donnes sous forme de datagrammes UDP. Chaque envoi doit contenir l'adresse du destinataire.

3.1 Cration des points de communication

Chaque entit communicante, le client et le serveur, commencent par crer une socket de type
SOCK_DGRAM, puis chacun attche cette socket son adresse locale, forme du numro de port de
l'application (client ou serveur) et de l' adresse IP des machines client ou serveur.

Fig 2 : Cration des points de communication

3.2 Echange de donnes en mode UDP

L'change de donnes s'effectuent sous forme de datagrammes. Sa structure est prserve la rception,
c'est--dire qu'une opration de rception permet toujours de rcuprer l'intgralit d'un datagramme mis

sur une opration d'envoi.

La primitive sendto permet l'envoi d'un datagramme. La primitive recvfrom permet la rception d'un
datagramme. La primitive recvfrom est bloquante, c'est--dire qu'un processus effectuant un appel la
primitive recvfrom est bloqu jusqu' avoir effectivement reu un datagramme.

Fig 3 : Echange de datagrammes

int sendto(sock, msg, lg, option, p_dest, lgdest)

int sock; -- socket pour l'mission

char *msg; -- adresse du message mis

int lg; -- taille du message en octets

int option;

struct sockaddr_in *p_dest; -- adresse du destinataire : adresse IP et


nde port

int lgdest; -- taille de la structure d'adresse en octets

int recvfrom(sock, msg, lg, option, p_exp, lgexp)

int sock; -- socket de rception

char *msg; -- adresse d'une zone pour recevoir le message

int lg; -- taille en octets de la zone de rception

int option; -- 0 ou MSG_PEEK ( le message est lu sans tre extrait de


la socket)

struct sockaddr_in *p_exp; -- structure adresse contenant l'adresse de


l'expditeur du message au retour de la primitive

int *lgexp; -- taille de la structure adresse

Dfinition : Primitive Sendto


int sendto (int sock, char *msg, int lg, int option, struct sockaddr_in *p_dest, int lgdest) : envoi d'un
datagramme msg *p_dest.

Dfinition : Primitive Recvfrom


int recvfrom (int sock, char *msg, int lg, int option, struct sockaddr_in *p_exp, int *lgexp) : rception d'un
datagramme msg envoy par *p_exp.

3.3 Un exemple de programmation en mode UDP

Nous donnons ci-dessous un exemple de client /serveur en mode UDP. Le client envoie une ligne au
serveur qui l'affiche.
CLIENT

#include <stdio.h>

#include <errno.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#define PORTC 6259 -- port du client

#define PORTS

6260

-- port du serveur

main()

struct hostent *h;

struct sockaddr_in sin;

char buf[20];

int sock, portc, ports;

/* cration socket et attchement d'une adresse*/

sock = creesock(portc, SOCK_DGRAM)

/* Construction adresse du serveur */

if(!(h=gethostbyname("dirac.cnam.fr")))

perror("dirac.cnam.fr");

exit(2);

bzero(&sin,sizeof(sin));

sin.sin_family = AF_INET;

-- copie de l'adresse IP du serveur dans la structure d'adresse sockaddr_in sin

bcopy(h->h_addr,&sin.sin_addr,h->h_length);

ports = htons(PORTS);

sin.sin_port = port s;

if (sendto(sock, "bonjour, serveur !! ", 20, 0, &sin, sizeof(sin)) == -1)

perror ("pb sendto");

exit();

printf ("Message envoye \n");

close (sock);

SERVEUR

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#define PORTS

6260

-- port du serveur

main()

int namelen, sock;

char buf[20];

struct sockaddr_in adr;

int lg, n;

/* Cration socket */

if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0)

perror("socket");

exit(1);

/* preparation de l'adresse */

/* la zone mmoire pour l'adresse est mise 0 */

bzero(&sin,sizeof(sin));

sin.sin_family = AF_INET;

sin.sin_port = htons(PORTS) ; /* passage au format rseau */

sin.sin_addr.s_addr = INADDR_ANY ; /* n'importe quelle adresse IP de la machine


locale */

/* Attchement socket */

if(bind(sock, &sin, sizeof(sin)) < 0)

perror("bind");

exit(2);

for (;;)

lg = sizeof(adr);

n = recvfrom (sock, buf, 20, 0, &adr, &lg);

printf("Chaine recu %s\n", buf);

close(sock);

Programmation socket>La programmation en mode TCP

4 Cours 4 : La programmation en mode TCP


La communication en mode TCP est un mode de communication fiable, oriente connexion. Une fois, les
points de communication cres sur la pile de protocole, le client et le serveur doivent tablir une connexion
avant de pouvoir s'changer des donnes sous forme flux d'octets TCP. L'change des adresses entre
metteur et rcepteur s'effectue au moment de l'tablissement de la connexion. Lorsque l'change est
termin, la connexion est ferme.

4.1 Etablissement d'une connexion TCP/IP

Fig 4 : Cration des points de communication TCP et tablissement de connexion

Chaque entit communicante, le client et le serveur, commencent par crer une socket de type
SOCK_STREAM, puis chacun attche cette socket son adresse locale, forme du numro de port de
l'application (client ou serveur) et de l' adresse IP des machines client ou serveur.
Le serveur, ensuite, se prpare en vue de recevoir des connexions de la part de clients. Pour cela, il fait
d'abord appel la primitive Listen pour dimensionner sa file de connexions pendantes sur sa socket initiale
que nous appelerons la socket d'coute..

int listen (sock, nb)

int sock; /* socket dcoute */

int nb;

/* nb, nombre de connexions pendantes maximal */

Le serveur se met alors en attente de connexion par un appel la primitive accept. Cette primitive est
bloquante, c'est--dire que le serveur reste bloqu sur cette primitive jusqu' ce qu'un client tablisse
effectivement une connexion.
int accept (sock, p_adr, p_lgadr)

int sock;

/* socket d'coute */

struct sockaddr_in *p_adr; /* adresse de la socket connecte */

int *p_lgadr; /* taille en octets de la structure adresse */

De son ct, le client demande l'tablissement d'une connexion en faisant appel la primitive connect. De
la mme manire, la primitive connect est bloquante pour le client, c'est--dire que le client est bloqu
jusqu' ce que le serveur accepte sa connexion.
int connect (sock, p_adr, lgadr)

int sock; /* socket client */

struct sockaddr_in *p_adr; /* adresse de la socket du serveur */

int lgadr; /* taille en octets de la structure adresse */

Au moment de l'tablissement de la connexion, le serveur cre une nouvelle socket que l'on appelle la
socket de service. Le descripteur de cette nouvelle socket est retourn par la primitive accept. Cette socket
de service est la socket sur laquelle s'effectuent ensuite tous les changes de donnes entre les deux
entits connectes par le biais des primitives read et write..

Fig 5 : Cration de la socket de service au moment de l'tablissement de la connexion

Dfinition : Primitive Listen


int listen (int sock, int nb) : cration de la file de connexions pendantes (n max) associe la socket
d'coute sock

Dfinition : Primitive Connect


int connect (int sock, struct sockaddr_in *p_adr, int lgadr) : demande d'tablissement de connexion avec
la socket distante dont l'adresse est *p_adr

Dfinition : Primitive Accept


sock_service = accept (int sock_ecoute, struct sockaddr_in p_adr, int p_lgadr) : Acceptation de
connexion sur la socket locale d'coute avec la socket distante p_adr. En rsultante, cration de la socket
de service sock_service.

4.2 Echange de donnes en mode TCP

L'change de donnes s'effectuent sous forme de flux d'octets. Il faut prendre garde au fait que la structure
des messages n'est pas conserve et le dcoupage en messages identifiables correspondant aux
diffrents envois nest pas prserv sur la socket destinataire.

Une opration de lecture peut provenir de diffrentes oprations dcriture

Une opration dcriture dune chaine longue peut provoquer son dcoupage, les diffrents
fragments tant accessibles sur la socket destinataire

La primitive write permet l'envoi d'un ensemble d'octets constituant un message. La primitive read permet la
rception d'un ensemble d'octets.
int write (sock, msg, lg)

int sock;

char *msg; /* adresse de la zone mmoire contenant du message envoyer


*/

int lg; /* taille en octets du message */

int read (sock, msg, lg)

int sock;

char *msg; /* adresse de la zone mmoire pour recevoir le message */

int lg; /* taille en octets du message */

Dfinition : Primitive Read (rseau)


int read (int sock,char *msg, int lg) : lecture du message msg de taille lg octets sur la socket sock en
mode connect

Dfinition : Primitive Write (rseau)


int write (int sock,char *msg, int lg) : criture du message msg de taille lg octets sur la socket sock en
mode connect

4.3 Un exemple de programmation TCP : ralisation d'un serveur itratif

Nous donnons ci-dessous un premier exemple de programmation d'un client-serveur en mode TCP : le
serveur crit dans cet exemple correspond un serveur de type itratif compos d'un seul processus qui
reoit les connexions, remplit le service demand, puis rompt la connexion avant d'en accepter une
nouvelle. Le service remplit par le serveur consiste tout simplement afficher une chaine de caractres
envoyes par le client. On notera la procdure de lecture de la chaine de caractres sur la socket serveur,
qui fait une lecture caractre par caractre jusqu' trouver le caractre '\n' afin d'tre certain d'avoir
rcupr la chaine en entier.

SERVEUR

************************************************

Serveur affichant l'cran la ligne envoye par le client

************************************************

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <pwd.h>

#define LGUSER 20

#define LGREP 256

#define PORT 6259

/* port du serveur */#define TRUE 1

main ()

int lg, port, sock, nsock, d; /* sock socket d'coute, nsock socket de service
*/

struct sockaddr_in adr; /* adresse de la socket distante */

if ((sock = creesock(port,SOCK_STREAM)) == -1) {

fprintf (stderr, "Echec creation/liaison de la socket\n");

return;

/* Creation de la file des connexions pendantes */

listen(sock,5);

/* Boucle d'acceptation d'une connexion */

while (TRUE) { /* Attente de question sur la socket */

lg = sizeof(adr);

nsock = accept (sock,&adr,&lg);

service(nsock);

close(nsock);

************************************************

Fonction service

************************************************

int service (nsock)

int nsock;

int n;

char line[MAXLINE];

n = readline(nsock,line,MAXLINE);

if (n < 0) {

perror ("Pb lecture de ligne");

return; }

fputs (line, stdout);

*********************************************************

Fonction readline : lit une ligne sur la socket fd caractre par caractre

*********************************************************

int readline(fd,ptr,maxlen)

int fd;

char *ptr;

int maxlen;

int n, rc;

char c;

for (n=1; n<maxlen; n++)

rc = read(fd, &c, 1);

*ptr++ = c;

if (c == '\n')

break;

*ptr = '\0';

return(n);

CLIENT

************************************************

Client : envoie une ligne afficher au serveur

************************************************

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#define PORT 6259 /* port du serveur */

#define PORTC 6260 /* port du client */

#define TRUE 1

main ()

int sock;

struct sockaddr_in adr;

struct hostent *hp;

if ((sock = creesock(PORTC,SOCK_STREAM)) == -1) {

fprintf (stderr, "Echec creation/liaison de la socket\n");

return;

/* preparation de l'adresse de la socket destinataire */

if ((hp = gethostbyname("dirac.cnam.fr")) == NULL) {

perror ("Nom de machine irrecuperable");

return;

bzero ((char *)&adr,sizeof(adr));

adr.sin_port = htons(PORT);

adr.sin_family = AF_INET;

bcopy (hp->h_addr, &adr.sin_addr, hp->h_length);

connect (sock, (struct sockaddr *)&adr, sizeof(adr));

client(sock);

close(sock);

************************************************

Fonction client

************************************************

int client(sock)

int sock;

int n;

char line[MAXLINE];

printf (" Donnez une ligne : \n");

fgets (line, MAXLINE, stdin);

n = strlen (line);

if (write (sock, line, n) != n)

perror ("Pb ecriture de ligne");

4.4 Un exemple de programmation TCP : ralisation d'un serveur parallle

Le serveur donn en exemple dans le paragraphe prcdent est un serveur itratif. Une fois que le serveur
a accept une connexion, de la part d'un client, les clients suivants sont mis en attente jusqu' ce que le
serveur ait fini de traiter le premier client et revienne sur l'accept pour accepter une nouvelle connexion.
Durant tout le traitement d'un client connect, le serveur travaille sur la socket de service et la socket
d'coute ne sert pas.
Il serait ici plus performant de crer un serveur parallle tel que :

Le processus pre accepte les connexions sur la socket d'coute et cre une socket de service pour
la connexion accepte.

Pour chaque connexion accepte, le processus pre cre un processus fils. Ce fils hrite
naturellement de la socket d'coute et de la socket de service ouvertes par son pre.

Le fils s'occupe de servir le client : il travaille donc avec la socket de service et ferme la socket
d'coute.

Le pre est libr du service du client ralis par son fils. Il ferme la socket de service et retourne
immdiatement accepter de nouvelles connexions sur la socket d'coute. Dans ce cas de figure, on
aura donc autant de fils cres que de connexions acceptes par le pre.

Nous donnons ci-dessous le code correspondant pour le mme exemple que prcdemment. Seul le
processus serveur est modifi.

SERVEUR

#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include


<netdb.h> #include <pwd.h> #include <sys/wait.h> #include <signal.h> #define LGUSER 20 #define
LGREP 256 #define PORT 6259 #define TRUE 1 #define MAXLINE 512

main ()

{ int lg, port, sock, nsock, d, pid; struct sockaddr_in adr; /* adresse de la socket distante */

if ((sock = creesock(port,SOCK_STREAM)) == -1) {


socket\n");

fprintf (stderr, "Echec creation/liaison de la

return; }

/* Creation de la file des connexions pendantes */ listen(sock,5);

/* Boucle d'acceptation d'une connexion */

while (TRUE) { /* Attente de question sur la socket */

lg = sizeof(adr);

nsock = accept

(sock,etadr,etlg);

/* creation dun fils pour chaque connexion accepte */

pid = fork();
/* Je suis le fils */
}

else

if (pid == -1) {

fprintf (stderr, "pb fork\n");

close(sock);

service(nsock);

return;

else

close(nsock);

if (pid == 0) {
exit();

close (nsock); }

On notera ici que les processus fils deviennent zombies car le processus pre n'effectue pas de wait pour
rcuprer la mort de ses fils. Pour viter cette situation, on peut ajouter la ligne suivante au code du serveur
qui permet au pre d'ignorer le signal mort du fils et de dtruire automatiquement en consquence les
processus zombies : Signal (SIGCHLD, SIG_IGN);

Programmation socket>Exercices dirigs

5 Exercices dirigs
5.1 Programmation des sockets
5.1.1 Exercice 1
Cration et attchement d'une socket 1.a/ Rappelez la dfinition d'une socket et le format de la primitive
permettant sa cration.
1.b/ A l'issue de cette cration, quels sont les processus pouvant utiliser la socket ?
1.c/ Quelle primitive permet d'associer une adresse rseau une socket ?

5.1.2 Exercice 2
Communication en mode datagramme ou en mode connect On considre l'application clients-serveur
rpartie suivante : le serveur gre une table annuaire de couple (nom_de_personne, numero_telephone).
Des clients interrogent le serveur en lui transmettant un nom_de_personne. Le serveur rpond en envoyant
au client le couple correspondant (nom_de_personne, numero_telephone) si il a t trouv dans le table,
sinon le message "usager inconnu".

2.a/ Donnez le pseudo-code d'un client et du serveur en supposant une communication en mode
datagramme. Faites apparaitre dans ce pseudo-code les primitives de communication utilise.

2.b/ Donnez le pseudo-code d'un client et du serveur en supposant une communication en mode connect.
Faites apparaitre dans ce pseudo-code les primitives de communication utilise.

2.c/ Le serveur cre un fils pour grer chacune des requtes des clients. Donnez le pseudo-code du
serveur et de l'un de ses fils en supposant une communication en mode connect.

2.d/ On suppose prsent que le serveur peut accepter deux types de requtes de la part des clients :

les requtes de consultation de l'annuaire similaires celles traites jusqu' prsent

les requtes de modification de l'annuaire : le client fournit alors au serveur un couple


(nom_de_personne, numero_telephone) que le serveur enregistre dans sa table. Chacun des deux
types de requtes est accept par le serveur sur deux ports diffrents : PORTC pour les
consultations et PORT M pour les modifications. Les consultations et les modifications peuvent tre
demandes en parallle par des clients diffrents. Le serveur doit traiter les demandes comme elles
se prsentent. Donnez le pseudo-code du serveur. A votre avis, faut-il protgez l'accs la table de
l'annuaire par un schma de synchronisation ?

5.1.3 Exercice 3
Le dmon INETD
3.a/ Quel est le rle du dmon Inetd ?
3.b/ Ecrivez le pseudo-code de ce dmon.
Voir la correction

Lexique

Adresse IP

Une adresse IP est un entier 32 bits divis en deux parties : une partie adresse du rseau et une partie adresse de la machine
dans le rseau. Elle permet de dsigner une machine dans linterconnexion de rseau. On associe une adresse IP une notation
que lon appelle la notation dcimale pointe qui associe chacun des octets composant lentier de 32 bits sa valeur dcimale
spar par un point. Exemple : 128.163.10.12.

Application temps rel

Une application temps rel est une application pour laquelle le facteur temps est la principale contrainte respecter. L'
application doit fournir un rsultat juste mais si celui-ci est fourni hors dlai, alors il ne pourra pas tre valid.

Coalition et famine

On parle de coalition de n processus contre p autres processus lorsqu un ensemble de n processus monopolisent des ressources
au dtriment des p autres processus. On dit galement que les p processus qui ne peuvent pas s'excuter faute de ressources
sont en situation de famine.

Commandes et appels systmes

Les appels systmes constituent l'interface du systme d'exploitation et sont les points d'entres permettant l'excution d'une
fonction du systme. Les appels systme sont directement appelables depuis un programme. Les commandes permettent elles
d'appeler les fonctions du systme depuis le prompt de l'interprteur de commande (shell, invite du dos).

Commutations de contexte

Le passage entre les modes utilisateur / superviseur s'accompagne de commutations de contexte (sauvegarde du contexte
utilisateur - changement de mode d'excution - restitution du contexte utilisateur)

Compactage de la mmoire centrale

Le compactage de la mmoire centrale consiste dplacer les programmes en mmoire centrale de manire ne crer qu'une
seule et unique zone libre.

Dfaut de page

Le dfaut de page est un droutement qui oblige le processeur suspendre l'excution du programme en cours pour lancer une
entre/sortie qui charge la page manquante en mmoire centrale dans une case libre.

Degr de multiprogrammation

on dfinit le degr de multiprogrammation comme tant le nombre de processus prsents en mmoire centrale.

Ecroulement

On appelle Ecroulement, une haute activit de pagination. Un processus s'croule lorsqu'il passe plus de temps paginer qu'
s'excuter.

Exclusion mutuelle

La proprit d'exclusion mutuelle assure qu'une ressource critique ne peut jamais tre utilise par plus de un processus la fois.

File de messages (MSQ)

Une file de messages est un outil de communication entre processus Unix non ncessairement affilis placs sur une mme
machine qui implmente le concept de botes aux lettres. Une file de message ou MSQ est identifie par une cl.

Fragmentation

Allocations et dsallocations successives des programmes en mmoire centrale crent des trous, c'est--dire des zones libres de
taille insuffisante en mmoire centrale : la mmoire centrale est alors fragmente.

Interblocage

Un ensemble de n processus est dit en situation dinterblocage lorsque l'ensemble de ces n processus attend chacun une
ressource dj possde par un autre processus de l'ensemble. Dans une telle situation aucun processus ne peut poursuivre son
excution. L'attente des processus est infinie.

Inversion de priorits

L'inversion de priorit est la situation pour laquelle une tche de priorit intermdiaire (T3) s'excute la place d'une tche de
forte priorit (T1) parce que la tche de forte priorit (T1) est en attente d'une ressource acquise par une tche de plus faible
priorit (T2). A priori, on ne peut pas borner le temps d'attente de la tche de haute priorit qui risque ainsi de dpasser son
chance car l'excution de T3 n'tait pas prvisible.

Mode superviseur

Le mode superviseur est le mode d'excution du systme. C'est un mode d'excution privilgi qui autorise notamment l'appel
des instructions interdites en mode utilisateur (manipulation des interruptions). Ce mode assure la protection du systme
d'exploitation. Le passage du mode utilisateur vers le mode superviseur est soit provoqu par un appel systme, soit par une
trappe, soit par l'arrive d'une interruption

Nom symbolique

chaque adresse IP, correspond au nom symbolique form de caractres alphanumriques. La composition du nom
symbolique repose sur la notion de domaine. Le domaine correspond un groupe gographique (fr, jp) ou institutionnel (com ,
mil, edu). Le nom symbolique d'une machine est alors form de son nom suivi de l'ensemble des domaines auxquels elle
appartient, chaque lment tant spars par un point. Exemple : fermi.cnam.fr.

Ordonnancement

La fonction d'ordonnancement gre le partage du processeur entre les diffrents processus en attente pour s'excuter, c'est-dire entre les diffrents processus qui sont dans l'tat prt. L'opration d'lection consiste allouer le processeur un
processus.

Ordonnanceur

L'ordonnanceur est un programme systme dont le rle est d'allouer le processeur un processus prt.

Politique d'ordonnancement

La politique d'ordonnancement dtermine le choix d'un processus lire parmi tous ceux qui sont prts.

Port

Le port est un entier de 16 bits permettant dadresser une application sur la couche de protocole TCP/IP.

Premption

Selon si l'opration de rquisition du processeur est autorise ou non, l'ordonnancement sera qualifi d'ordonnancement
premptif ou non premptif : si l'ordonnancement est non premptif, la transition de l'tat lu vers l'tat prt est interdite : un
processus quitte le processeur si il a termin son excution ou si il se bloque. si l'ordonnancement est premptif, la transition de
l'tat lu vers l'tat prt est autorise : un processus quitte le processeur si il a termin son excution , si il se bloque ou si le
processeur est rquisitionn.

Primitive Accept

sock_service = accept (int sock_ecoute, struct sockaddr_in p_adr, int p_lgadr) : Acceptation de connexion sur la socket locale
d'coute avec la socket distante p_adr. En rsultante, cration de la socket de service sock_service.

Primitive Bind

int bind (int sock, sockaddr_in *p_adresse, int lg) : attchement de l'adresse p_adresse la socket sock

Primitive close

int close (int idf) : fermeture du descripteur idf.

Primitive Connect

int connect (int sock, struct sockaddr_in *p_adr, int lgadr) : demande d'tablissement de connexion avec la socket distante dont
l'adresse est *p_adr

Primitive EXIT

void exit (int valeur) : provoque la terminaison du processus appelant

Primitive FORK

pid_t fork (void) : permet la cration d'un processus Unix par duplication complte du crateur.

Primitive Listen

int listen (int sock, int nb) : cration de la file de connexions pendantes (n max) associe la socket d'coute sock

Primitive msgctl

int msgctl (int msgid, int op, struct msgid_ds *buf) : accs et modification des informations contenues dans la table des files de
messages gre par le systme int msgctl (msgid, IPC_RMID, NULL) : destruction de la file de message identifie par msgid.

Primitive msgget

int msgid = msgget (key_t cle, int option) : permet de crer une nouvelle file de messages ou de rcuprer une file de messages
existante.

Primitive msgrcv

int msgrcv (int msgid, struct message *buf, int lg, long montre, int option) : rception du message buf de taille lg octets dans la
MSQ d'identifiant msgid. Le paramtre montre spcifie le type de message extraire. Les options permettent de rendre la
rception non bloquante si la file ne contient pas de message avec le type attendu.

Primitive msgsnd

int msgsnd (int msgid, struct message *buf, int lg, int option) : envoi du message buf de taille lg octets dans la MSQ
d'identifiant msgid. Les options permettent de rendre l'envoi non bloquant si la file est pleine.

Primitive pipe

int pipe (int p[2]) : cration du tube p.

Primitive Read (rseau)

int read (int sock,char *msg, int lg) : lecture du message msg de taille lg octets sur la socket sock en mode connect

Primitive read (tube)

nb_lu = read (p[0], buf, nb) : lecture dans le tube p d'au plus nb caractres. Les caractres lus sont retourns dans le tampon
buf. nb_lu contient le nombre de caractres effectivement lus. Par dfaut, la lecture sur un tube vide est bloquante.

Primitive Recvfrom

int recvfrom (int sock, char *msg, int lg, int option, struct sockaddr_in *p_exp, int *lgexp) : rception d'un datagramme msg
envoy par *p_exp.

Primitive Sendto

int sendto (int sock, char *msg, int lg, int option, struct sockaddr_in *p_dest, int lgdest) : envoi d'un datagramme msg
*p_dest.

Primitive Socket

int socket (int domaine, int type, int protocole) : cration d'une socket de communication

Primitive WAIT

pid_t wait (int *status) : attente de la mort du fils

Primitive Write (rseau)

int write (int sock,char *msg, int lg) : criture du message msg de taille lg octets sur la socket sock en mode connect

Primitive write (tube)

nb_crit = write (p[1], buf, nb) : criture dans le tube p des nb caractres placs dans le tampon buf. nb_lu contient le nombre
de caractres effectivement crits.

Primitives EXEC

Ensemble de primitives (famille EXEC) permettant un processus de charger en mmoire, un nouveau code excutable : int
execl (const char *ref, const char *arg, ..., NULL) : ref est le chemin d'un excutable partir du rpertoire courant, const char
*arg, ..., NULL est la liste des arguments. int execlp (const char *ref, const char arg, ..., NULL) : ref est le chemin d'un
excutable partir de la variable d'environnement PATH, const char *arg, ..., NULL est la liste des arguments. int execv (const
char *ref, const char *arg[]) : ref est le chemin d'un excutable partir du rpertoire courant, const char *arg [] est un tableau
contenant les arguments. int execvp (const char *ref, const char *arg[]) : ref est le chemin d'un excutable partir de la
variable d'environnement PATH, const char *arg [] est un tableau contenant les arguments.

Processus

Un processus est un programme en cours d'excution auquel est associ un environnement processeur (CO, PSW, RSP,
registres gnraux) et un environnement mmoire appels contexte du processus. Un processus est l'instance dynamique d'un
programme et incarne le fil d'excution de celui-ci dans un espace d'adressage protg (objets propres : ensemble des
instructions et donnes accessibles) Un programme rentrant est un programme pour lequel il peut exister plusieurs processus
en mme temps

Processus lger

Un processus lger est un espace d'adressage dans lequel plusieurs fils d'excution peuvent voluer en parallle. Ces fils
d'excution sont chacun caractriss par une valeur de compteur ordinal propre et une pile d'excution prive.

Ressource

Une ressource dsigne toute entit dont a besoin un processus pour s'excuter. La ressource peut tre matrielle comme le
processeur ou en priphrique ou elle peut tre logicielle comme une variable. Une ressource est caractrise : Par un tat :
elle est libre ou occupe Par son nombre de points d'accs, c'est--dire le nombre de processus pouvant lutiliser en mme
temps.

Ressource critique

Une ressource critique est une ressource un seul point d'accs, c'est--dire accessible par un seul processus la fois.
L'utilisation s'effectue en exclusion mutuelle. L'allocation et la dsallocation d'une ressource critique peuvent tre gres
l'aide d'un smaphore R initialis 1. L'allocation se traduit alors par un P(R) et la restitution par un V(R).

Ressource critique

Une ressource critique est une ressource accessible par un seul processus la fois.

Section critique

Le code d'utilisation de la ressource critique s'appelle une section critique. La section critique doit offrir au moins une proprit
essentielle : celle de l'exclusion mutuelle c'est--dire assurer qu'effectivement elle ne sera jamais excute par plus d'un
processus la fois. Pour ce faire, la section critique est prcde par un prlude et suivie d'un postlude (le prlude et le
postlude sont du code) qui doivent assurer cette proprit d'exclusion mutuelle.

Serveur tats

Un serveur tat est un serveur qui conserve, sur un support non volatile, des informations sur les requtes en cours de
traitements. C'est un serveur mmoire qui en cas de panne, peut restaurer une partie de son tat au moment de la panne et
reprendre des requtes en cours.

Serveur itratif

Un serveur itratif est un serveur qui ne peut traiter qu'une seule requte client la fois. Il est compos d'un processus unique
qui effectue les oprations de rception de requtes, de traitement de requtes et d'mission des rponses.

Serveur parallle

Un serveur parallle est un serveur qui peut traiter plusieurs requtes client la fois. Il est compos d'un processus pre qui
effectue les oprations de rception de requtes et pour chaque requte reue, d'un processus fils qui effectue le traitement de la
requte et l'mission de la rponse.

Serveur sans tat

Un serveur sans tat est un serveur qui ne conserve aucune informations sur les requtes en cours de traitements. C'est un
serveur sans mmoire qui en cas de panne, repart " zro".

Systme d'exploitation

C'est un ensemble de programmes qui ralise l'interface entre le matriel de l'ordinateur et les utilisateurs. Il a deux objectifs
principaux : construction au-dessus du matriel d'une machine virtuelle plus facile d'emploi et plus conviviale prise en charge
de la gestion de plus en plus complexe des ressources et partage de celle-ci Comme son nom le suggre, le systme
dexploitation a en charge l'exploitation de la machine pour en faciliter l'accs, le partage et pour l'optimiser

Table des pages

La table des pages est une table contenant autant d'entres que de pages dans l'espace d'adressage d'un processus. Chaque
processus a sa propre table des pages. Chaque entre de la table est un couple < nde page, nde case physique dans laquelle la
page est charge >.

Table des segments

La table des segments est une table contenant autant d'entres que de segments dans l'espace d'adressage d'un processus.
Chaque entre de la table est un couple < nde segment, adresse d'implantation du segment >.

Tube anonyme

Un tube anonyme est un outil de communication unidirectionnel permettant de faire communiquer entre eux des processus de
mme filiation, ayant connaissance des descripteurs permettant l'accs au tube.

Ressources

Leons tlcharger

Slectionner une leon tlcharger :

Pas de leons actuellement

Annales d'examens

Slectionner une annale d'examen pour la tlcharger :

Pas d'annales actuellement

Schmas de synthse

Liens

Utilitaires

Slectionner un utilitaire pour le tlcharger :

Fates un choix

Schmas de synthse

Ordonnancement>Exercices dirigs

Prambule : rappel du format des primitives de la famille exec


Exercice 1

Exercice 2

Exercice 3
Processus shell :

Outils de communication centraliss entre processus>Exercices dirigs

Prambule : rappel du format des primitives permettant l'utilisation des tubes


Exercice 1

Exercice 2

Fonctionnement de la primitive DUP

La commande ps -e affiche les caractristiques de tous les processus. la destination naturelle des informations
est la sortie standard STDOUT. La commande wc -l compte les lignes de l'entre qui lui est fournie,
naturellement l'entre standard STDIN. Lors de la cration d'un processus, 3 fichiers d'entres sorties sont
automatiquement cres : l'entre standard STDIN (0), la sortie standard STDOUT(1) et la sortie d'erreur
STDERR (2). La primitive DUP (int dup(int desc)) associe le plus petit descripteur disponible du processus
appelant la mme entre dans la table des fichiers ouverts que le descripteur desc. Pour rediriger un
descripteur standard sur un descripteur de tube, il faut :

fermer le descripteur standard

faire un dup avec comme paramtre le descripteur du tube concern

fermer le descripteur du tube.

Allocation mmoire >Exercices dirigs

Prambule : rappel du format des primitives permettant l'utilisation des messages queues
Exercice 1

Exercice 2 On considre l'architecture logicielle suivante :

A - CLIENT

B- SERVEUR

C - Les contraintes :

il faut que les clients soient tous fils du serveur

il faut deux tubes anonymes par couple communiquant.

La difficult : Attendre les nombres n sur pip1 et pip12 Tirage alatoire Ecrire le rsultat dans pip2 ou pip22

L'opration de lecture sur un tube est une opration bloquante si le tube sur lequel elle est effectue est un tube
vide. A priori, on ne sait pas lequel des deux tubes sera prt en lecture en premier. Alors, on peut se mettre en
lecture sur pip1, tre bloqu alors que pip12 est prt.

Il existe deux solutions :

rendre la lecture non bloquante et effectuer une attente active sur les deux tubes.

s'endormir en attente d'un tube prt. Pour cela on utilise la primitive SELECT.

Utilisation de la primitive SELECT :

1/ On construit un ensemble de descripteurs en lecture sur lequel on souhaite se mettre en attente. ens_r =

{pip[0], pip12[0]}
Cette construction se fait l'aide des macros FD_ZERO(ens_r) - mise vide de l'ensemble - et
FD_SET(ens_r, element) - ajout de l'lment l'ensemble.
2/ On se met en attente sur ces descripteurs SELECT (ens_r, .)
3/ On sort du SELECT car un des descripteurs au moins est prt (le tube n'est plus vide et une lecture peut
tre faite sans risque d'tre bloqu). On teste chacun des descripteurs par le biais de la primitive
FD_ISSET FD_ISSET(pip1[0]) est vrai ou FD_ISSET(pip12[0]) est vrai.

A titre indicatif, voici le code C correspondant.

Mmoire virtuelle >Exercices dirigs

Exercice 1 : Gestion d'une mmoire par zones


Question 1
Une zone libre contient un en-tte de deux mots : mot1 : adresse de la zone libre suivante mot2 : taille de la
zone Les zones libres sont organises selon une liste chaine, repre par un pointeur de dbut :
adresse_premiere_zone.

Question 2
Algorithme First Fit : la premire zone de taille suffisante est slectionne. On choisit par ailleurs
d'implanter le programme en fin de zone libre de manire faciliter la gestion des pointeurs. gestion du
rsidu issu de l'allocation : soit a la taille de la zone rsiduelle, a = Ti - T o Ti est la taille de la zone et T la
taille du programme allouer. Deux cas sont possibles en fonction de e, la taille minimale de zone
autorise. 1/ a < e, la zone rsiduelle est juge ngligeable et elle est alors supprime de la liste des zones
libres ( modification du chainage des zones libres). a e, la zone rsiduelle est conserve (modification
de la taille de la zone libre). D'o l'algorithme suivant avec parcours, avant : pointeurs sur zone libre A :
adresse d'implantation du programme de taille T hors cas particulier sur le chainage (zone libre en tte et
fin de liste).

Parcours := premiere_zone_libre; avant := premiere_zone_libre; trouve = faux; tant que (parcours <> NULL
et trouve = faux) faire si (parcours.taille >= T) alors

on a trouv une zone de taille suffisante parcours.taille = parcours.taille - T; A := parcours +

parcours.taille; trouve = vrai; si (parcours.taille < e)

on libre la zone libre rsiduelle avant.suivant = parcours.suivant; fsi avant = parcours; parcours =
parcours.suivant; fait

Question 3
parcours = adresse_premiere_zone; avant = adresse_premiere_zone; taille_mem = max; trouve = faux;

tant que (parcours <> NULL) faire si (T <= parcours.taille < taille_mem) alors

on retient la zone zone_trouve = parcours; taille_mem = parcours.taille; zone_avant = avant; trouve


= vrai; fsi avant = parcours; parcours = parcours.suivant; fait

la sortie de la boucle zone_trouve contient l'adresse de la zone dont la taille engendre la plus petit
residu sauf si trouve = faux si (trouve == vrai) alors zone_trouve.taille = zone_trouve.taille - T; A =
zone_trouve + zone_trouve.taille; si (zone_trouve.taille < e)

on libre la zone libre rsiduelle zone_avant.suivant = zone_trouve.suivant; fsi fsi

Question 4
Il y a deux espaces libres : la zone (1700K-2000K) et la zone (2300K-2560K) soit un total de 560K ce qui
est suprieur la taille de P5. Mais ces deux zones ne sont pas contigus et on ne peut donc pas allouer
l'espace mmoire P5. Il faut donc compacter l'espace mmoire pour arriver la configuration

Question 5 Une zone libre doit tre fusionne sa voisine si celle-ci est galement une zone libre :
diffrents acas doivent tre considrs.

Cas 1 : la zone libre est elle-mme prcde d'une zone libre ZL : on effectue une fusion et on
modifie la taille de ZL : ZL.taille = ZL.taille + zoneliberee.taille;

Cas 2 : la zone libre est cerne par deux zones occupes : on cre une nouvelle zone libre

Cas 3 : la zone libre est suivie par une zone libre : on fusionne les deux zones (on ajoute les
tailles des deux zones) et on modifie le chainage des zones libres. les infos de gestion (taille et
suivant) sont "remontes" dans les deux premiers mots de la zone libre.

Cas 4 : la zone libre est cerne par deux zones libres A et C : on fusionne les trois zones libres.
c'est--dire : la zone libre C est supprime du chainage et les infos de gestion sont remontes dans
les deux premiers mots de la zone A.

Exercice 2 : Pagination
Question 1
Dcrivez le format d'une entre de la table des pages d'un processus .

bit V : indique si la page est prse,nte ou non en mmoire centrale V= 0, page non prsente bit M : indique
si la page a t modifie bit A : champ pour les informations la apge (algorithmes de remplacement de
pages) protec : champ de protection pour les accs en lecture/criture/excution adresse relle : adresse
de la case contenant la page.
Question 2
adresse_reelle et adresse_virtuelle sont fde type adresse, ce type est form de deux champs : champ1 et
champ2 instruction est de type type_instruction qui peut prendre pour valeurs : lecture, criture et
excution.

procedure dcodage (adresse_relle : adresse, adresse_virtuelle : adresse, instruction : type_instruction)


debut A = table_des_pages(adresse_virtuelle.page); si (A.V ==0) alors rveil du processus de dfaut de
page : chargement de la page et mise jour de la table des pages fsi Verifier_droits_accs (instruction, A.
protec); A.A = 1; - on positionne l'accs la page si (instruction == criture) alors A.M = 1; fsi
adresse_reelle.champ1 = A.adresse_reelle; adresse_reelle.depl = adresse_virtuelle.depl; fin
Question 3
Soit la liste des pages virtuelles rfrences aux instants t = 1, 2,..., 11 3 5 6 8 3 9 6 12 3 6 10

Question 4
question de cours
Question 5

Synchronisation entre processus>Exercices dirigs

Exercice 1

Question 1

On identifie un schma producteur/consommateur sur chacun des tampon. On utilise pour chacun de ces
schma un couple de smaphores : MVIDE initialis M et MPLEIN initialis 0 (tampon requte) NVIDE
initialis N et NPLEIN initialis 0 (tampon avis)

Question 2

Il faut maintenant grer les accs concurrents aux tampons avis et requte. En effet :

les diffrents processus Acquisition se partagent l'index i

les diffrents processus excution se partagent l'index j et k

les diffrents processus Impression se partagent l'index k les variables i, j, k, l sont maintenant
globales et les accs ces variables doivent se faire en exclusion mutuelle. On ajoute donc quatre
smaphores d'exclusion mutuelle initailiss 1 (un smaphore par index).

remarque : l'ordre d'appel des smaphores d'exclusion mutuelle par rapport ceux du schma producteur
consommateur n' pas d'importance.
Exercice 2
Question 1
Lorsque l'employ saisit une commande, l'criture sur disque d'une ligne la fois, implique que, un
instant donn, le disque ne contient qu'une partie de la commande. Si le processus de facturation est lanc,
il ne trouvera pas toutes les lignes de la commande pour diter la facture, qui sera donc partielle. Au
moment o on cre une commande, il faut donc interdire au processus de facturation d'accder aux

commandes.

Par ailleurs, l'employ dite les commandes saisies sur la mme imprimante que le processus de
facturation. Ces ditions se font ligne par ligne, mais toutes les lignes concernant le mme bon de
commande ou la mme facture doivent se trouver regroupes, et non entremles. Il faut donc que
l'imprimante soit en exclusion mutuelle entre les deux processus.
Question 2 - question 3
La solution propose garantit bien l'accs en exclusion mutuelle l'imprimante par les deux processus. Le
processus de facturation rserve l'imprimante pendant le traitement des factures d'une priode. Ces
factures seront donc bien dites de manire conscutive. Par ailleurs, comme le processus rserve
galement le fichier des commandes, aucune commande ne peut tre en cours de saisie pendant l'dition
des factures.
Question 4
L' interblocage est une situation o un ensemble de processus sont bloqus en attente d'une ressource
possde par un autre processus de l'ensemble. Chacun attend qu'un autre veuille bien librer la ressource
qu'il attend. Ceci ne peut se faire sans une intervention extrieure, puisqu'ils sont tous bloqus. Or on ne
peut dbloquer un processus qu'en lui donnant toutes les ressources ncessaires, et donc en
rquisitionnant celle qu'il attend et qui est possde par un autre processus de l'ensemble.

Dans la solution propose, on peut imaginer que le processus employ rserve le fichier COM et
commence saisir la commande. A ce moment le processus de facturation est activ, et rserve
l'imprimante, puis se bloque en attente du fichier COM. Lorsque l'employ a termin la saisie, il rserve
l'imprimante, mais comme celle-ci est dj rserve par le processus de facturation, il se bloque en attente
de la libration. Nous avons alors deux processus qui attendent mutuellement la libration d'une ressource
possde par un autre processus de l'ensemble : ces deux processus sont en interblocage.
Question 5
Pour ne plus avoir d'interblocage, une des solutions est de rserver les ressources dans le mme ordre,
puisque, dans ce cas, il ne peut plus y avoir de circularit dans les attentes de ressources. Dans le
processus de facturation, il faut donc rserver le fichier COM en premier.

Exercice 3

Question 1
Deux processus P1 et P2 excutent chacun de leur ct, la mme opration CredDeb_Compte(10,
Crediter,100). le droulement de ces oprations peut tre le suivant. le solde final sera finalement de 1100
la place de 1200.

Question 2
Il suffit de placer l'excution de la procdure CredDeb_Compte en exclusion mutuelle, soit avec ACCES
smaphore initialis 1 :

Question 3
Cette fois, il faut mettre en place un schma lecteurs/rdacteurs. La procdure CredDeb_Compte reste
comme en Q2. La procdure Donner_Solde devient :

Exercice 4
Lors de l'utilisation d'une ressource critique par une tche, il est habituel d'ajouter aux paramtres de
description de la tche ceux supplmentaires suivant :

Cia : squence d'instructions prcdant l'appel de la ressource,

Cib : squence d'instruction de la section critique ,

Cig : squence d'instruction suivant la libration de la ressource avec Ci = Cia + Cib + Cig.

Toute tche en cours d'utilisation d'une ressource critique peut tre prempte par une tche plus prioritaire
qu'elle, et qui n'a pas besoin de cette ressource. On considre l'exemple d'une configuration de trois tches
priodiques. Les tches Tp1 et Tp3.

Question 1
Comme le montre la figure, l'instant t=8, la tche 3 est bloque par la tche 2 parce qu'elle est plus
prioritaire qu'elle. Mais comme la tche 1 est en attente de la ressource critique (occupe par la tche 3)
depuis l'instant t=7, on observe donc que la tche 2 est excute avant la tche 1 : c'est le phnomne
d'inversion de priorit.

Question 2
Pour viter ce problme d'inversion de priorit, l'instant t=7, lorsque la tche 1 se met en attente de la
ressource occupe par la tche 3, la tche 3 prend la priorit de la tche 1. Par consquent, l'instant t=8,
la tche 3 est plus prioritaire que la tche 2 et continue s'excuter. L'excution de la tche 2 se trouve
ainsi repousse l'instant t=10 aprs la tche 1 (cf. figure 3.15).

Communication inter processus sur le rseau>Exercices dirigs

Exercice 1 : COMPARAISON DES POLITIOUES DE GESTION DU DISQUE Question 1


question de cours Question 2
On considre un disque compos de 300 pistes numrotes de 0 299. Le bras est couramment
positionne sur la piste 50.
La liste des requtes (nde piste cherche) servir donne selon l'ordre d'arrive est la suivante :
62, 200, 150, 60, 12, 120, 250, 45, 10, 100

FCFS
Ordre de service : 62, 200, 150, 60, 12, 120, 250, 45, 10, 100
Dplacement du bras : 12 + 138 + 50 + 90 + 48 + 108 + 130 + 205 + 35 + 90 = 906

SSTF
Ordre de service : 45, 60, 62, 100, 120, 150, 200, 250, 12, 10
Dplacement du bras : 5 + 15 + 2 + 38 + 20 + 30 + 50 + 50 + 238 + 2 = 450

SCAN montant
Ordre de service : 60, 62, 100, 120, 150, 200, 250, 10, 12, 45
Dplacement du bras : 15 + 2 + 38 + 20 + 30 + 50 + 50 + 240 + 2 + 38 = 485
Exercice 2 : GESTION DE FICHIERS UNIX
Un processus lit squentiellement un fichier de 8 Mo, raison de 256 octets la fois. On suppose que les
blocs disque sont de 1024 octets et qu'un numro de bloc occupe 4 octets. par ailleurs, le temps d'accs
moyen au disque est de 40 ms.

Le dessin joint montre l'allocation des blocs.


1/ Rappelez la structure d'une inode et d'un fichier Unix question de cours
2/ Le systme ne gre pas de mcanisme de buffer cache. lecture des 10 premiers blocs : 4 * 10 accs
disque lecture des 256 blocs suivants (niveau d'indirection 1) : on a deux accs disque par lecture 8 *
256 accs disque

lecture des 7926 blocs restants (niveau d'indirection 2) : on a trois accs disque par

lecture 12 * 7926 accs disque

soit un total de 97200 accs disque et une dure moyenne de lecture

gale 3888 s.
3/ Le systme gre un mcanisme de buffer cache
3.a/ question de cours

3.b/ on a un accs disque par blocs de donnes (lors de la lecture des 256 premiers octets du bloc). on a
un total de 33 blocs d'adresse lire. soit un nombre d'accs disque gal 8192 + 33 = 9224

et un

temps moyen de lecture gal seulement 329 s !!!!


3.c/ avantage : on conomise les accs disque, inconvnient : risque de perte de donnes si plantage de la
machine. l'appel SYNC force le vidage du cache sur le disque.
Exercice 3
On considre un systme de gestion de fichiers qui fait de l'allocation par zone. L'ensemble du disque est
constitu de 100 blocs, numrots de 0 99. Trois fichiers existent sur le disque, dfinis comme suit, le
reste de l'espace tant libre.
F1, Dbut = bloc5, Taille=20blocs,
F2, Dbut = bloc 25, Taille 5 blocs,
F3, Dbut = bloc 50, Taille 10 blocs.
Question 1
Si l'implantation est squentielle simple, un fichier ne peut avoir qu'une seule zone. Or le fichier FI se
termine sur le bloc 24 et F2 commence en 25. Il n'y a donc pas d'espace libre permettant de le rallonger
sans le dplacer. En gnral, comme le cot d'un tel dplacement est important, il n'est pas fait
automatiquement. Cependant, tudions cette possibilit. Il faut alors trouver un espace contigu de 30 blocs
(20 + 10), ce qui peut se faire en 60, derrire F3. Le dplacement lui-mme demande la lecture du fichier et
sa rcriture dans la nouvelle zone.
Si l'implantation est squentielle avec extensions, il faut trouver un espace libre de 10 blocs conscutifs
correspondant une nouvelle zone, puisqu'il n'est pas possible de prolonger la premire. On peut allouer
en 30, derrire F2, en 40 devant F3, en 60 derrire F3 ou en 90 la fin. Il est cependant prfrable de
garder intacte la plus grande zone pour satisfaire des besoins ultrieurs importants. Allouer derrire F2
empchera ce dernier de s'tendre par prolongement, mais allouer devant F3 empchera FI d'tendre
ventuellement sa deuxime zone, et l'obligera recevoir une troisime zone.
Enfin, on peut noter que les accs l'intrieur de FI risquent d'tre plus perfon-nant si les zones sont les
plus proches possibles, ce qui milite pour une allocation en 30.
Question 2
Il faut trouver une zone de 10 blocs libre. Elle peut tre soit entre 30 et 49, soit entre 60 et 99. Le
raisonnement ci-dessus indique une prfrence pour la portion 30..49, de faon conserver la plus grande
portion intacte. Le choix est assez indiffrent, mme en cas d'implantation squentielle simple, car il faut
choisir lequel de F2 ou de F4 sera autoris ventuellement s'tendre sur 10 blocs.
Question 3
Il faut trouver cette fois une zone de 40 blocs, ce qui ne peut se faire qu'entre 60 et 99. Notons que si on a
une implantation squentielle avec extensions, il est envisageable de morceler le fichier F4 en plusieurs
zones, ce qui n'est pas possible dans le cas de l'implantation squentielle simple.
Cependant, le gain immdiat est nul, et, au contraire, les accs au fichier F4 seront pnaliss dans ce cas,

et le gain hypothtique venir est non prvisible au moment de la cration de F4.

Programmation socket>Exercices dirigs

Exercice 1:
Cration et attchement d'une socket : Rappels de cours sur les primitives socket et bind.
Exercice 2:
Communication en mode datagramme ou en mode connect On considre l'application clients-serveur
rpartie suivante : le serveur gre une table annuaire de couple (nom_de_personne, numero_telephone).
Des clients interrogent le serveur en lui transmettant un nom_de_personne. Le serveur rpond en envoyant
au client le couple correspondant (nom_de_personne, numero_telephone) si il a t trouv dans le table,
sinon le message "usager inconnu".

2.a/ On a joint les codes C correspondants : udp_client et udp_serveur (annuaire.c). S'en inspirer pour le
pseudo-code.

2.b/ On a joint les codes C correspondants : tcp_client, tcp_serveur iteratif. S'en inspirer pour le pseudocode

2.c/ On a joint les codes C correspondants : tcp_client, tcp_ serveur parallle . S'en inspirer pour le pseudocode

2.d/ Donnez le pseudo-code du serveur code joint serveur de scrutation. A votre avis, faut-il protgez
l'accs la table de l'annuaire par un schma de synchronisation ? Si les services serveur sont itratifs, on
peut mettre en place une exclusion mutuelle pour protger un accs en lecture vis vis d'un accs en
criture (mais ce n'est pas obligatoire) Si les services serveur sont parallles, on doit mettre en place une
exclusion mutuelle pour protger un accs en criture vis vis d'un autre accs en criture.
Exercice 3:
Le dmon INETD
3.a/ Quel est le rle du dmon Inetd ? question de cours

3.b/ Ecrivez le pseudo-code de ce dmon

Vous aimerez peut-être aussi