Université Pierre et Marie Curie

Systèmes d'exploitation des ordinateurs

Chapitre 1. Les systèmes d'exploitation
Chapitre 2. Mécanismes d'exécution et de communication
2.1. Notions sur les procédures
2.2. Notions sur les interruptions
2.3. Programmation des entrées-sorties
2.4. Les processus sous Unix
Chapitre 3. Gestion des activités parallèles
Chapitre 4. Gestion des fichiers
Chapitre 5. Partage des ressources
Chapitre 6. Au-dessus du système d'exploitation
Chapitre 7. Notions sur les communications
Chapitre 8. Notions sur la sécurité
Bibliographie
Chapitre 9. Exercices et TPs
Examens
Page d'accueilTable des matièresNiveau supérieurPage précédenteBas de la pagePage suivante

2.3. Programmation des entrées-sorties

Couplage de périphériques

Nous allons évoquer maintenant les principes de base qui sont employés pour réaliser les entrées-sorties entre la mémoire et un périphérique.

On peut imaginer, toujours dans le cas du système d'exploitation le plus rudimentaire, que le processeur pilote lui-même le dispositif de lecture ou d'écriture. Il gère directement le disque choisissant l'emplacement où écrire et enchaîne une à une toutes les opérations nécessaires. Ceci est un gaspillage car le processeur devra consacrer le plus clair de son temps à cette gestion, travaillant fort peu pour l'usager. On a donc depuis longtemps introduit une certaine intelligence dans les dispositifs de gestion des entrées-sorties. On distingue:

  • les coupleurs: processeurs simples qui disposent d'un peu de mémoire et d'un jeu d'instructions limité. Ils peuvent gérer les adresses sur le disque et les déplacements des têtes d'écriture.
  • les canaux et dispositifs d'accès direct à la mémoire (DMA ou direct memory access) qui sont de véritables processeurs, parfois non interruptibles, qui peuvent interrompre le processeur. Ils peuvent activer en parallèle plusieurs disques ou coupleurs, possèdent une mémoire qui leur permet de stocker l'information et de réordonner les accès pour accélérer les échanges.

Nous évoquerons ces stratégies au chapitre V.2 lorsque nous discuterons de l'allocation des ressources.

Pilotage des périphériques

Pilotage synchrone

Lors d'entrées-sorties synchrone le processeur est immobilisé pendant toute la durée du transfert (fig. 2.4). Le coupleur contient un mot d'état qui indique entre autre :

  • s'il est prêt lorsque le périphérique est apte à fonctionner
  • fini lorsque le transfert est terminé et qu'il est prêt pour un nouvel échange. Le processeur peut alors reprendre son activité
  • erreur lorsqu'une erreur est détectée au cours du transfert. La nature de celle-ci est indiquée par un code qui fait partie du mot d'état. La qualité du diagnostic dépend de l'électronique (nombre de bits de contrôle par octet) et des possibilités de traitement du système d'exploitation.
dd

    figure 2.4 : Couplage synchrone    

Les entrées-sorties synchrones ne présentent d'intérêt que pour des processeurs rudimentaires lorsqu'il n'y a pas de raison de vouloir mieux employer les temps d'attente. C'est la cas, par exemple, du microprocesseur affecté au clavier d'un ordinateur. Leur programmation est simple puisque l'état de l'activité, en chaque point interruptible, est toujours parfaitement déterminé. De fait les coupleurs synchrones ne se rencontrent que dans des dispositifs spécialisés dont l'état est parfaitement prévisible à tout instant. Leur programmation est facile donc efficace et ne demande que peu de mémoire pour stocker le programme.

Pilotage asynchrone

dd

    figure 2.5 Couplage asynchrone synchrone    

Le pilotage des entrées-sorties asynchrones est plus complexe. On ne peut pas prévoir à l'avance l'état des différents processus qui devront communiquer entre eux. Nous évoquerons ce très délicat problème plus en détails au chapitre III-1. Leur programmation nécessite le recours à des interruptions car le processeur et le coupleur travaillent simultanément (fig. 2.5) à la différence du pilotage synchrone où ils travaillent en alternance (fig. 2.4). Chacun doit pouvoir être interrompu à des moments imprévisibles entre deux instructions. Ce mode de fonctionnement est évidemment plus performant puisque le processeur n'est pas immobilisé inutilement : lorsqu'il attend que le coupleur ait effectué une opération d'écriture pour un processus il peut retourner à d'autres activités.  Cependant ceci est la source de nombreuses possibilités d'erreurs. Il faut veiller à synchroniser correctement le périphérique et le processeur. Les données doivent être prêtes au moment voulu. Une mauvaise synchronisation est la source de nombreuses erreurs souvent difficiles à détecter et à corriger. Les canaux et dispositifs DMA fonctionnent généralement dans ce mode. Le processeur peut consulter leur mot d'état pour connaître leur activité. Dans le dispositif DMA le plus simple il se réduit à un registre qui contient l'adresse en mémoire des données à transférer, le nombre d'octets et le sens du transfert. Le processeur connaît l'état d'avancement du travail grâce à cette information.

Entrées-sorties tamponnées

Les périphériques, disques et encore plus lecteurs de CDs et DVDs, sont les dispositifs les plus lents dans un ordinateur. Transférer l'information octet par octet ou immédiatement après chaque requête ralentit donc considérablement le processeur et cela signifie un gâchis intolérable. Un transfert est une opération complexe qui nécessite l'établissement d'un dialogue entre la mémoire et le périphérique. Lorsque la quantité d'information à échanger est réduite ce dialogue prend plus de temps et mobilise plus de ressources que l'échange proprement dit. On a donc intérêt à réduire le nombre de ces opérations. Pour cela on a imaginé de les regrouper, chaque fois que cela est possible, en transférant en une seule fois des blocs de longueur fixe. Lorsqu'un ordre d'écriture est exécuté l'information n'est pas transférée au disque mais écrite dans une zone particulière de la mémoire appelée tampon ou buffer. Cette opération n'est pas distincte de tous les autres accès à la mémoire et ne déclenche donc aucune interruption. Lorsqu'un tampon est plein le transfert de son contenu est effectué en une seule fois. Ceci s'appelle un transfert en mode bloc. Même lorsque le processeur n'a besoin que de quelques octets, le transfert d'un disque vers la mémoire se fait toujours à travers des tampons. En effet des études statistiques ont montré que souvent les informations à transférer sont rangées à des adresses voisines. Comme il ne coûte pas plus cher de transférer un bloc ou un caractère on diminue les échanges en transférant en une seule fois des informations rangées à des adresses contiguës.

Il existe également des dispositifs travaillant en mode caractère. Par exemple, lorsqu'on frappe un caractère sur le clavier il serait très désagréable d'attendre le remplissage d'un tampon avant de communiquer l'information au processeur. IBM possédait, par le passé, des terminaux (modèle 3270) qui fonctionnaient selon ce principe. Ils possédaient une mémoire locale pour afficher sur l'écran les caractères frappés sur le clavier ainsi qu'une touche spéciale pour envoyer tout le contenu enregistré dans le terminal et affiché sur l'écran à l'ordinateur en une seule fois. Réciproquement, l'affichage se faisait écran par écran. Ce fonctionnement était fort désagréable pour l'usager ne recevait "les réactions" de l'ordinateur que lorsque il avait frappé des lignes entières et voyait les résultats s'afficher sous forme de grands flashs modifiant tout l'écran. Les terminaux modernes fonctionnent en mode caractère : le processeur renvoie un écho pour chaque caractère frappé et donc la réaction est immédiate.

On peut imaginer des mécanismes d'échange à un ou plusieurs tampons.

Tampon unique

dd


    figure 2.6 Principe d'un tampon FIFO    

Imaginons un programme P qui écrive dans une zone mémoire affectée à un tampon (fig.2.6). Lorsque celui-ci est plein, P se met en attente et le moniteur déclenche un programme de transfert Q. Celui-ci lit le contenu du tampon puis, lorsque il a terminé, rend la main, à son tour, au moniteur, qui redémarre P.  Il est indispensable de synchroniser les activités de Pet de Q pour que le transfert, géré par Q, soit terminé avant que P ne reprenne son activité et remplisse à nouveau le tampon. Sinon les informations enregistrées sur le disque seraient incohérentes: on y trouverait parfois deux fois les mêmes données alors que d'autres n'y seraient jamais inscrites. Ces opérations de synchronisation sont assez complexes et seront étudiées en détail au chapitre III.

Les fonctions d'écriture et de lecture doivent gérer les adresses de pointeurs qui permettent de savoir comment est rempli le tampon. Il faut prévoir la purge possible de son contenu en fin de travail. Ceci est déclenché par les instructions de fermeture de fichiers (fclose en C, close en Fortran) qu'il vaut mieux ne pas oublier. Il existe plusieurs méthodes pour lire le contenu d'un tampon: la plus courante est représentée dans la figure 2.6. Les premiers octets introduits dans le tampon sont les premiers extraits : cela s'appelle une file d'attente FIFO (First In, First Out). On peut également envisager le modèle de pile ou LIFO (Last In First Out) déjà rencontré dans l'étude du changement de contexte mais peu adapté au transfert d'information. L'utilisation d'un tampon unique présente des inconvénients. Comme le processeur est plus rapide que le périphérique, il est souvent interrompu, le temps de vider le tampon. Il est donc très mal utilisé pour l'activité P. On peut remédier à cela en créant plusieurs tampons en mémoire.

Tampons multiples

dd

    figure 2.7 : Mécanisme à plusieurs tampons    

Le programme P écrit (ou lit) successivement dans plusieurs tampons (fig. 2.7). Si leur nombre est suffisant le processeur ne sera pas interrompu lorsqu'il exécute son programme car Q aura le temps de vider les tampons au nfur et à mesure entre deux périodes où P écrit (ou lit) dans le même tampon. Le nombre optimal de tampons dépend du type d'activité. Il est fonction de la quantité d'informations que P créé ou lit et de la taille des tampons. Les rapidités relatives du processeur et du périphérique influent aussi sur leur nombre. Sous DOS le nombre de tampons utilisé était défini dans la configuration du système décrite dans le fichier CONFIG.SYS. Il ne sert à rien d'augmenter leur nombre au delà du raisonnable car cela diminue inutilement la taille de la mémoire utilisable par les programmes, surtout que la sous-couche DOS impose de faire résider en mémoire basse un certain nombre d'informations fondamentales. Dans les systèmes Unix et Windows NT (ou ses successeurs 2000, XP) la taille des tampons et leur nombre sont réglés de façon dynamique en fonction de la mémoire disponible.

Les imprimantes possèdent leur propre tampon local qui doit être de dimension suffisante pour optimiser les échanges avec l'ordinateur. Ceci est fonction de leur usage : un graphiste devra équiper son imprimante avec une mémoire plus importante qu'un utilisateur de traitement de texte qui ne produit que des caractères. Le choix du nombre de tampons, leur taille sont des paramètres importants quant à l'efficacité d'un système d'exploitation pour une application donnée.
La synchronisation requise pour effectuer les entrées-sorties est plus délicate lorqu'on emploie plusieurs tampons. Nous étudierons un exemple à deux tampons au chapitre III.3.

Tampons sur disque


dd>
figure 2.8 Principe du spool     

Lorsqu'un périphérique est particulièrement lent, comme dans le cas d'une imprimante, le mécanisme précédent n'est plus vraiment satisfaisant sauf, éventuellement, pour une imprimante connectée directement à un ordinateur individuel . L'utilisateur doit prend mal son mal en patience et attendre que le document soit entièrement imprimé avant de pouvoir le manipuler à nouveau ou fermer le traitement de texte, par exemple. Il faudrait créer en mémoire un nombre de tampons trop élevé pour cacher la lenteur du transfert. On a donc imaginé un mécanisme supplémentaire qui s'ajoute à celui que nous venons de décrire. Le fichier à imprimer est transféré sur un disque à la vitesse d'accès à ce support. Puis, de façon asynchrone, ce fichier est relu par une deuxième tâche dont le rôle unique est de gérer l'impression. Cette activité se déroule parallèlement avec l'activité principale en arrière plan. On parle de spool ce qui signifie Simultaneous Operations On Line. Cette fonction inclue également un mécanisme de gestion de file d'attente pour gérer l'ensemble des requêtes, les fichiers à imprimer s'accumulant successivement sur le disque. La notion de file d'attente sera étudiée au chapitre V-3.


Copyright Yves Epelboin, université P.M. Curie, 2000, MAJ 4 avril, 2005

Page d'accueilTable des matièresNiveau supérieurPage précédenteHaut de la pagePage suivante