Vous êtes sur la page 1sur 12

CHAPITRE II.

CONCEPTS DE BASE DES SYSTEMES D’EXPLOITATION

I. Introduction

Un système informatique typique est constitué d’un ou plusieurs processeurs, une mémoire de travail, un
ensemble des périphériques et un moniteur qui s’occupe de gérer tous ces composants, en vue de réaliser une
ou plusieurs activités. La tâche du programmeur doit être difficile étant donné la complexité du système, mais
aussi quant au besoin de développer des applications performantes et efficaces. Dans ce cas, le système
informatique doit être équipé d’une plateforme logicielle connue par le système d’exploitation dont le but est de
dispenser le programmeur d’interagir directement avec la structure physique du système et de s’occuper, en soi,
de coordonner le fonctionnement de ces différents composants.
Un système d’exploitation est défini comme un ensemble de programmes qui coopèrent à la gestion des
ressources d’un ordinateur et fournit aux utilisateurs une machine virtuelle.

II. Structure d’un système informatique

Un système informatique muni d’un système d’exploitation peut être vu comme une structure hiérarchique à
plusieurs niveaux d’abstractions. On distingue :

 La machine physique qui représente la structure matérielle du système. Elle est organisée autour des
composants électroniques discrets ou intégrés.
 Le niveau de microarchitecture, dans lequel la structure matérielle peut être vue comme des unités
fonctionnelles telles que les registres, l’UAL.
 Dans le niveau langage machine, le système est plutôt défini par son comportement. Ceci est représenté
par des séquences de bits qui consistent à contrôler le mouvement de données entre les unités
fonctionnelles de la microarchitecture du système. Un outil pour faciliter la tâche du programmeur afin
introduire ces séquences de bits est le jeu d’instructions.
 Dans le niveau système d’exploitation, le système informatique est vu comme une machine virtuelle.
Le programmeur à la possibilité de contrôler son comportement par des instructions abstraites et sans
avoir à maitriser les mouvements de données entre les unités fonctionnelles du système. Le système
d’exploitation doit, entre autres, assurer la gestion efficace des ressources du système vu qu’il peut y
avoir plusieurs applications demandant simultanément l’accès à une ressource en particulier le
processeur.
 Le système d’exploitation est souvent équipé d’une couche logicielle plus évoluée qui regroupe les
différents outils ou les programmes système dont le programmeur a besoin pour avoir accès aux
services du système d’exploitation, tels que le compilateur et le shell. Par contre au système
d’exploitation qui fonctionne en mode superviseur ou protégé, ces outils sont modifiables par le
programmeur.
 Le niveau application comprend les programmes utilisateur qui constituent les activités proprement dites
réalisées par le système informatique.

Systèmes temps réel / Ing3 SE/AII 1


Chapitre 2 : Concepts de base des systèmes d’exploitation

Figure 2.1 : Structure d’un système informatique

III. Les types des systèmes d’exploitation

 Systèmes monoprocesseurs : qui gèrent une seule tâche à la fois. Ex. DOS, Batch.
 Systèmes multiprocesseurs : qui gèrent plusieurs tâches rangées en mémoire. Lorsqu’une tâche n’est
pas en mesure de s’exécuter, le système donne la main à une autre tâche. Ex. Windows, Unix.
 Systèmes à temps partagé : dans ce type, le CPU bascule très rapidement d’un processus à l’autre. Ceci
permet l’exécution quasi simultanée de l’ensemble des processus.
 Systèmes temps réel : ces systèmes sont caractérisés par le respect des contraintes temporelles. Ex.
QNX, VxWorks.
 Systèmes distribués : ces systèmes peuvent être partagés par plusieurs machines qui coopèrent dans
le cadre de la même tâche.
IV. Principales fonctions d’un système d’exploitation

 Gestion des processus : un processus est un programme (ensemble d’instructions) en cours d’exécution
auquel sont associés : un code, des données et un ensemble des ressources allouées. Plusieurs
processus peuvent exister simultanément en mémoire. Le système d’exploitation doit être en mesure de
proposer pour chacun d’entre eux un environnement virtuel dans lequel il peut s’exécuter en toute
sécurité.
 Gestion de la mémoire : le système d’exploitation doit gérer l’allocation de la mémoire aux processus et
contrôler physiquement des emplacements de mémoire auxquels un processus peut accéder.
 Gestion des E/S : l’ordinateur échange des informations à travers les périphériques E/S avec le monde
extérieur. Les différents processus accèdent à un périphérique e à travers le système d’exploitation qui
a pour rôle de gérer le partage de celui-ci entre ces processus.
 Gestion des fichiers : le système d’exploitation doit fournir un ensemble des primitives qui permettent la
création, l’enregistrement, le déplacement et la suppression des fichiers ainsi que les répertoires.
V. Organisation du noyau

La partie essentielle du système d’exploitation est le noyau ou l’exécutif. L’ensemble des applications système
ont pour intérêt de simplifier le développement des applications utilisateur et de rendre facile l’exploitation des
services de noyau. Quelques SE, plus particulièrement ceux dédiés aux applications embarquées et de contrôle
industriel sont ainsi proposés sans couche logicielle pour les applications système. Le noyau est organisé autour
des éléments suivant : le secteur de démarrage, l’ordonnanceur, les objets fondamentaux et les services.

Systèmes temps réel / Ing3 SE/AII 2


Chapitre 2 : Concepts de base des systèmes d’exploitation

V.1. Le secteur de démarrage (bootstrap program) : c’est le premier logiciel à exécuter lors d’une mise ou
remise sous tension de l’ordinateur. Il consiste en l’initialisation de tous les aspects du système d’exploitation en
allant du contenu des registres processeurs et des périphériques en passant par les différents variables et
pointeurs du système jusqu’au chargement des différents services du noyau ainsi que les tâches de
fonctionnement de base.
V.2. L’ordonnanceur : est un module logiciel chargé de gérer l’allocation du microprocesseur au
compte d’une tâche. Il fournit l’ensemble des algorithmes nécessaires pour déterminer qu’elle est la tâche à
exécuter et à quel moment. L’ordonnanceur tient aussi le rôle de gestion de la commutation entre les tâches en
effectuant les mesures nécessaires à sauvegarder le contexte de la tâche en cours et récupérer celui de la tâche
à exécuter. Il intervient de façon périodique par des interruptions de l’horloge temps réel. Ou apériodique par
des évènements extérieurs des appels aux services système.
V.3. Les services du système : en vue de développer des applications, il s’agit d’un ensemble des outils
(fonctions, procédures…) mis à la disposition du programmeur pour manipuler les objets du noyau, gérer la base
de temps du système, les E/S, la mémoire et les interruptions. Les services du système réalisent une interface
entre le programmeur et le noyau.
V.4. Les objets : sont des éléments spéciaux qui représentent les ingrédients d’une application. Cette
dernière est communément construite autour d’un ensemble des tâches. Une tâche a besoin d’un ensemble des
ressources pour son exécution. Plusieurs tâches peuvent demander la même ressource. Cela nécessite des
mécanismes de synchronisation pour gérer l’accès concurrent à une ressource. Par ailleurs, les tâches peuvent
échanger des données entre elles. À cet effet, le noyau doit disposer des mécanismes de communication entre
tâches.
VI. Les tâches et les ressources

 Les tâches sont des files d’exécutions indépendantes qui concurrencent entre eux pour réaliser une
application. De point de vue du programmeur, il s’agit d’un ensemble d’instructions qui s’exécutent en série au
sein d’une boucle infinie. De la part du noyau, une tâche est définie par un ensemble de paramètre et structures
de donnée dont l’ordonnanceur a besoin. On peut citer : le nom de la tâche, le numéro d’identification, la priorité,
l’état, les ressources utilisées, le descripteur de la tâche (TCB : Task Control Bloc), la pile et biens entendu son
code de la tâche (figure 2.2). Ces informations forment l’objet de la tâche. Le rôle de la pile apparait en cas
d’appels de fonctions, des branchements, passage d’arguments… A l’instar de la pile, le TCB est une structure
de données rangée en mémoire et qui regroupe tous les paramètres relatifs à la tâche et son exécution (pointeur
de pile, compteur de délai, sémaphores…)
Dès le démarrage, le noyau crée ses propres tâches qui possèdent des niveaux de priorité bien
déterminés. Ces tâches rentrent dans le cadre du fonctionnement de base du système et dont l’altération peut
conduire à une dégradation de performance du système ou des erreurs de fonctionnement. Parmi ces tâches
on trouve : la tâche de fond qui possède une basse priorité et la tâche de gestion des exceptions qui a une haute
priorité.

Systèmes temps réel / Ing3 SE/AII 3


Chapitre 2 : Concepts de base des systèmes d’exploitation

Figure 2.2 : Organisation d’une tâche.

Après avoir créé et initialisé ses propres tâches, le noyau procède à la création des tâches d’application
suite à la demande du programmeur, avant d’enclencher l’exécution de l’ordonnanceur. À cet effet, le
programmeur doit spécifier quelque paramètre, relatif aux tâches à créer, tels que le nom, la priorité et la taille
de la pile. D’autres paramètres vont être attribués par le noyau lors de la création, tels que le TCB et
l’emplacement mémoire.
À chaque tâche est associé un état qui peut changer au cours du temps. En effet, une tâche peut être
vue comme une machine à état fini tel que le décrit la figure 2.3. Les différents états d’une tâche sont :

 Actif (Running) : la tâche est en cours d’exécution.


 Prêt (Ready) : la tâche attend la disponibilité du processeur.
 Bloqué (Blocked) : la tâche attend la disponibilité d’une ressource, d’une échéance ou d’un
évènement.
À ces trois états, il possible d’ajouter les états : non créée et détruite qui font référence à des tâches non
reconnues par l’ordonnanceur et l’état suspendu qui peut avoir lieu en cas de débogage. Par ailleurs, quelques
systèmes d’exploitation adoptent plus de granularité plus particulièrement sur l’état bloqué, on peut trouver les
sous-états : différé, en attente.
Lors de sa création, toutes les tâches sont à l’état actif. C’est l’ordonnanceur qui décide par la suite l’état
de chacune.
Outre la création, le noyau fournit une panoplie des services pour la gestion des tâches. On trouve dans
la majorité des cas les services de : changement de priorité, destruction, suspension, mise en attente, reprise,
recréation et l’autorisation et l’inhibition de la préemption. On trouve également des services envoyant des
informations sur les tâches tels que la priorité et le numéro d’identification.

Systèmes temps réel / Ing3 SE/AII 4


Chapitre 2 : Concepts de base des systèmes d’exploitation

Figure 2.3 : Les états d’une tâche.

 Une ressource est un objet nécessaire à une tâche pour quelle puisse s’exécuter. On distingue des ressources
matérielles ou physiques : espace mémoire, un afficheur LCD, un temporisateur…, et des ressources logicielles :
registre, variable, structure de données, une fonction quelconque…
Selon le mode d’utilisation des ressources, on distingue :
 Des ressources locales : ne sont utilisables que par la tâche ou elles ont été déclarées (des variables
locales par ex.). Leur usage disparait du système dès que la tâche est détruite.
 Des ressources partageables : peuvent être utilisées simultanément par plusieurs tâches. Une fonction
réentrante est un exemple de ce type des ressources.
 Des ressources critiques : sont des ressources partageables, mais accessibles uniquement par une seule
tâche. Elles reviennent disponibles lorsque la tâche les libère.
Lorsque plusieurs tâches souhaitent obtenir une ressource, elles rentrent en compétition. On dit qu’il y a
concurrence. Le problème d’allocation de cette ressource est réglé par l’ordonnanceur lorsqu’il s’agit du
processeur. Autrement, les mécanismes de synchronisation qui s’en occupent.

VII. Les mécanismes de synchronisation


Les mécanismes de synchronisation ont pour but de résoudre les problèmes liés à la gestion des ressources
d’une application (l’exclusion mutuelle, producteur et consommateur et la limitation des ressources) et de réaliser
les relations temporelles associées à un système des tâches. Autrement dit : la synchronisation des ressources
et la synchronisation des tâches.
VII.1. Synchronisation des ressources
La façon la plus naturelle de contrôler l’accès concurrent à une ressource critique est l’exclusion mutuelle. Les
portions de code dans lesquelles cette ressource est demandée sont connues par les sections critiques de
l’application. Si une tâche utilise une ressource critique, toutes les tâches qui se trouvent dans leurs sections
critiques sont exclues de cette activité (figure 2.4).

Systèmes temps réel / Ing3 SE/AII 5


Chapitre 2 : Concepts de base des systèmes d’exploitation

Figure 2.4 : Exclusion mutuelle entre deux tâches.

Afin de permettre une coopération cohérente entre les tâches partageant une ressource critique ainsi qu’une
utilisation plus efficace de cette dernière, l’emploi d’un tel ou tel mécanisme doit tenir compte des contraintes
suivantes :

 Plusieurs tâches ne peuvent être se trouvent simultanément dans la même section critique.
 L’exclusion mutuelle doit être indépendante du nombre des tâches et leur temps d’exécution.
 Seules les tâches qui vérifient une condition de concurrence qui sont concernées par l’exclusion
mutuelle.
 Une tâche ne doit pas être bloquée longtemps en raison d’exclusion mutuelle.
Parmi les solutions proposées, on peut citer :
 Emploi d’une variable booléenne comme verrou. Celle-ci doit être testée afin d’empêcher l’entrée
simultanée à la même critique. Des dérivés de ce mécanisme : Dekker, Peterson…
 Masquage des interruptions afin d’empêcher le blocage d’une tâche qui se trouve dans sa section critique
ou profit d’une autre.
 Verrouillage de la préemption, ce qui revient à suspendre le fonctionnement de l’ordonnanceur durant
l’exécution d’une section critique.
 La mise en place des objets dédiés à la synchronisation tels que les sémaphores et les signaux.
VII.2. Synchronisation des tâches
Dans une application multitâche, quelques tâches doivent parfois synchroniser son activité avec d’autres tâches.
Cette notion apparait dans les trois cas suivants :

 On peut trouver des tâches qui produisent des informations et d’autres qui sont spécialisées dans le
traitement de ces informations. En effet, les tâches en attente d’information doivent être prévenues
de la disponibilité de ces informations.
 Il arrive que l’activité d’une tâche dépende d’une autre. La première ne peut être exécutée ou continuer
son exécution tant que la deuxième n’arrive pas à un certain point d’exécution.
 Dans le calcul itératif où certaines opérations nécessitent d’être subdivisées en plusieurs tâches. Au
début de chaque itération, toutes les tâches doivent terminer leurs activités du fait qu’il peut y avoir
des informations à changer entre elles.

Systèmes temps réel / Ing3 SE/AII 6


Chapitre 2 : Concepts de base des systèmes d’exploitation

A l’instar des ressources, les tâches font appel à des mécanismes de synchronisation tels que les signaux,
les rendez-vous et bien entendu les sémaphores.
VII.3. Emploi des sémaphores
Un sémaphore est un objet de noyau proposé par Dijkstra en 65 pour gérer l’exclusion mutuelle sur une
ressource critique. Par la suite, cet objet a été employé avec les ressources partageables et aussi pour la
synchronisation des tâches. Tout comme les tâches, un sémaphore doit être créé et initialisé et possède ces
propre paramètres. Certains d’eux sont attribués par le programmeur lors de demande de création, tels que le
nom, le nombre maximum de points d’accès et la liste des tâches utilisant ce sémaphore. D’autres paramètres
sont procurés au noyau, tels que le numéro d’identification et le descripteur de sémaphore (SCB : Semaphore
Control Block) et la file d’attente des tâches (figure 2.5).

Figure 2.5 : Structure d’un sémaphore.

A chaque ressource partageable ou critique doit être associé un sémaphore dont le nombre de points d’accès
peut être initialisé au nombre maximum des tâches pouvant simultanément utiliser cette ressource. Dans le cas
d’une ressource critique, ce nombre est initialisé à 1 ou à 0. Il s’agit donc d’un sémaphore binaire. Dans le cas
d’une ressource partageable entre N tâches, il est obligatoirement initialisé à N. Il s’agit d’un sémaphore à
compte. Le nombre des points d’accès se diminue à chaque demande de la ressource et s’augmente à chaque
restitution de celle-ci, mais ne doit pas dépasser la valeur initiale. Certaines ressources sont partageables par
un nombre illimité des tâches. Il est possible dans ce cas d’initialiser le nombre de points d’accès à n’importe
quelle valeur. Cette dernière peut être augmentée ou diminuée à tort et à travers dans le code de l’application
multitâche.
Le système d’exploitation offre un ensemble des services pour manipuler les sémaphores. On trouve
communément :

 Les services de création et de destruction des sémaphores ;


 Les services de gestion d’accès à une ressource associée à un sémaphore (demande et restitution
de la ressource) ;
 Services de renseignement des paramètres d’un sémaphore.
 Les sémaphores pour la gestion d’accès aux ressources critiques et partagées
Pour gérer l’exclusion mutuelle sur une ressource critique, un sémaphore binaire doit être initialisé à 1, afin de
rendre disponible la ressource associée à ce sémaphore. Une tâche souhaitant obtenir cette ressource doit
s’adresser à l’ordonnanceur qui s’occupe de tester le compteur des points d’accès. S’il est égal à 0, la ressource
est déjà allouée à une autre tâche et la tâche demandant est placée dans la file d’attente associée au
Systèmes temps réel / Ing3 SE/AII 7
Chapitre 2 : Concepts de base des systèmes d’exploitation

sémaphore ; Autrement, l’ordonnanceur décrémente le compteur pour donner l’octroi de cette ressource à la
tâche demandant et empêcher d’autres tâches d’y avoir accès. Une tâche voulant restituer une ressource doit
s’adresser à l’ordonnanceur pour incrémenter le compteur du sémaphore et allouer cette ressource à une autre
tâche dans la file d’attente, s’il y en a lieu. Un exemple avec deux tâches est illustré en figure 2.6.

Figure 2.6 : Gestion d’exclusion mutuelle sur une ressource critique par un sémaphore binaire.

Le principe est similaire pour la gestion d’une ressource partagée par N tâches. A cet effet, un sémaphore à
compte initialisé à N est nécessaire. A chaque demande de la ressource, le compteur des points d’accès est
décrémenté et à chaque restitution, le compteur est incrémenté. A un moment donné, la valeur ce compteur fait
référence au nombre des tâches pouvant accéder à la ressource protégée.
La demande et la restitution d’une ressource sont assurées par des services système qui sont appelés à
l’intérieur d’une tâche, indiquant ainsi le début et la fin de son secteur critique.
Remarques :

 Une ressource accessible par une et une seule tâche ne réclame aucun mécanisme de protection.
 Les critères de sélection de la tâche à activer, parmi celles qui sont en attente de la disponibilité d’une
ressource, sont divers : l’ordre de demande (FIFO), la priorité, l’échéance….
 Les sémaphores pour la synchronisation des tâches
Bien que le rôle premier des sémaphores soit la protection des ressources, il s’avère qu’ils peuvent être bien
exploités pour une bonne synchronisation des tâches, plutôt que les signaux d’évènements et les rendez-vous.
La synchronisation d’exécution de deux tâches fait appel à un sémaphore binaire initialisé à 0. La tâches qui
a besoin de synchroniser son activité avec l’autre tâche s’exécute en premier, mais à un certain point et pour
une telle raison, elle doit se mettre en attente jusqu’à l’exécution de la deuxième tâche qui était initialement en
attente. Ceci est indiqué par la mise à 1 du compteur lié au sémaphore au niveau de la deuxième tâche. Par
conséquent, la première tâche reprend son exécution en remettant à 0 le compteur du sémaphore, et ainsi la
suite d’exécution des deux tâches. La commutation entre les deux tâches est provoquée par l’exécution des
deux services système. Le premier consiste à met en attente la tâche dans laquelle il a été appelé, tant que la
valeur du compteur vaut 0 et le deuxième met à 1 ce compteur ce qui introduit la tâche dans laquelle il a été
appelé dans l’état bloqué. Dans la majorité des cas, les services de demande et de restitution des ressources
tiennent ces deux rôles. La figure 2.7 illustre un exemple d’une tâche d’acquisition de données qui synchronise
son exécution avec une autre tâche qui traite ces données. P() et V() sont respectivement les services d’attente
et de signalisation du sémaphore de synchronisation ‘synchro’.
Systèmes temps réel / Ing3 SE/AII 8
Chapitre 2 : Concepts de base des systèmes d’exploitation

Figure 2.7 : Exemple de synchronisation de deux tâches par un sémaphore binaire.

Les sémaphores peuvent être utilisés pour la synchronisation de plusieurs tâches. En effet, deux situations
peuvent avoir lieu :

 Une tâche synchronise l’exécution de plusieurs tâches : l’exécution des tâches synchronisées suit l’ordre
de placement de ces dernières en file d’attente du sémaphore binaire, mais chacune d’elles nécessite la remise
à 1 du compteur au niveau de la tâche de synchronisation.
 Plusieurs tâches synchronisent l’exécution d’une seule tâche : dans ce cas, chacune des tâches de
synchronisation a besoin d’un sémaphore binaire. La tâche synchronisée peut réclamer une signalisation en
provenance de toutes les tâches de synchronisation (condition ET), et peut se contenter d’une seule signalisation
(condition OU).

Systèmes temps réel / Ing3 SE/AII 9


Chapitre 2 : Concepts de base des systèmes d’exploitation

VIII. Les mécanismes de communication entre tâches


Dans une application multitâche, l’un des aspects fondamentaux de coopération entre les différentes tâches est
la communication des informations entre elles. La communication peut être unidirectionnelle ou bidirectionnelle
et peut aussi avoir lieu entre des tâches et des sous-programmes d’interruption. Il existe deux types de
mécanismes de communication entre tâches :

 L’emploi d’un espace mémoire partagé : La communication est gérée par le programmeur. Les services
du noyau peuvent être exploités pour la synchronisation.
 L’échange des messages : La gestion de communication est totalement procurée au noyau.

Figure 2.8 : Techniques de communication entre tâches : (a) mémoire partagée (b) échange de messages.

VIII.1 Communication par mémoire partagée


Le principe de base de la communication entre deux tâches consiste à allouer un espace mémoire (tampon)
partagé entre elles. Une tâche place des informations dans le tampon et l’autre les récupère. Plus souvent, les
deux tâches ne fonctionnent pas au même rythme, ce qui entraine le problème classique du producteur et du
consommateur.
La première solution était de prévoir deux procédures qui tiennent compte de l’état du tampon (plein ou
vide) en se basant sur une variable de comptage : la première est appelée au niveau de la tâche productrice et
la met en attente si le tampon est plein ; la deuxième est appelée au niveau de la tâche consommatrice et la met
en attente si le tampon est vide. Dans les deux cas, la mise en attente de la tâche en cours est accompagnée
par l’activation de l’autre tâche s’il y en a, respectivement, un seul emplacement vide ou un seul élément dans
le tampon. Pour des noyaux préemptifs, une situation d’interblocage peut apparaitre entre les deux tâches. Il
arrive que l’ordonnanceur émette une interruption avant la mise attente de la tâche consommatrice lorsque le
tampon est vide. L’activation de cette tâche par la tâche productrice se fait ainsi avant sa mise en attente.
Lorsque le tampon devient plein, les deux tâches se trouvent en attente !
Une autre solution consiste à protéger le tampon par deux sémaphores à compte : sémaphore des cases
pleines et sémaphore des cases vides. Un troisième sémaphore binaire est nécessaire pour gérer l’exclusion
mutuelle sur le tampon. L’avantage est de réaliser, au niveau de chaque tâche, ces trois actions par un seul
appel ininterruptible : le test du tampon, la mise en attente de la tâche en cours et l’activation de l’autre tâche si
nécessaire. Cela permet de réduire le risque d’interblocage qui reste, cependant, important dans le cas où la
communication s’effectue entre plusieurs tâches. Un moyen de haut niveau est proposé à cet effet : le moniteur.

Systèmes temps réel / Ing3 SE/AII


10
Chapitre 2 : Concepts de base des systèmes d’exploitation

Il s’agit d’une structure de données implémentée dans quelques langages qui s’occupe en soi de gérer
l’exclusion mutuelle sur une ressource partagée. Lors de création du moniteur, le programmeur se contente de
spécifier, à l’instar d’une classe, la ressource (le tampon dans ce cas) ainsi que les différentes procédures y
opérant. Chaque procédure représente un moyen d’accès à la ressource par les différentes tâches. Deux
variables supplémentaires sont également nécessaires pour conditionner l’accès par les tâches émettrices est
réceptrices.
VIII.2 Communication par échange de messages
Les mécanismes communication entre tâches à travers un espace mémoire partagé sont faciles à implémenter
et permettent un échange rapide de données, mais présente également des limites. Les sémaphores sont des
mécanismes de bas niveau, leur mise en œuvre à des communications complexes est délicate. Les moniteurs
sont propriétaires et ne sont pas praticables dans tous les langages. De plus, ces mécanismes ne sont pas
opérationnels dans le cas des systèmes distribués et des communications en réseau.
Une solution alternative revient à communiquer des informations par messages de taille fixes ou
variables. Cela fait appel à des services système de type ‘send’ et ‘receive’ qui s’occupent en plus de gérer la
synchronisation au niveau système et donc sans risque d’interblocage. Dans les deux cas, le message ainsi que
l’identifiant de la destination ou de la source sont spécifiés. Une liaison particulière doit être établie entre la tâche
productrice et celle consommatrice. Cette liaison peut être directionnelle ou bidirectionnelle comme elle peut
être symétrique où l’une des deux tâches peut s’adresser à l’autre, ou asymétrique lorsque l’identifiant de la
source ne figure plus dans la liste des paramètres de l’appel ‘receive’, autrement dit la tâche consommatrice
peut recevoir un message de n’importe où. L’établissement de la liaison se fait automatiquement lorsque la tâche
productrice s’adresse directement et sans médiateur à celle consommatrice. Un mécanisme de synchronisation
est donc strictement requis, ce qui veut dire que les deux tâches se mettent mutuellement en attente selon une
stratégie dite ‘le rendez-vous’. La liaison peut faire appel à un tampon à capacité limitée. La communication des
messages se fait explicitement de la même façon que celle avec mémoire partagée, ce qui permet d’augmenter
la fluidité d’exécution des deux tâches. En l’absence d’un mécanisme de synchronisation, les données risquent
d’être écrasées. La liaison tamponnée avec capacité illimitée permet une communication asynchrone sans
aucun risque, tant que la taille du tampon est potentiellement infinie. Par ailleurs, les aléas dus à la transmission
d’informations peuvent être réglés par l’implémentation d’un protocole d’acquittement lors d’établissement de la
liaison. Cela n’est toutefois applicable que si la liaison est bidirectionnelle et symétrique. A cet effet, la tâche
consommatrice doit envoyer un accusé de réception. Si ce n’est pas le cas, le massage doit être retransmis.
Également, une potentielle perte d’accusé de réception donnera lieu à une retransmission inutile. Pour cela, une
information supplémentaire doit être ajoutée à chaque message afin que les tâches réceptrices soient en mesure
de détecter les messages doublons.
Une variante plus convenable à la communication par messages consiste à échanger des pointeurs
plutôt, et de procéder de sort qu’il s’agit des messages proprement dits. Une autre solution couramment
employée consiste à mettre en place des objets spécifiques tels que les boites aux lettres, les queues des
messages, les tubes, les sockets, voire d’autres objets. A la différence des mécanismes de base, ces objets
permettent une communication plus performante. L’établissement de la liaison se fait lors de la transmission des
messages. Cela permet d’utiliser le même objet entre plusieurs pairs de tâches, mais aussi d’établir plusieurs
liaisons au niveau d’un seul pair.
Les queues de messages
La queue de messages est une version à capacité limité des boites aux lettres. Tout comme un sémaphore,
une queue de messages est un objet de noyau qui doit être créé et initialisé. Lors de la création d’une queue
de messages, le noyau lui associe un ensemble des paramètres et structure de données, dont certains d’eux
sont spécifiés par le programmeur. On peut citer : le nom, le numéro d’identification, le descripteur de la queue
Systèmes temps réel / Ing3 SE/AII
11
Chapitre 2 : Concepts de base des systèmes d’exploitation

(QCB : Queue Control Bloc), la zone mémoire associée, deux files d’attente des tâches, la taille des messages
et la longueur de la queue (figure 2.8).

Figure 2.8 : Structure d’une queue de messages.

Systèmes temps réel / Ing3 SE/AII


12

Vous aimerez peut-être aussi