2
Rappels d'architecture matérielle
Pour comprendre le rôle et les fonctionnalités
des systèmes d'exploitation, il est nécessaire
d'appréhender ce qu'est une “machine nue”,
c'est-à-dire quels sont les constituants matériels d'un
ordinateur, et quels en sont les principes de fonctionnement.
2.1. Architecture générale
En première approche, un ordinateur est
constitué d'un processeur qui effectue les traitements, d'une
mémoire centrale où ce processeur range les données et les
résultats de ces traitements et de périphériques permettant
l'échange d'informations avec l'extérieur. Tous ces constituants
sont reliés entre eux par l'intermédiaire d'un bus, qui est
l'artère centrale et leur permet de s'échanger des données
(figure 2.1.). Pratiquement tous les ordinateurs actuels ont cette architecture,
que ce soient les micro-ordinateurs personnels ou les gros ordinateurs des
entreprises. Les différences résident essentiellement dans les
performances des constituants.
Fig. 2.1. Architecture
générale d'un ordinateur.
La mémoire est un organe passif, qui répond
à des ordres indiqués par les fils de contrôle du bus. En
réponse à un ordre d'écriture, elle range la valeur
représentée par les fils de données du bus dans un
emplacement défini par les fils d'adresse du bus. En réponse
à un ordre de lecture, elle fournit sur les fils de données du bus
la valeur mémorisée à l'emplacement défini par les
fils d'adresses. Le nombre de fils de données du bus définit le
nombre de bits des emplacements mémoire. C'est une caractéristique
importante pour les performances de l'ordinateur, puisqu'il détermine le
nombre de bits pouvant être lus ou écrits en mémoire par une
seule opération. Le nombre de fils d'adresse du bus définit la
taille maximale de la mémoire centrale. Le bus est géré par
un contrôleur, parfois intégré au processeur, qui
empêche son utilisation simultanée par plusieurs organes.
2.2. Architecture du processeur
Le processeur est l'organe qui effectue les traitements
suivant un “algorithme” défini par le programmeur. Il est
constitué essentiellement de trois parties (figure 2.2):
- L'unité arithmétique et logique
(U. A. L.) est capable d'effectuer les opérations
élémentaires habituelles sur des valeurs binaires, telles que
l'addition, la soustraction, le “ou” logique, les décalages,
etc...
- Les registres permettent de
mémoriser des résultats intermédiaires ou des états
particuliers du processeur. Ils sont en général en petit nombre,
mais d'accès très rapide. Certains ont un rôle particulier,
comme l'accumulateur, le compteur ordinal ou le registre
instruction.
- Le
décodeur-séquenceur contrôle l'exécution des
différentes phases des instructions.
Le principe de
fonctionnement est assez simple. Le décodeur-séquenceur
répète indéfiniment la séquence d'opérations
suivante:
- lecture mémoire à l'adresse
indiquée par le compteur ordinal, et rangement du résultat dans le
registre instruction,
- décodage de cette
instruction pour en exécuter les différentes
phases.
Fig. 2.2. Architecture
générale d'un processeur.
Les instructions sont en général assez
rudimentaires. Ce sont essentiellement des opérations de transfert de
données entre les registres et l'extérieur du processeur
(mémoire ou périphérique), ou des opérations
arithmétiques ou logiques avec un ou deux opérandes. Pour ces
dernières opérations, un registre particulier, l'accumulateur, est
souvent utilisé implicitement comme l'un des opérandes et comme
résultat. En général le déroulement de l'instruction
entraîne l'incrémentation du compteur ordinal, et donc
l'exécution de l'instruction qui suit. Notons que le transfert d'une
valeur dans le compteur ordinal entraîne un “branchement”
à l'adresse correspondant à cette valeur. La tendance naturelle a
été de construire des processeurs avec un jeu d'instructions de
plus en plus large; on pensait alors que le programmeur utiliserait les
instructions ainsi disponibles pour améliorer l'efficacité de ses
programmes. Ceci a conduit à ce que l'on a appelé l'architecture
CISC (Complex Instruction Set Computer). Cependant on a
constaté que les programmes contenaient toujours les mêmes
instructions, une partie importante du jeu d'instructions n'étant
utilisée que très rarement. Une nouvelle famille de processeurs a
alors été construite, l'architecture RISC (Reduced
Instruction Set Computer), qui offre un jeu réduit d'instructions
simples mais très rapides.
La figure 2.3 donne un exemple de la représentation
binaire d'une instruction en machine (cas 68000). Cette forme n'est pas
très agréable pour l'homme, mais c'est le véritable langage
de la machine. La forme mnémonique qui l'accompagne est
déjà plus lisible, mais nécessite un programme
(l'assembleur) pour pouvoir être interprêtée par la
machine.
Fig. 2.3. Exemple d'instruction binaire et
mnémonique.
2.3. Les entrées-sorties
Le principe élémentaire mis en œuvre pour
l'échange de données entre deux constituants physiques est
représenté en figure 2.4. En dehors des données proprement
dites, deux liaisons supplémentaires sont nécessaires, pour
permettre d'une part à l'émetteur de la donnée de signaler
la présence effective de cette donnée sur les fils correspondants,
et d'autre part au récepteur de signaler qu'il a lu la donnée. On
peut comparer ceci au ping-pong: celui qui a la balle a le droit
d'accéder aux fils de valeur pour lire ou écrire la donnée.
Suivant la capacité de traitement que l'on place entre le processeur et
le périphérique, c'est-à-dire suivant la complexité
du dispositif qui va prendre en compte cet échange
élémentaire et le transformer en des échanges sur le bus,
on trouvera les dispositions évoquées dans la figure
2.1.
Fig. 2.4. Protocole
élémentaire d'entrées-sorties.
2.3.1. Les entrées-sorties programmées
La façon la plus simple d'assurer la liaison entre le
bus et un périphérique, est de faire une simple adaptation des
signaux évoqués ci-dessus. On parle alors d'une interface.
Le processeur adresse directement le périphérique soit par les
instructions habituelles d'accès à la mémoire centrale,
l'interface jouant alors le rôle d'un (ou de plusieurs) emplacement de
mémoire, soit par des instructions spécialisées qui
assurent le transfert d'une donnée élémentaire avec un
registre ou un emplacement mémoire. Dans tous les cas, le programmeur
doit assurer le protocole élémentaire d'échanges
évoqué plus haut; c'est pourquoi on parle d'entrées-sorties
programmées.
tantque il_y_a_des_données_à_lire faire
tantque donnée_suivante_non_prête faire fait; { attente de la donnée}
lire_la_donnée;
traitement_de_la_donnée;
fait
Fig.
2.5. Exemple d'entrée-sortie programmée.
La figure 2.5 donne le schéma d'un tel programme de
lecture. Noter la boucle d'attente de la donnée qui teste l'indicateur de
donnée prête. Nous supposons ici que la lecture de la donnée
entraîne le positionnement par l'interface de l'indicateur de
donnée lue et sa remise à zéro par le positionnement de
l'indicateur de donnée prête. Il est facile de constater qu'un tel
échange a une vitesse (on dit encore un débit)
limité par le nombre d'instructions machine qui constituent le corps de
la boucle externe. Ce débit est souvent limité en
conséquence à 50 Ko/s (Kilo-octets par seconde). Par ailleurs si
le périphérique est lent, le processeur est monopolisé
pendant toute la durée de l'échange. Dans ce cas, on ne lit que
quelques octets à la fois pour éviter cette monopolisation. Comme
il a été mentionné dans le précédent
chapitre, cette forme d'échange était la seule possible dans les
premières générations de machines.
2.3.2. Les entrées-sorties par accès direct à la
mémoire
Pour accroître le débit potentiel des
entrées-sorties, et diminuer la monopolisation du processeur dont nous
avons parlé ci-dessus, la première solution a été de
déporter un peu de fonctionnalité dans le dispositif qui relie le
périphérique au bus, de façon à lui permettre de
ranger directement les données provenant du périphérique en
mémoire dans le cas d'une lecture, ou d'extraire directement ces
données de la mémoire dans le cas d'une écriture. C'est ce
que l'on appelle l'accès direct à la mémoire, ou
encore le vol de cycle.
La figure 2.6 schématise le mécanisme
d'accès direct à la mémoire. L'exécution d'un
transfert se déroule de la façon suivante:
- Le processeur informe le dispositif
d'accès direct à la mémoire de l'adresse en mémoire
où commence le tampon qui recevra les données s'il s'agit d'une
lecture, ou qui contient les données s'il s'agit d'une écriture.
Il informe également le dispositif du nombre d'octets à
transférer.
- Le processeur informe le
contrôleur des paramètres de l'opération proprement
dite.
- Pour chaque donnée
élémentaire échangée avec le contrôleur, le
dispositif demande au processeur le contrôle du bus, effectue la lecture
ou l'écriture mémoire à l'adresse contenue dans son
registre et libère le bus. Il incrémente ensuite cette adresse et
décrémente le compteur.
- Lorsque le
compteur atteint zéro, le dispositif informe le processeur de la fin du
transfert par une ligne d'interruption (voir plus
loin).
Fig. 2.6. Mécanisme d'accès
direct à la mémoire.
Pendant toute la durée du transfert, le processeur est
libre d'effectuer un traitement quelconque. La seule contrainte est une
limitation de ses propres accès mémoire pendant toute la
durée de l'opération, puisqu'il doit parfois retarder certains de
ses accès pour permettre au dispositif d'accès direct à la
mémoire d'effectuer les siens (d'où le terme de vol de cycle
évoqué plus haut).
La limitation du débit inhérent au
mécanisme est en général lié au débit
potentiel de la mémoire elle-même, c'est-à-dire à la
durée d'un cycle de lecture ou d'écriture en mémoire. Si
cette durée est de 500 ns., on peut théoriquement atteindre 2
Mo/s. Si la mémoire est organisée en mots de 4 octets, il est
possible de lire ou d'écrire 4 octets en un seul cycle, et de porter
ainsi le débit à 8 Mo/s. Dans ce cas le dispositif d'accès
direct à la mémoire assure le regroupement ou l'éclatement
des données échangées avec le périphérique de
façon à minimiser les accès mémoire.
2.3.3. Les entrées-sorties par processeur spécialisé
La troisième façon de relier un
périphérique avec la mémoire est d'utiliser un processeur
spécialisé d'entrées-sorties, c'est-à-dire de
déléguer plus d'automatisme à ce niveau. Dans le
schéma précédent, le processeur principal avait en charge
la préparation de tous les dispositifs, accès direct à la
mémoire, contrôleur, périphérique, etc..., pour la
réalisation de l'opération. L'utilisation d'un processeur
spécialisé a pour but de reporter dans ce processeur la prise en
charge de cette préparation, mais aussi des opérations plus
complexes, telles que par exemple le contrôle et la reprise d'erreurs.
L'intérêt est de faire exécuter des tâches de bas
niveau par un processeur moins performant, et donc moins coûteux à
réaliser, tout en réservant le processeur principal à des
tâches plus nobles.
2.4. Les interruptions
Nous avons déjà introduit ce mécanisme
dans le chapitre précédent ainsi que dans le paragraphe ci-dessus.
Ce mécanisme a été imaginé pour permettre à
un dispositif extérieur d'interrompre le déroulement normal du
processeur pour lui faire exécuter un traitement spécifique. Un
programme en arrière plan peut ainsi être interrompu pour permettre
d'activer un travail en avant plan; il sera ensuite poursuivi à la fin de
ce dernier. Un périphérique peut signaler la fin de
l'opération d'entrées-sorties demandée
précédemment, permettant ainsi au système de temps
partagé de reprendre l'exécution du programme qui avait
demandé cette opération.
Le mécanisme est obtenu en modifiant
légèrement le fonctionnement du décodeur-séquenceur
du processeur, par introduction d'une troisième phase, et qui devient le
suivant:
- lecture mémoire à l'adresse
indiquée par le compteur ordinal, et rangement du résultat dans le
registre instruction,
- décodage de cette
instruction pour en exécuter les différentes
phases,
- s'il y a une demande d'interruption,
alors la prendre en compte.
La prise en compte de
l'interruption peut se faire de différentes façons. Puisqu'il
s'agit d'interrompre le déroulement normal des instructions, il
“suffit” de modifier le compteur ordinal. Cependant comme on
désire reprendre ultérieurement le programme interrompu, il faut
aussi “sauvegarder” la valeur de ce compteur. Dans la plupart des
processeurs, ce n'est pas jugé tout à fait suffisant. En
général, le constructeur définit un
PSW (
Program
Status Word), ou
mot d'état du programme, contenant en
particulier le compteur ordinal ainsi que certains indicateurs sur l'état
courant du processeur. La prise en compte d'une interruption par le processeur
consiste alors à ranger en mémoire ce PSW dans un emplacement
déterminé ou repéré par un registre particulier
utilisé comme un pointeur de pile
[1], et
à charger un nouveau PSW soit fixe, soit obtenu depuis la
mémoire.
Pour éviter de ranger inutilement en mémoire des
registres, ce qui serait coûteux en temps, le processeur ne range que le
minimum lors de la prise en compte de l'interruption. Si on désire
pouvoir reprendre ultérieurement le programme interrompu, les
instructions qui constituent le traitement de l'interruption que nous
appellerons sous-programme d'interruption, doit ranger en mémoire
le contenu de l'ensemble des registres du processeur qui ne l'ont pas
été par la prise en compte de l'interruption, pour permettre cette
reprise ultérieure. C'est ce que l'on appelle la sauvegarde du
contexte. Dans certains cas, on pourra ne faire qu'une sauvegarde partielle
des seuls registres modifiés par le sous-programme d'interruption.
Lorsque le contexte est sauvegardé, le sous-programme analyse la cause de
l'interruption, et effectue le traitement approprié. Il peut ensuite
restituer le contexte du programme interrompu (ou celui d'un autre programme
lorsque l'interruption correspond à la fin d'une opération
d'entrées-sorties pour celui-ci). Il se termine par une instruction
spéciale qui demande au processeur de restituer le PSW du programme
interrompu, entraînant sa reprise effective (figure 2.7).
Fig. 2.7. Déroulement d'un
sous-programme d'interruption.
Le schéma de fonctionnement du mécanisme
d'interruption ainsi décrit met en avant une difficulté si une
nouvelle interruption survient alors que le traitement de la
précédente n'est pas terminée. Si on ne prend pas de
précaution, le sous-programme d'interruption est de nouveau
appellé avant sa fin, entraînant la sauvegarde du contexte du
sous-programme d'interruption et la perte du contexte du programme initialement
interrompu
[2]. Ce problème est
résolu par le biais du
masquage des interruptions, qui interdit au
processeur la prise en compte d'une interruption si elle est masquée.
Cela n'annulle pas la demande d'interruption proprement dite, qui n'est pas
considérée par le processeur. Lorsque, ultérieurement, une
instruction sera exécutée par le processeur pour démasquer
cette interruption, celui-ci pourra alors la prendre en compte. Cela permet
ainsi au logiciel (en général le système d'exploitation) de
contrôler les moments où une telle prise en compte pourrait
perturber son bon fonctionnement. En particulier, le masquage automatique des
interruptions par le processeur lors de la prise en compte d'une interruption
évite de le réexécuter une nouvelle fois avant qu'il ne
soit terminé, à moins que le programmeur n'ait lui-même
demandé le démasquage des interruptions dans le sous-programme
après avoir pris les précautions nécessaires à cette
nouvelle interruption (
sous-programme réentrant).
Certains processeurs ont plusieurs “fils
d'interruption” qui sont masquables individuellement. Ils correspondent
alors à des interruptions hiérarchisées,
c'est-à-dire qu'à chaque fil est attribué un numéro
appellé niveau de priorité d'interruption, permettant au
processeur de savoir laquelle il y a lieu de prendre en compte si plusieurs sont
présentes au même moment. Ce dispositif est complété
par un registre spécialisé du processeur (qui fait partie du PSW)
qui contient le niveau de priorité de l'interruption en cours de
traitement. Le processeur ne prend en compte une interruption que si elle est
non masquée, et de priorité supérieure au niveau de
priorité courant. Cela permet de satisfaire les demandes plus urgentes
que celle que l'on est en train de traiter tout en évitant les
problèmes de réentrance évoqués plus haut.
2.5. Notion d’appel système
2.5.1. Mode maître-esclave
Le chapitre précédent a introduit la
nécessité de contrôler les actions d’un programme vis
à vis de son environnement direct. En général, il est
nécessaire d’empêcher le programme d’un utilisateur de
perturber le fonctionnement global du système ou les programmes des
autres utilisateurs. Cela implique qu’il n’ait pas accès
à l’ensemble des ressources de la machine, mais seulement à
celles qui lui ont été allouées en propre. La solution la
plus couramment adoptée est de distinguer deux modes de fonctionnement du
processeur, le mode maître et le mode esclave. Dans le mode
maître, le processeur a accès à toutes les ressources de la
machine. Dans le mode esclave, certaines instructions lui sont interdites. Pour
cela, le fonctionnement du décodeur-séquenceur du processeur est
légèrement modifié, par introduction d'une phase de
contrôle intermédiaire:
- lecture mémoire à l'adresse
indiquée par le compteur ordinal, et rangement du résultat dans le
registre instruction,
- si le processeur est en
mode esclave, vérification que l’instruction est
autorisée,
- décodage de cette
instruction pour en exécuter les différentes
phases,
- s'il y a une demande d'interruption,
alors la prendre en compte.
L’indicateur du mode de
fonctionnement maître/esclave fait partie du mot d’état
programme. De cette façon, ce mode est lié au programme en cours
d’exécution. En particulier, la prise en compte d’une
interruption chargeant un mot d’état programme spécifique
à l’interruption, le sous programme correspondant
s’exécutera dans le mode défini par ce mot
d’état et non par celui du programme interrompu. La reprise de ce
dernier restaurera le mode qui lui est attaché.
2.5.2. Déroutement
Si le programme d’un utilisateur fonctionne en mode
esclave, sous un jeu d’instructions réduit, néanmoins,
certaines actions nécessaires à son bon fonctionnement
nécessitent de disposer du jeu complet, et doivent donc être
exécutées en mode maître. Évidemment le changement de
mode doit être contrôlé. En général, ceci se
fait au moyen d’une instruction spéciale, qui va changer le mot
d’état programme du processeur, selon un principe voisin de la
prise en compte des interruptions, c’est-à-dire, rangement du mot
d’état courant et chargement du mot d’état lié
à la fonction demandée et restauration du mot d’état
initial à la fin de la fonction. C’est pourquoi, ce
mécanisme prend parfois la dénomination d’interruption
programmée. On dit encore déroutement ou appel
superviseur.
Un déroutement est aussi très voisin d’un
appel de sous programme : sauvegarde du compteur ordinal, dont la valeur
est remplacée par l’adresse du sous programme, et restauration de
la valeur sauvegardée à la fin du sous programme. Il y a,
cependant, deux différences essentielles :
- Le déroutement modifiant le mot
d’état programme permet un changement de mode, un masquage des
interruptions, ou un changement du niveau de priorité courant du
processeur.
- L’adresse du sous programme
exécuté n’est pas contenue dans l’instruction de
déroutement elle-même, mais dans le mot d’état
programme chargé. Ceci oblige le passage par des points de
contrôles qui vérifieront les valeurs des paramètres de la
fonction avant de l’exécuter. De plus, le programme n’a pas
à connaître les adresses qui sont à l’intérieur
du système et aux quelles il n’a pas accès.
2.6. Les caractéristiques des principaux périphériques
Les exemples suivants montrent la grande diversité des
périphériques habituels.
2.6.1. Les périphériques de dialogue homme-machine
Trois types de périphériques principaux sont
concernés par le dialogue entre l’homme et la machine.
2.6.1.1. Les écrans claviers distants
Il s'agit de terminaux relativement simples, qui ont vocations
à être installés loin de l’ordianteur. La liaison doit
donc être à faible coût, et on utilise 2 ou 4 fils, sur
lesquels les bits sont “sérialisés”,
c'est-à-dire que les 8 bits d'un octet sont transmis les uns après
les autres, à vitesse constante, suivant un protocole standard
international (RS232) ils sont précédés par un bit de
départ (start), et suivis d'un ou deux bits de fin (stop).
C'est ce que l'on appelle la ligne série asynchrone. Elle est
asynchrone, car chaque octet est transmis individuellement, le bit start
permettant la synchronisation automatique du récepteur sur
l'émetteur, pour la durée du transfert de l'octet
correspondant.
Vu de l'ordinateur, un écran-clavier est donc en fait
une ligne série. Les octets sont en général transmis un par
un par des entrées-sorties programmées. Le débit en sortie
est au plus de 1000 octets par seconde. Il ne sert à rien d'aller plus
vite, puisque l'homme ne peut déjà plus lire le contenu de
l'écran à cette vitesse. Le débit en entrée est en
général beaucoup plus lent puisqu'il est limité par la
frappe manuelle sur le clavier, et donc quelques octets par seconde. Pour
éviter que le processeur ne perde trop de temps lors de ces
entrées-sorties programmées, on utilise le mécanisme
d'interruption pour chaque caractère transmis. Si l'ordinateur doit
comporter beaucoup de lignes, il peut s'en suivre une charge de traitement
importante due à la prise en compte de ces interruptions. Dans ce cas,
les constructeurs proposent souvent des processeurs d'entrées-sorties
spécialisés dans ce travail; on les appelle alors des
frontaux.
2.6.1.2. Les écrans graphiques
Les écrans graphiques sont maintenant le mode
d’affichage habituel des postes de travail individuels, qu’il
s’agisse de poste bureautique ou de stations de travail haut de gamme. Une
zone de mémoire dédiée contient l’image en point
à point devant être affichée. Un processeur graphique
spécialisé parcours cette mémoire et interprète la
suite des emplacements comme décrivant les points successifs ou
pixels de l’image, et les transforme en signal vidéo pour
l’affichage. Ce balayage est effectué 25 fois par secondes. De
plus, cette zone est également accessible par le processeur central qui
peut donc définir le contenu de chaque pixel de l’écran.
Comme un écran peut comporter jusqu’à 1300 lignes de 1600
points chacune, l’image peut donc être constituée
d’environ 2 millions de pixels, chaque pixel étant défini
généralement par trois couleurs (rouge, vert et bleu), le niveau
de chacune d’elles étant défini par 8 bits. Une telle
mémoire peut donc atteindre 6 Mo. Le processeur central n’a pas
à redéfinir tout ou partie du contenu de ces 6 Mo, 25 fois par
secondes, mais chaque fois qu’un changement intervient dans l’image
à afficher à l’utilisateur. Dans le cas de la
nécessité d’animation complexe, il peut être fait
appel à un processeur spécialisé pour faire varier le
contenu de cette mémoire.
Les écrans graphiques sont en général
couplés à ce que l’on appelle une souris. Il
s’agit en fait d’un dispositif très simple qui transmet les
mouvements subis dans deux directions, ainsi que l’appui sur 1 à 3
boutons. Ces informations de mouvements peuvent être analysés par
un logiciel spécialisé, qui en retour affiche une marque à
une position de l’écran, permettant à l’utilisateur de
voir l’effet de ses mouvements sur la souris. Ce logiciel doit être
assez rapide pour que tout mouvement de l’utilisateur ait un effet visuel
immédiat. Les programmes d’applications reçoivent en
général les coordonnées de la position de la marque sur
l’écran au moment de l’appui sur l’un des boutons.
2.6.1.3. Les imprimantes
L'imprimante est un autre type de périphérique
de dialogue homme-machine très courant. On peut distinguer les
imprimantes caractères et les imprimantes graphiques.
Nous mettons dans la catégorie des imprimantes
caractères celles à qui on envoie les caractères à
imprimer et qui ont peu de fonctionnalités de mise en page. Une telle
imprimante peut être connectée sur une ligne série comme les
terminaux écran-clavier, et a alors les mêmes
caractéristiques vues du processeur. L'intérêt est d'une
part la standardisation vue de l'ordinateur qui ne fait pas de distinction entre
ces imprimantes et les terminaux, et d'autre part la possibilité de les
éloigner de l'ordinateur pour les rapprocher de l'utilisateur. Elle peut
également être reliée par une interface directe en mode
caractère, c'est-à-dire en utilisant les entrées-sorties
programmées vues plus haut, la boucle assurant le transfert d'une ligne.
Elle peut enfin être reliée sur un dispositif d'accès direct
à la mémoire. Dans ces deux derniers cas, le débit
instantané peut être important, car l'imprimante dispose en
général d'un tampon correspondant à une ligne, ce qui
justifie ces deux modes de liaison. Il faut noter cependant que l'impression
proprement dite ralentit le débit moyen, qui varie entre 100 octets par
seconde et 5000 octets par seconde (2400 lignes/minute).
Les imprimantes graphiques, par exemple les imprimantes laser,
offrent des fonctionnalités complexes de dessin de caractères ou
de figures comme de mise en page. Les plus simples doivent recevoir le contenu
de la page à imprimer sous la forme d’une suite de bits
décrivant les points (noir ou blanc) des lignes successives. Cependant,
avec une finesse de 300 points par pouce, une page contient environ 8 millions
de points, décrits par 1 Mo, qui doivent être transmis pendant le
défilement de la feuille de papier devant le faisceau laser. Aussi cette
méthode a tendance à être abandonnée au profit
d’une méthode plus élaborée, dans la quelle le
contenu de la page est décrit dans un langage standardisé, comme
postscript. L’imprimante dispose d’un processeur rapide qui
interprète cette description et la traduit en points sur le papier. Ce
processeur peut être doté de plus ou moins de mémoire pour
stocker les descriptions de page à imprimer et les dessins correspondants
à plusieurs fontes (une fonte est un assortiment de caractères).
Par ailleurs, la disponibilité d’un processeur permet de connecter
l’imprimante directement au réseau.
Notons que pour les écrans claviers et les imprimantes
classiques, le débit en sortie n'est pas crucial en ce sens que si le
débit est ralenti du fait du processeur, il n'y aura pas perturbation du
fonctionnement, mais simplement perte de performance. Le débit en
entrée des claviers doit être respecté sous peine de perte
d'informations, mais ce débit est assez faible pour ne pas être
trop contraignant, sauf, comme nous l'avons dit, dans le cas d'un nombre
important de terminaux. Nous verrons que ces contraintes sont beaucoup plus
fortes pour les autres types de périphériques.
2.6.2. Les périphériques de stockage séquentiel
Nous nous intéressons ici aux bandes magnétiques
de 1/2 pouce
[3] de large, soit 1.27
cm.
, et d'environ 2400 pieds de long, soit
730 mètres. L'enregistrement et la lecture sont obtenus par 9 têtes
permettant de mettre transversalement un octet avec un bit de parité. Le
transfert entre l'ordinateur et la bande ne peut s'effectuer que lorsqu'elle
défile à vitesse constante, en général 75 ips
(inches par seconde), soit 190.5 cm/s, mais peut atteindre 200 ips, soit 5 m/s.
La
densité, exprimée en nombre d'octets par pouce (bpi pour
byte per inch), déterminera d'une part la capacité totale de la
bande, d'autre part le débit du transfert. Les densités les plus
courantes actuellement sont, d'une part 1600 bpi, donnant une capacité
totale de 44 Mo, et un débit de 120 Ko/s, d'autre part 6250 bpi, donnant
une capacité totale de 172 Mo, et un débit de 500 Ko/s, mais
pouvant atteindre 1.25 Mo/s. La vitesse de défilement devant être
constante pendant le transfert, il faut mémoriser les informations par
bloc de taille variable, les blocs successifs étant séparés
par un espace inutilisable (
gap) réservé au freinage et
à l'accélération. Cet espace est en moyenne de 3/4 de
pouce, soit 1.905 cm.
Constatons que les débits interdisent les
entrées-sorties programmées. Par ailleurs le débit doit
impérativement être respecté sous peine d'écritures
d'informations erronées si l'ordinateur ne fournit pas un octet à
temps en écriture, ou de perte d'informations si l'ordinateur ne
mémorise pas un octet à temps en lecture. C'est pourquoi on
utilise les entrées-sorties par accès direct à la
mémoire ou par processeur spécialisé. Ce dernier offre
l'avantage de permettre d'assurer toutes les reprises d'erreurs qui pourraient
se produire, en recommençant éventuellement plusieurs fois
l'opération.
2.6.3. Les périphériques de stockage aléatoire
Fig. 2.8. Disque
magnétique.
Il s'agit essentiellement des disquettes, ou disques
magnétiques. Bien des caractéristiques s'appliquent
également aux disques optiques, mais nous n'en parlerons pas. Un disque
est constitué d'un ou plusieurs plateaux tournant à vitesse
constante autour de leur axe (on parle parfois d'une pile de disque).
Chaque plateau est recouvert sur ses deux faces d'une couche magnétique.
Des têtes de lecture/écriture sont fixées, à raison
de une par face, sur un bras qui peut se déplacer perpendiculairement
à l'axe. Pour une position du bras donnée, chaque tête peut
lire ou écrire sur une circonférence du plateau qui la concerne,
délimitant ainsi ce que l'on appelle une piste. L'ensemble des
pistes vues par chaque tête, pour une position de bras donnée,
s'appelle un cylindre. Enfin chaque piste est découpée en
secteurs, qui contiennent chacun le même nombre d'octets (figure
2.8).
La structure même du disque impose que les
opérations se fassent par secteurs complets. Par ailleurs, le
débit est constant pour un disque donné, et est actuellement
compris entre 250 Ko/s et 5 Mo/s. Comme il doit impérativement être
respecté, il est nécessaire d'utiliser les entrées-sorties
par accès direct à la mémoire ou par processeur
spécialisé. Contrairement aux bandes magnétiques, ce
dernier n'est pas essentiel pour la récupération d'erreurs qui
sont peu fréquentes (et en général plus
irrémédiables) sur les disques, mais peut prendre en charge une
partie de la gestion du disque lui-même et des accès.
Les disquettes ont la même structure que les disques
durs, mais le débit est beaucoup plus faible, puisqu'il est de l'ordre de
30 Ko/s. Ce débit est donc parfois compatible avec le mode
d'échange programmé. Il faut noter cependant que lors de la
lecture ou de l'écriture d'un secteur, le délai qui sépare
le lancement de l'opération du transfert du premier octet, est
aléatoire, et compris entre 0 et 300 ms, temps pendant lequel le
transfert programmé impose au processeur de rester en boucle
d'attente.
2.6.4. Les périphériques de communications entre machines
Lorsqu'on veut faire communiquer entre elles plusieurs
machines, différentes solutions sont possibles. Nous nous
intéressons ici aux communications entre machines
hétérogènes et à distance moyenne ou longue. En
effet un constructeur peut construire des dispositifs particuliers, entre deux
accès directs à la mémoire, ou même partager la
mémoire entre les machines, pour échanger des informations entre
des machines de sa fabrication qui seraient situées dans la même
pièce.
La communication entre machines sur des distances
dépassant par exemple 100 mètres, pose d'abord le problème
du coût du cable. Comme dans le cas des liaisons avec les
écrans-claviers, la connexion est effectuée en utilisant des
cables à 2 ou 4 fils. Cette communication pose ensuite le problème
du “langage” utilisé, et que l'on appelle le protocole de
communication. Initialement, chaque constructeur avait son propre protocole,
ne permettant que la communication entre ses machines. Sous la pression des
utilisateurs, et de divers organismes, des protocoles variés ont
été normalisés par des instances internationales. Nous ne
tentons ici que de donner quelques caractéristiques importantes de ces
communications.
La notion de protocole consiste à encadrer
l'information à transmettre, c'est-à-dire le contenu, par des
informations qui construisent le protocole, et servent à véhiculer
le contenu. Dans la description de la ligne série asynchrone, nous avons
vu un exemple de protocole simple où l'octet était encadré
par un bit start et des bits stops. Dans la communication entre machines les
protocoles sont plus complexes, de façon à permettre des
échanges complexes d'informations.
La première caractéristique est la transmission
par paquet. L'ensemble des octets représentant l'information
à transmettre est tout d'abord découpé en morceau, par
exemple 250 octets. Chaque morceau est encadré par les informations du
protocole permettant de le véhiculer, constituant un paquet. Les
différents paquets sont transmis individuellement. A la réception
des paquets, le récepteur en extrait le contenu, et utilise les
informations du protocole pour reconstruire l'information. Intuitivement, le
protocole doit permettre d'identifier l'émetteur, le récepteur, et
un numéro d'ordre du paquet.
La deuxième caractéristique est la transmission
du paquet à vitesse constante. On dit que la transmission est
synchrone, car d'une part les horloges de l'émetteur et du
récepteur sont synchronisées entre elles, d'autre part
l'émetteur commence par transmettre en début de paquet une
information permettant au récepteur de reconnaître le premier bit
réel du paquet, et de faire le regroupement des bits des octets 8 par
8.
La troisième caractéristique est la
complexification de l'ensemble de la transmission entre deux machines qui
résulte de l'abandon des liaisons point à point par des lignes
spécialisées au profit de l'interconnexion globale de l'ensemble
des machines de la planète. Ceci a conduit à la définition
du modèle OSI (Open Systems Interconnexion) qui découpe la
communication en 7 couches, chacune d'elle étant chargée d'une
tâche spécifique, comme par exemple, la couche réseau
chargée du routage des paquets ou la couche transport chargée de
segmenter les messages en paquet lors de l'émission et de recomposer les
messages à partir des paquets lors de la réception.
Les débits actuels sont importants, puisqu'ils sont
couramment de 200 Ko/s, mais ils peuvent atteindre plusieurs dizaines de Mo/s,
sur des réseaux locaux comme sur des réseaux à longue
distance. Il est évident que de tels débits nécessitent
d'utiliser soit l'accès direct à la mémoire, soit le
processeur spécialisé d'entrées-sorties, la
complexité des protocoles et leur normalisation lui faisant souvent
préférer ce dernier.
2.6.5. Les périphériques et le système
Il ressort de l'étude des caractéristiques des
différents périphériques une très grande
diversité de fonctionnement, de mode de liaison, de vitesse de transfert.
Programmer sur une machine nue implique la connaissance de cette
diversité, et la spécialisation du programme à une
configuration particulière. L'un des rôles essentiels du
système d'exploitation, et de son constituant particulier le superviseur
d'entrées-sorties, est de prendre en compte cette diversité pour
en décharger le programmeur. Le système fournira au programmeur un
nombre limité d'interfaces standards et uniformes.
2.7. Conclusion
+ Un ordinateur est
constitué d'un bus qui relie les divers organes, d'un processeur, d'une
mémoire centrale et de périphériques.
+ Un processeur est
constitué d'une unité arithmétique et logique, de registres
et d'un décodeur-séquenceur qui le contrôle. Il lit en
mémoire l'intruction située à l'adresse définie par
le compteur ordinal, l'exécute, puis recommence. Son langage est
binaire.
+ Les
entrées-sorties programmées sont obtenues par un programme qui
effectue le transfert des informations entre la mémoire et un
périphérique, une par une.
+ L'accès
direct à la mémoire est un dispositif qui assure le transfert des
informations entre la mémoire et un périphérique par vol de
cycle.
+ La prise en compte
d'une interruption par le processeur consiste à ranger en mémoire
le mot d'état programme et à le remplacer par un nouveau. Le
compteur ordinal fait partie de ce mot d'état programme. Le reste du
contexte doit être sauvegardé par le sous-programme d'interruption,
pour permettre sa restitution en fin d'exécution de ce
sous-programme.
+ Le masquage des
interruptions est le mécanisme qui permet au logiciel de contrôler
la prise en compte des interruptions par le processeur.
+ Le processeur peut
travailler selon le mode maître ou le mode esclave dans lequel certaines
instructions sont interdites. Des instructions spéciales d'appel
superviseur permettent de changer de mode de façon
contrôlée.
+ Les
périphériques de dialogue homme-machine, lorsqu'ils sont simples,
peuvent être gérés par des transferts programmés,
éventuellement régis par interruption. Cependant lorsque leur
nombre augmente sur une même machine, la charge de traitement peut
nécessiter l'utilisation de processeurs spécialisés
appelés frontaux. Par ailleurs, dans les stations de travail, l'affichage
est le résultat de modifications du contenu de la mémoire
partagée par le dispositif de balayage vidéo.
+ Les
périphériques magnétiques, bandes ou disques,
nécessitent l'utilisation soit de l'accès direct à la
mémoire, soit d'un processeur spécialisé
d'entrées-sorties. Ce dernier a l'avantage de permettre de
décharger le processeur principal d'une partie de la gestion du
périphérique.
+ La communication
entre machines utilise des protocoles normalisés, qui permettent de
s'affranchir des contraintes matérielles et prendre en compte la
complexité du réseau d'interconnexion. L'information est
découpée par l'émetteur en paquets indépendants, et
reconstruite par le récepteur à l'aide du protocole.
+ L'une des fonctions
du système est de décharger le programmeur du souci de la
diversité des périphériques, par la fourniture d'un nombre
limité d'interfaces standards et uniformes.
[1] Une pile est une structure
de données permettant la conservation d'informations, de telle sorte que
les informations sont enlevées de la structure dans l'ordre inverse
où elles y ont été mises.
[2] À moins d'utiliser
pour la sauvegarde des contextes successifs, mais se pose alors le
problème de la taille de cette pile.
[3] Rappelons que le pouce
(
Inch) est une mesure de longueur anglaise, qui vaut 2.54
centimètres, tout comme le pied, qui vaut 12 pouces, soit 30.48
centimètres.