SYSTÈMES D’EXPLOITATION - Cours et …mcours.net/cours/doc/info/SYSTEMES_D_EXPLOITATION... ·...

380
SYSTÈMES D’EXPLOITATION & RÉSEAUX INFORMATIQUES Notes de cours 1998-1999 par Pierre Nugues ISMRA, 6, boulevard du Maréchal Juin 14050 Caen Bureau C 108, téléphone 231-45-27-05 p n u g ues @ g r eyc.i s mr a.fr www.ensica e n.is mr a.f r /~n u g u es

Transcript of SYSTÈMES D’EXPLOITATION - Cours et …mcours.net/cours/doc/info/SYSTEMES_D_EXPLOITATION... ·...

SYSTMES DEXPLOITATION

SYSTMES DEXPLOITATION

&

RSEAUX INFORMATIQUES

Notes de cours 1998-1999 par

Pierre Nugues

ISMRA,

6, boulevard du Marchal Juin

14050 Caen

Bureau C 108, tlphone 231-45-27-05 [email protected] www.ensicaen.ismra.fr/~nugues

Caen, Tous droits rservs, 1999

Introduction

Ce cours prsente les principaux points thoriques du fonctionnement des systmes dexploitation. Il les illustre par un certain nombre dexemples de mise en uvre quil tire essentiellement du systme Unix et accessoirement de Windows et de Java.

Lhistoire de linformatique est trs brve les ordinateurs sont ns avec la seconde guerre mondiale et pourtant, elle a connu des grandes volutions. leur apparition, les ordinateurs taient trs coteux et rservs aux grandes entreprises; celles-ci nen possdaient au dpart que quelques exemplaires. Ces ordinateurs centraux sont rapidement devenu un auxiliaire dadministration et ils se sont diffuss dans les diffrents services (departments en anglais) : financier, comptabilit, etc. Pour rendre linformatique plus adapte et plus abordable, des fabricants se sont alors mis produire des mini-ordinateurs dpartementaux . Ces ordinateurs fonctionnaient avec des systmes dexploitation qui leur taient propres, chaque machine ou chaque constructeur, par exemple, MVS pour IBM ou VMS pour DEC.

Aujourdhui, linformatique, aussi bien dans les entreprises, que dans la recherche ou lenseignement, utilise des machines plus petites, fonctionnant avec des systmes dexploitation caractre universel. Parmi ces systmes dexploitation, deux se distinguent particulirement, un systme mono-utilisateur, Windows, et un autre multi-utilisateurs et multitches, Unix. Dune manire grossire et contestable avec lapparition des rseaux on peut affirmer que le premier systme est destin des ordinateurs individuels, tandis que lautre est rserv au travail en groupe. Les systmes actuels grent, par ailleurs une interface graphique, avec comme pionnier le Finder du Macintosh. Les systmes dexploitation actuels ont intgr de faon gnralise le multitches et le service

plusieurs utilisateurs avec la gnralisation des architectures client-serveur, par

exemple avec OS/2 dIBM et Windows/NT.

Parmi ces systmes, Unix, qui est le plus ancien, est celui qui offre le plus de richesses, le plus dhomognit et le plus de souplesse; il dispose, dans les versions standards, dextensions pour les rseaux et pour le graphique. Pour cette raison, nous lavons choisi comme le centre de ce cours1. Par ailleurs, le systme MS-DOS puis Windows, en voluant, ont incorpor beaucoup de caractristiques de leur prdcesseur. Les noyaux de ces systmes se modifieront certainement avec lvolution des techniques. Cependant, les principes sur lesquels ils se fondent, et plus forte raison, leur dcor , devraient rester relativement stables, au moins pour les quelques annes venir.

Ltude des systmes dexploitation forme une part trs importante de linformatique comme discipline et, la diffrence des ses autres domaines, cest une part qui lui est propre. Ceci au contraire de lalgorithmique ou de la logique, par exemple, qui se partagent avec les mathmatiques. C'est aussi une discipline technique qui plus encore que les autres est sujette au renouvellement.

On peut diviser les systmes dexploitation classiques en quatre parties

principales :

1. les processus, qui correspondent lexcution des programmes. Ces processus pouvant sexcuter simultanment dans un systme multitche. Le systme a pour fonction de les crer, de les grer, de les synchroniser, ainsi que de leur permettre de communiquer entre eux;

2. la gestion de la mmoire, qui permet de transfrer les programmes et les donnes ncessaires la cration des processus, dun support secondaire, par exemple un disque, vers un support central, o a lieu lexcution des processus. Le systme devra garder la trace des parties utilises et libres de la mmoire

ainsi que grer les transferts entre les mmoires principale et secondaire;

1 Une autre raison essentielle est la disponibilit, lISMRA, dun systme Unix en rseau.

3. le systme de fichiers, qui offre lutilisateur une vision homogne et structure des donnes et des ressources : disques, mmoires, priphriques. Le systme gre la cration des fichiers, leur destruction, leur correspondance avec les dispositifs physiques, ainsi quun certain nombre dautres caractristiques, telles que la protection. Il les organise enfin, en gnral, en une structure arborescente;

4. les entres-sorties, qui correspondent aux mcanismes quutilisent les processus pour communiquer avec lextrieur. Ces entres-sorties font largement appel aux couches les plus proches du matriel, et dont le systme tente de masquer les particularits aux utilisateurs.

Les systmes dexploitation modernes intgrent par ailleurs dautres caractristiques. Ces dernires concernent notamment deux volutions majeures des systmes informatiques. La premire est linterconnexion des diffrentes machines et des diffrents systmes par des rseaux locaux ou tendus. La seconde est la disparition des crans de textes et leur remplacement par des dispositifs fentres multiples disposant de proprits graphiques. Ces deux techniques sont, de plus, troitement imbriques. Les systmes dexploitation fonctionnent donc, ou vont fonctionner, en rseau et ils consacreront une part importante de leurs tches grer le fentrage, le graphisme, et les interactions entre les diffrentes machines. Ce cours complte les 4 parties prcdentes par des tudes sur :

5. les rseaux dordinateurs, avec les protocoles de communication, dinterconnexion et dapplication. Les rseaux permettent de mettre en uvre une nouvelle architecture informatique fonds sur des clients et des serveurs;

6. Les systmes rpartis avec les protocoles dappels de procdures distance qui leur sont associs. Les systmes rpartis actuels trouvent des applications des architectures clients-serveurs de fichiers ou d'applications, tels que des bases de donnes.

7. les systmes de fentrage graphique, ainsi que le modle de serveur dcran2.

Le systme dexploitation correspond linterface entre les applications et le matriel. Le programmeur dapplications naborde que rarement sinon jamais son code interne. Il lutilise par lintermdiaire d appels systme . Les appels systmes sont souvent accessibles partir dun langage de programmation, notamment en C avec le systme Unix. Ces appels permettent deffectuer la plupart des oprations sur les entits du systme dexploitation et, par exemple, de crer et dtruire des processus, des fichiers, de raliser des entres-sorties, etc. Une terminologie tend a simposer pour dnommer lensemble des appels systme, quils concernent un systme dexploitation ou nimporte quelle dapplication informatique : les API (Application Programming Interface).

Un utilisateur peut lui aussi dans une certaine mesure manipuler un systme dexploitation, sans pour autant avoir crer un programme. Il le fait par lintermdiaire dun interprte de commandes (un shell en anglais) muni dune syntaxe et ventuellement programmable. Cet interprte peut accepter les lignes de commandes comme sous MS-DOS ou sous Unix. Il peut aussi grer les

mtaphores graphiques comme avec les Macintoshes, Windows ou X-Window.

2 Ce dernier point fait partie dun autre cours pour les tudiants de lENSI.

Bibliographie

La bibliographie sur les systmes dexploitation est trs abondante et elle se renouvelle trs rapidement. Elle comprend la fois des revues de recherche, des ouvrages pdagogiques et des ouvrages sur la programmation et l'utilisation d'un systme particulier. La liste que nous donnons concerne ne concerne pas la recherche et nest absolument pas exhaustive. Par ailleurs, cette recherche est largement passe des laboratoires universitaires ceux de quelques industriels : Microsoft et IBM notamment. Notre liste fournit seulement les rfrences que nous pensons tre les plus utiles.

Littrature gnrale sur les systmes dexploitation

A. Tanenbaum, Modern Operating Systems, PrenticeHall, 1992, est une rfrence gnrale trs pdagogique. Distributed Computer Systems, Prentice Hall, 1994, examine plus en dtail les systmes rpartis. Operating Systems, 2nd ed., Prentice-Hall,

1997, est une rfrence par le mme auteur qui comprend le code, trs formateur, dun systme dexploitation voisin dUnix. Cette dition ne comprend pas les systmes rpartis.

A. Silberschatz and P. Galvin, Operating System Concepts, 5th ed., Addison Wesley,

1997, est un ouvrage plus conceptuel et plus thorique que le prcdent. Il reste nanmoins trs clair. Il est traduit en franais chez Addison-Welsey sous le titre Principes des systmes dexploitation mais peut tre pas ldition la plus rcente.

Sur les noyaux de systmes dexploitation commerciaux

M. Bach, La conception du systme Unix, Masson, a longtemps t louvrage de rfrence. Sa rdaction est extrmement lourde viter aprs le dessert et elle double dune traduction maladroite. Cet ouvrage est cependant une mine de

renseignements pour ceux qui veulent connatre les algorithmes internes dUnix

en dtail.

Louvrage qui prcde a inspir les firmes conceptrices dautres systmes. Ceci a donn lieu plusieurs ouvrages, en gnral plus clairs et mieux crits que leur anctre :

H.M Deitel et M.S. Kogan, La conception dOS/2, Addison-Wesley, 1992.

Helen Custer, Au cur de Windows NT, Microsoft Press, 1993.

Sur la programmation des systmes dexploitation

Le man dUnix est la meilleure rfrence pour le programmeur. Il ny a rien dquivalent sur papier.

J.M. Rifflet, La programmation sous Unix, 3e d., McGraw-Hill, 1993, est une bonne rfrence et un ouvrage assez complet.

Charles Petzold, Programming Windows 95, Microsoft Press, 1996, est une bonne rfrence pour apprendre la programmation Windows. Elle a t la premire du genre. Actuellement, il y a des dizaines douvrages quivalents.

Microsoft, Microsoft Visual C++, Version 4, Microsoft Press, 1995, est la rfrence de programmation de Microsoft. Cette encyclopdie est en 6 volumes comporte tous les appels systmes de Windows ainsi que les MFC. Elle est disponible sous forme lectronique.

Apple Computer, Inside Macintosh Series, Addison-Wesley, 1992, 1993, 1994, est une srie traitant des caractristiques du Macintosh. Elle dtaille aussi bien les mcanismes internes que les mthodes de programmation.

Sur lutilisation du systme Unix

R.S. Bourne, Le systme Unix, InterEditions, est une rfrence antique, mais qui reste un modle de clart. Lauteur est le concepteur du premier interprte de commande dUnix. La traduction comprend beaucoup de fautes, par exemple dans les listings de programmes.

B. Kernighan et R. Pike, Lenvironnement Unix, InterEditions, saxe plutt sur les outils dUnix. Il est plus difficile lire que le prcdent et il privilgie parfois la

bidouille info-maniaque.

J.L. Nebut, Unix pour lutilisateur : Commandes et langages de commandes, Technip,

1990, est une bonne rfrence sur les outils dUnix.

Sur les langages C et C++

B. Kernighan et D. Ritchie, Le langage C, 2e dition, Masson, est la seule rfrence intressante pour ceux qui ont dj des notions de programmation dans un autre langage. Toute la programmation systme se faisant actuellement en langage C, il est indispensable den possder des notions.

P.H. Winston, On to C++, Addison Wesley, 1994, est un excellent manuel la fois court et clair.

B. Stroustrup, Le langage C++, 2e d., Addisson Wesley, 1992, est une rfrence plus complte mais plus difficile lire que la prcdente.

Sur les rseaux

Apple, Understanding Computer Networks, Addisson Wesley, est une rfrence courte mais exceptionnellement claire sur les concepts des rseaux. Les illustrations sont particulirement explicatives.

A. Tanenbaum, Computer Networks, 3rd ed., Prentice-Hall, 1996, est une bonne rfrence souvent cite.

W. R. Stevens, Unix Network Programming, 2nd ed, Prentice Hall, 1997, est une excellente rfrence de programmation. De nombreux programmes trs biens expliqus.

D. Comer, Internetworking with TCP/IP, Prentice Hall, 1990, (3 volumes en collaboration) est bonne rfrence sur lensemble des protocoles constituant TCP/IP.

C. Hunt, TCP/IP Network Administration, 2nd ed, 1997, OReilly & Associates, est une excellente rfrence pour ladministration des systmes TCP/IP.

Sur les systmes de fentrage

Young, The X-Window System, Prentice-Hall, 1991, est une rfrence trs pdagogique sur la programmation de X-Window avec Motif.

Sur le langage Java

D. Flanagan, Java in a Nutshell, 2nd ed, OReilly & Associates, 1997, est une

excellente rfrence, concise et claire.

P. Niemeyer & J. Peck, Exploring Java, 2nd Edition, OReilly, 1997, est aussi

une excellente rfrence.

Chapitre 1

Les processus

1.1. Structure des processus

1.1.1. Gnralits

Les processus correspondent lexcution de tches : les programmes des utilisateurs, les entres-sorties, par le systme. Un systme dexploitation doit en gnral traiter plusieurs tches en mme temps. Comme il na, la plupart du temps, quun processeur, il rsout ce problme grce un pseudo-paralllisme. Il traite une tche la fois, sinterrompt et passe la suivante. La commutation des tches tant trs rapide, lordinateur donne lillusion deffectuer un traitement simultan.

P2

P1

systme

T

Figure 1 Le multi-tche

Les processus des utilisateurs sont lancs par un interprte de commande. Ils peuvent eux-mmes lancer ensuite dautres processus. On appelle le processus crateur, le pre, et les processus crs, les fils. Les processus peuvent donc se structurer sous la forme dune arborescence. Au lancement du systme, il nexiste

quun seul processus, qui est lanctre de tout les autres.

P 1

P 2 P 3

P 4 P 5 P 6

Figure 2 Le hirarchie des processus.

Les processus sont composs dun espace de travail en mmoire form de 3

segments : la pile, les donnes et le code et dun contexte.

Pile d'excution

Donnes

Code

Figure 3 Les segments dun processus.

Le code correspond aux instructions, en langage dassemblage, du programme excuter. La zone de donnes contient les variables globales ou statiques du programme ainsi que les allocations dynamiques de mmoire. Enfin, les appels de fonctions, avec leurs paramtres et leurs variables locales, viennent sempiler sur la pile. Les zones de pile et de donnes ont des frontires mobiles qui croissent en sens inverse lors de lexcution du programme. Parfois, on partage la zone de donnes en donnes elles-mmes et en tas. Le tas est alors rserv au donnes dynamiques.

Le contexte est form des donnes ncessaires la gestion des processus. Une table contient la liste de tous les processus et chaque entre conserve leur contexte3. Les lments de la table des processus de Minix, par exemple, ont la

forme simplifie du tableau ci-dessous.

Processus

Mmoire

Fichiers

Registres

Compteur ordinal

Pointeur sur code

Pointeur sur donnes

Masque umask

Rpertoire racine

tat du programme

Pointeur sur pile

Rpertoire de travail

Pointeur de pile

Statut de fin dexcution

Descripteurs de fichiers

Date de cration

N de signal du proc. tu

uid effectif

3 Bach, op. cit., p. 158, et Tanenbaum, op. cit., p. 60.

Temps CP utilis

PID

gid effectif

Temps CP des fils

Processus pre

Date de la proch. alarme

Groupe de processus

Pointeurs sur messages

uid rel

Bits signaux en attente

uid effectif

PID

gid rel

gid effectif

Bits des signaux

Tableau 1 Les lments du contexte de Minix.

Le nombre des emplacements dans la table des processus est limit pour chaque systme et pour chaque utilisateur.

La commutation des tches, le passage dune tche une autre, est ralise par un ordonnanceur au niveau le plus bas du systme. Cet ordonnanceur est activ par des interruptions :

dhorloge,

de disque,

de terminaux.

chaque interruption correspond un vecteur dinterruption, un emplacement mmoire, contenant une adresse. Larrive de linterruption provoque le branchement cette adresse. Une interruption entrane, en gnral, les oprations suivantes :

empilement du compteur ordinal, du registre dtat et peut tre dautres registres. La procdure logicielle dinterruption sauvegarde les lments de cette pile et les autres registres dans du contexte du processus en cours;

mise en place dune nouvelle pile permettant le traitement des interruptions;

appel de lordonnanceur;

lection dun nouveau programme;

Explication de linterruption dhorloge, puis du disque.

Nous avons vu maintenant quun processus pouvait tre actif en mmoire centrale (lu) ou suspendu en attente dexcution (Prt). Il peut aussi tre Bloqu, en attente de ressource, par exemple au cours dune lecture de disque. Le diagramme simplifi des tats dun processus est donc :

lu Prt

Bloqu

Figure 4 Les tats dun processus.

Le processus passe de ltat lu ltat prt et rciproquement au cours dune intervention de lordonnanceur. Cet ordonnanceur se dclenchant, par exemple, sur une interruption dhorloge. Il pourra alors suspendre le processus en cours, si il a dpass son quantum de temps, pour lire lun des processus prts. La transition de ltat lu ltat bloqu se produit, par exemple, loccasion dune lecture sur disque. Ce processus passera de ltat bloqu ltat prt lors de la rponse du disque. Ce passage correspond dune manire gnrale la libration dune ressource.

En fait, sous Unix, lexcution dun processus se fait sous deux modes, le mode utilisateur et le mode noyau. Le mode noyau correspond aux appels au code du noyau : write, read, Le mode utilisateur correspond aux autres instructions.

Un processus en mode noyau ne peut tre suspendu par lordonnanceur. Il passe ltat prempt la fin de son excution dans ce mode moins dtre bloqu ou dtruit . Cet tat est virtuellement le mme que prt en mmoire.

Par ailleurs, lorsque la mmoire ne peut contenir tous les processus prts, un certain nombre dentre eux sont dplacs sur le disque. Un processus peut alors tre prt en mmoire ou prt sur le disque. De la mme manire, on a des processus bloqus en mmoire ou bien bloqus sur disque.

Enfin, les processus termins ne sont pas immdiatement limins de la tables des processus ils ne le sont que par une instruction explicite de leur pre . Ceci correspond ltat dfunt.

Les tats dun processus Unix4 sont alors :

d fun t

Ex it

Excu tion en mod e

u tilisateur

Appel

s y stm e

p remp t

Interruption

Excu tion en mod e

n oy au

Blo qu en mmo ire

P rt en mmo ire

Cration

Blo qu su r d isq ue

P rt su r d isq ue

Figure 5 Les tats des processus dUnix.

4Bach, op.cit., p. 156.

1.1.2. Les processus sous Unix

Les fonctions fondamentales

Un processus peut se dupliquer et donc ajouter un nouveau processus par la fonction :

pid_t fork(void)

qui rend -1 en cas dchec. En cas de russite, la fonction retourne 0 dans le processus fils et le n du processus fils Process Identifier ou PID dans le pre. Cette fonction transmet une partie du contexte du pre au fils : les descripteurs des fichiers standards et des autres fichiers, les redirections Les deux programmes sont sensibles aux mmes interruptions. lissue dun fork() les deux processus sexcutent simultanment.

La cration dun nouveau processus ne peut se faire que par le recouvrement

du code dun processus existant grce la fonction :

int execl(char *ref, char *arg0, char *argn, 0)

ref est une chane de caractres donnant ladresse du nouveau programme substituer et excuter. arg0, arg1, , argn sont les arguments du programme. Le premier argument, arg0, reprend en fait le nom du programme.

Les fonctions execle() et execlp() ont des arguments et des effets semblables. Elle transmettent en plus respectivement la variable chemin (PATH) ou les variables denvironnement au complet.

Les fonctions int execv(char *ref, char *argv[]) ainsi que execve() et execvp() sont des variantes analogues. Les paramtres du programme lancer sont transmis dans le tableau de chanes : argv[][]. Ce

tableau est semblable aux paramtres de la fonction principale dun programme

C : main(int argc, char ** argv).

Ces fonctions rendent -1 en cas dchec.

Par exemple :

void main()

{

execl("/bin/ls", "ls", "-l", (char *) 0);

/* avec execlp, le premier argument peut ntre

que ls et non /bin/ls */

printf("pas dimpression\n");

}

La cration dun nouveau processus loccupation dun nouvel emplacement de la table des processus implique donc la duplication dun processus existant. Ce dernier sera le pre. On substituera ensuite le code du fils par le code quon dsire excuter. Au dpart, le processus initial lance tous les processus utiles au systme.

Un processus se termine lorsquil na plus dinstructions ou lorsquil excute la

fonction :

void exit(int statut)

Llimination dun processus termin de la table ne peut se faire que par son

pre, grce la fonction :

int wait(int * code_de_sortie)

Avec cette instruction, le pre se bloque en attente de la fin dun fils. Elle rendra le n PID du premier fils mort trouv. La valeur du code de sortie est relie au paramtre dexit de ce fils. On peut donc utiliser linstruction wait pour connatre la valeur ventuelle de retour, fournie par exit(), dun processus. Ce

mode dutilisation est analogue celui dune fonction. wait() rend -1 en cas

derreur.

Si le fils se termine sans que son pre lattende, le fils passe ltat defunct dans la table. Si, au contraire, le pre se termine avant le fils, ce dernier est rattach au processus initial. Le processus initial passe la plupart de son temps attendre les processus orphelins.

Grce aux 3 instructions, fork(), exec(), et wait(), on peut crire un interprte de commandes simplifi. Il prend la forme suivante :

while(1) {

/* attend commande */

lire_commande(commande, paramtres);

if (fork() != 0) {

wait(&statut); /* proc. pre */

} else {

execv(commande, paramtres); /* proc. fils */

}

}

Les fonctions Unix rendent -1 en cas derreur. Dans ce cas, elles positionnent la variable entire globale errno. On peut imprimer cette valeur derreur et constater la cause qui est dcrite dans le fichier errno.h. On peut aussi imprimer le texte en clair avec la fonction perror(char*). Dans le cas dune programmation professionnelle, il est indispensable de vrifier la valeur de retour de toutes les fonctions et de se protger des erreurs par un codage du type :

if ((retour = fonction()) == -1) {

perror("plantage");

exit(0);

}

Les signaux

Linstruction :

int kill(int pid, int signal)

permet un processus denvoyer un signal un autre processus. pid est le n du processus dtruire et signal, le n du signal employ. La fonction kill correspond des interruptions logicielles.

Par dfaut, un signal provoque la destruction du processus rcepteur, condition bien sr, que le processus metteur possde ce droit de destruction.

La liste des valeurs de signal comprend, entre autres :

Nom du

signal

N du signal Commentaires

SIGUP

1

signal mis lors dune dconnexion

SIGINT

2

^C

SIGQUIT

3

^\

SIGKILL

9

signal dinterruption radicale

SIGALRM

14

signal mis par alarm(int sec) au bout

de sec secondes

SIGCLD

20

signal mis par un fils qui se termine, son

pre

Tableau 2 Quelques signaux dUnix.

Les valeurs des signaux dpendent de limplantation. La liste complte est

dfinies par des macros dans signal.h

kill() rend 0 en cas de succs et -1 en cas dchec.

Un processus peut dtourner les signaux reus et modifier son comportement

par lappel de la fonction :

void (*signal(int signal, void (* fonction)(int)))

avec fonction pouvant prendre les valeurs:

Nom Action

SIG_IGN le processus ignorera linterruption correspondante

SIG_DFL le processus rtablira son comportement par dfaut lors de

larrive de linterruption (la terminaison)

void fonction(int n) le processus excutera fonction, dfinie par lutilisateur, larrive de linterruption n. Il reprendra ensuite au point o il a t interrompu

Tableau 3 Les routines d'interruption dUnix.

Lappel de la fonction signal positionne ltat des bits de signaux dans la

table des processus.

Par ailleurs, la fonction signal(SIGCLD, SIG_IGN), permet un pre dignorer le retour de ses fils sans que ces derniers encombrent la table des processus ltat defunct.

Quelques fonctions didentification dUnix

La commande Unix ps -ef, donne la liste des processus en activit sur le systme. Chaque processus possde un identificateur et un groupe. On les obtient par les fonctions :

int getpid(void)

et

int getpgrp(void)

Les fils hritent du groupe de processus du pre. On peut changer ce groupe par la fonction :

int setpgrp(void)

Chaque processus possde, dautre part, un utilisateur rel et effectif. On les

obtient respectivement par les fonctions :

int getuid(void)

et

int geteuid(void)

Lutilisateur rel est lutilisateur ayant lanc le processus. Le numro dutilisateur effectif sera utilis pour vrifier certains droits daccs (fichiers et envoi de signaux). Il correspond normalement au numro dutilisateur rel. On peut cependant positionner lutilisateur effectif dun processus au propritaire du fichier excutable. Ce fichier sexcutera alors avec les droits du propritaire et non avec les droits de celui qui la lanc. La fonction :

int setuid(int euid)

permet de commuter ces numros dutilisateur de lun lautre : rel effectif et vice-versa. Elle rend 0 en cas de succs.

1.2. Les fils dexcution

Les interfaces graphiques, les systmes multi-processeurs ainsi que les systmes rpartis ont donn lieu une rvision de la conception usuelle des processus. Cette rvision se fonde sur la notion de fils dexcution (thread of control). Un processus classique est compos dun espace dadressage et dun seul fil de commande. Lide est dassocier plusieurs fils dexcution un espace dadressage et un processus. Les fils dexcution sont donc des processus dgrads (sans espace dadressage propre) lintrieur dun processus ou dune application. On les appelle aussi des processus poids plume ou poids lger.

1.2.1. Pourquoi des fils dexcution

Certaines applications se dupliquent entirement au cours du traitement. Cest notamment le cas pour des systmes client-serveur, o le serveur excute un fork, pour traiter chacun de ses clients. Cette duplication est souvent trs coteuse. Avec des fils dexcution, on peut arriver au mme rsultat sans gaspillage despace, en ne crant quun fil de contrle pour un nouveau client, et en conservant le mme espace dadressage, de code et de donnes. Les fils dexcution sont, par ailleurs, trs bien adapts au paralllisme. Ils peuvent sexcuter simultanment sur des machines multi-processeurs.

1.2.2. De quoi sont constitus les fils dexcution

lments dun fil de commande lments dun processus ordinaire

Compteur de programme

Pile

Registres

Fils de commande fils

Statut

Espace dadressage

Variables globales

Table des fichiers ouverts

Processus fils Compteurs Smaphores

Tableau 4 Le contexte compar dun fil de commande et dun processus.

Les lments dun processus sont communs tous les fils dexcution de ce

processus.

1.2.3. Utilisation des fils dexcution

Lavantage essentiel des fils dexcution est de permettre le paralllisme de traitement en mme temps que les appels systme bloquants. Ceci impose une coordination particulire des fils dexcution dun processus. Dans une utilisation optimale, chaque fil de commande dispose dun processeur. A. Tanenbaum, dans

Modern Operating Systems, distingue trois modles dorganisation possibles : le modle rpartiteur/ouvrier (dispatcher/worker), lquipe et le pipeline.

Le modle rpartiteur/ouvrier

Dans ce modle, les demandes de requtes un serveur arrivent dans une botes aux lettres. Le fil de commande rpartiteur a pour fonction de lire ces requtes et de rveiller un fil de commande ouvrier. Le fil de commande ouvrier gre la requte et partage avec les autres fils dexcution, la mmoire cache du serveur. Cette architecture permet un gain important car elle vite au serveur de se

bloquer lors de chaque entre-sortie.

Rpartiteur

Serveur de fichier

Fil de commande

Cache partag

Arrive de la requte

Bote aux lettres

Figure 6 Le rpartiteur

Lquipe

Dans le modle de lquipe, chaque fil de commande traite une requte. Il ny a

pas de rpartiteur. la place, on met en implante une file de travaux en attente.

Arriv e de la requte

Figure 7 Lquipe

Le pipeline

Dans le modle du pipeline, chaque fil de commande traite une partie de la

requte. Plusieurs architecture matrielles implantent ce type dorganisation. Ce

modle nest cependant pas appropri pour toutes les applications.

Arriv e de la requte

Figure 8 Le pipeline

1.2.4 Limplantation des fils dexcution avec Java

Le langage Java permet de construire des applications et des appliquettes. Les appliquettes sont des petits programmes chargeables dans un navigateur de rseau. Java, grce ses classes de base, fournit la possibilit de crer des fils dexcution au niveau du langage de programmation.

Crer un fil de commande

Crer un fils dexcution peut se faire en crant une sous classe de la classe Thread et en crant ensuite un objet appartenant cette sous classe5. Lobjet hritera des mthodes (des fonctions membres) de la classe et elle permettront sa gestions.

Les mthodes de la classe Thread sont notamment :

start() qui dmarre le fil de commande;

stop() qui larrte dfinitivement ;

run() le corps du fil qui est excut aprs le lancement par start() ;

sleep() qui le met en veille pour un temps paramtrable ;

suspend() qui le suspend qui le met en attente jusqu nouvel ordre ;

resume() qui reprend lexcution du fil de commande;

yield() qui laisse passer son tour dexcution.

Le modle dexcution des fils de Java peut se reprsenter par un automate dtats.

5 On peut aussi donner une classe Java des capacits mult-tche en la faisant driver par

implements de linterface Runnable. Nous nexaminerons pas ces possibilits ici.

Blocked

supsend() sleep() wait()

stop()

Newborn

stop()

Dead

start()

resume()

notify()

stop()

Runnable

yield()

Running

Figure 9 Les tats des fils dexcution de Java.

Un exemple

Lexemple qui suit cre et lance deux fils dexcution Afficheur. Chaque fil imprime son nom lcran et son nombre de passage pendant quil sexcute. Une fois compil, on doit excuter le programme avec linterprte java :

> java Lanceur

class Lanceur {

public static void main (String args[]) {

new Afficheur("Moi").start();

new Afficheur("LAutre").start();

}

}

class Afficheur extends Thread {

public Afficheur(String str) {

super(str);

}

public void run() {

for (int i = 0; i < 10; i++) { System.out.println(getName()+ " " + i + "

passage(s)");

try {

sleep((int)(Math.random()*1000));

} catch (InterruptedException e) {}

}

System.out.println("Termin" + getName());

this.stop();

}

}

1.2.5. Limplantation des fils dexcution sous Windows NT

Les fils dexcution peuvent tre implants dans lespace utilisateur ou dans le noyau. Actuellement, peu de systmes dexploitation incluent des fils dexcution dans leur noyau. Plusieurs bibliothques externes existent, par exemple les processus poids lgers de Sun. Ce nest pas le cas de Windows NT qui a t conu demble avec des fils dexcution.

Windows NT peut se programmer deux niveaux : en C ou bien en C++. La programmation en C se fait par les API du Software Development Kit. La programmation en C++ se fait par lintermdiaire des Microsoft Foundation Classes qui encapsule les entits du systme.

Un processus sous Windows est une instance dapplication qui possde un espace dadressage, de la mmoire, des fichiers et des fentres ouvertes. On cre un nouveau processus par la fonction CreateProcess(). Ce processus comprendra un fil de commande. On peut lui en ajouter dautres avec le fonction :

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD

cbStack, LPTHREAD_START_ROUTINES, lpSStartAddr,

LPVOID lpThreadParm, DWORD fdwCreate, LPDWORD

lpIDThread).

Un fil de commande peut sassurer lexclusivit dune ressource par la fonction WaitForSingleObject() qui correspond un P de smaphore dexclusion mutuelle. On libre le smaphore par un ReleaseMutex(). Les fonctions InterLockedIncrement() et InterLockedDecrement() sont applicables des smaphores gnraliss.

1.3. Communication entre les processus

Les processus peuvent communiquer par lintermdiaire de fichiers. Nanmoins, certains systmes dexploitation fournissent des mcanismes permettant les communications directes.

Le signe | , par exemple, de linterprte de commandes Unix, reli lappel systme pipe(), permet deux processus de sexcuter en mme temps. Le premier fournissant des donnes que le second exploite au fur et mesure de leur production.

1.3.1. Les tubes de communication avec Unix

Le systme Unix offre des primitives qui permettent de synchroniser facilement des processus lecteurs et crivains dans un tampon sans passer par des smaphores. Lappel de la fonction du noyau pipe() cre un tampon de donnes, un tube, dans lequel deux processus pourront venir respectivement lire et crire. La fonction fournit, dautre part, deux descripteurs, analogues aux descripteurs de fichiers, qui serviront de rfrence pour les oprations de lecture et dcriture. Le systme ralise la synchronisation de ces oprations de manire interne.

Les deux processus communicants doivent partager les mmes descripteurs obtenus par pipe(). Il est donc commode quils aient un anctre commun car les descripteurs de fichiers sont hrits. Dans lexemple suivant, deux processus, un pre et un fils communiquent par lintermdiaire dun tube. Le pre crit les lettres de lalphabet que lit le fils :

void main () {

int df[2]; // descripteur du tube

char c, d; // caractre de lalphabet

int ret;

pipe(df); // On cre le tube

if (fork() != 0) { // On est dans le pre close (df[0]); // Le pre ne lit pas for (c = 'a'; c 0) {// Fils lit tube

printf("%c\n", d);// Il crit le rsultat

}

close (df[0]); // On ferme le tube en lecture

}

}

La dclaration int file[2], et lappel de la fonction int pipe(file) cre un tampon interne et deux descripteurs de fichiers. Lun ouvert en lecture : file[0] et lautre en criture : file[1]. La fonction pipe() rend 0 ou -1 en cas dchec.

La fonction int open(char * ref, int mode) ouvre un fichier dont le nom est contenu dans ref et rend un descripteur de fichier. En cas dchec, elle rend -1. Les modes sont en lecture O_RDONLY (0), en criture

O_WRONLY, (1), en lecture-criture O_RDWR (2). Il existe dautres modes, par exemple, lajout O_APPEND; ils sont dcrits dans le fichier fcntl.h. On combine les modes par un ou binaire : O_WRONLY | O_APPEND dclare une ouverture en criture et ajout.

Les descripteurs de fichiers remarquables sont 0 pour lentre standard, le clavier, 1 pour la sortie standard, lcran, et 2 pour la sortie derreur standard, lcran encore.

int close(int desc) ferme le fichier de descripteur desc.

int read(int desc, char *buf, int n), permet de lire dans le fichier de descripteur desc, n caractres qui seront contenus dans le tampon point par buf.

int write(int desc, char *buf, int n) permet dcrire dans le fichier de descripteur desc, n caractres, contenus dans le tampon point par buf.

Lorsque linterprte de commande reconnat une commande du type :

processus1 | processus2 , il excute un programme de la forme :

void synchro(char * processus1, char * processus2) { int df[2]; /* descripteurs du tube */ pipe(df);/* cration du tube */

if (fork() != 0) {

close(df[0]); /* fermeture lecture */

close(1); /* pas dcriture sur lcran */ dup(df[1]); /* df[1] devient sortie standard */ close(df[1]); /* inutile aprs redirection */ execl(processus1, processus1, 0);

} else {

close(df[1]); /* fermeture criture */ close(0); /* pas de lecture clavier */ dup(df[0]); /* df[0] devient entre standard */ close(df[0]); /* inutile aprs redirection */ execl(processus2, processus2, 0);

}

}

La fonction int dup(int desc) affecte au plus petit descripteur disponible le fichier donn par desc.

Pour utiliser les fonctions Unix de base, il faut en gnral inclure fcntl.h,

unistd.h et stdlib.h.

1.3.2 Les tubes de communication avec Java

Avec Java, on dispose dun mcanisme semblable Unix. Un tube en Java se compose de deux demi-tubes drivs des classes PipedInputStream et PipedOutputStream que lon connecte par la fonction membre connect().

Dans lexemple qui suit, deux fils communiquent par un tube. Un fil dexcution lit des caractres du clavier, les transmets dans le tube et un autre fil les crit sur lcran en les passant en majuscules. Ils font chacun dix tours de boucles.

Un fil crit dans

PipedOutputStream

Le tube

Figure 10 Les tubes en Java.

Un autre fil lit dans

PipedInputStream

import java.io.*;

class ExThread {

public static void main (String args[]) {

PipedInputStream sortieLecture = new PipedInputStream();

PipedOutputStream entreeEcriture = new PipedOutputStream();

try {

sortieLecture.connect(entreeEcriture);

} catch (IOException EOut) {}

new Ecrivain("Ecrivain", entreeEcriture).start();

new Lecteur("Lecteur", sortieLecture).start();

}

}

class Ecrivain extends Thread {

private PipedOutputStream entreeEcriture;

public Ecrivain(String str, PipedOutputStream entreeEcriture) {

super(str);

this.entreeEcriture = entreeEcriture;

}

public void run() {

byte caractere[] = new byte [80];

for (int i = 0; i < 10; i++) {

try {

System.in.read(caractere);

} catch (IOException eIn) {}

try {

caractere[0]);

}

entreeEcriture.write(caractere[0]);

} catch (IOException eOut) {}

System.out.print(getName() + " a crit dans le tube\t" +

System.out.println("\t(" + i + " passage(s))");

System.out.println(getName() + " Termin");

this.stop();

}

}

class Lecteur extends Thread {

private PipedInputStream sortieLecture;

public Lecteur(String str, PipedInputStream sortieLecture) {

super(str);

this.sortieLecture = sortieLecture;

}

public void run() {

char car[] = new char[80];

for (int i = 0; i < 10; i++) {

try {

car[0] = (char) sortieLecture.read();

}catch (IOException IOut) {}

System.out.print(getName() + " a lu dans le tube\t" +

Character.toUpperCase(car[0]));

System.out.println( "\t(" + i + " passage(s))");

}

System.out.println(getName() + " Termin");

this.stop();

}

}

1.3.3. Les messages

Les messages forment un mode de communication privilgi entre les processus. Ils sont utiliss dans le systme pdagogique Minix de Tanenbaum. Ils sont au cur de Mach quon prsente comme un successeur possible dUnix et qui a inspir Windows NT pour certaines parties. Par ailleurs, ils sadaptent trs bien une architecture rpartie et leur mode de fonctionnement est voisin des changes de donnes sur un rseau.

Les communications de messages se font travers deux oprations fondamentales : envoie(message) et reois(message). (send et receive). Les messages sont de tailles variables ou fixes. Les oprations denvoi et de rception peuvent tre soit directes entre les processus, soit indirectes par lintermdiaire dune bote aux lettres.

Les communications directes doivent identifier le processus, par un n et une machine, par exemple. On aura alors : envoie(Proc, Message) et reois(Proc, Message). Dans ce cas la communication est tablie entre deux processus uniquement, par un lien relativement rigide et bidirectionnel. On peut rendre les liaisons plus souples en laissant vide lidentit du processus dans la fonction reois.

Les communications peuvent tre indirectes grce lutilisation dune bote aux lettres (un port dans la terminologie des rseaux). Les liens peuvent alors unir plus de deux processus du moment quils partagent la mme bote aux lettres. On devra nanmoins rsoudre un certains nombre de problmes qui peuvent se poser, par exemple, si deux processus essayent de recevoir simultanment le contenu dune mme bote.

Les communications se font de manire synchrone ou asynchrone. Le synchronisme peut se reprsenter par la capacit dun tampon de rception. Si le tampon na pas de capacit, lmetteur doit attendre que le rcepteur lise le message pour pouvoir continuer. Les deux processus se synchronisent sur ce transfert et on parle alors dun rendez-vous . Deux processus asynchrones : P et

Q, peuvent aussi communiquer de cette manire en mettant en uvre un mcanisme dacquittement :

P Q

envoie(Q, message)

reois(Q, message)

reois(P, message)

envoie(P, acquittement)

Tableau 5 Les fonctions de messages.

1.3.4. La mmoire partage

On peut concevoir des applications qui communiquent travers un segment de mmoire partage. Le principe est le mme que pour un change dinformations entre deux processus par un fichier. Dans le cas dune zone de mmoire partage, on devra dclarer une zone commune par une fonction spcifique, car la zone mmoire dun processus est protge.

Le systme Unix fournit les primitives permettant de partager la mmoire. NT aussi sous le nom de fichiers mapps en mmoire. Ces mcanismes, bien que trs rapides, prsentent linconvnient dtre difficilement adaptables aux rseaux. Pour les communications locales, la vitesse est sans doute semblable celle de la communication par un fichier cause de la mmoire cache. Lorsquil a besoin de partager un espace mmoire, le programmeur prfrera utiliser des fils dexcution.

1.4. Exclusions entre les processus

Lexclusion a pour but de limiter laccs une ressource un ou plusieurs processus. Ceci concerne, par exemple, un fichier de donnes que plusieurs processus dsirent mettre jour. Laccs ce fichier doit tre rserv un utilisateur pendant le moment o il le modifie, autrement son contenu risque de ne plus tre cohrent. Le problme est semblable pour une imprimante o un utilisateur doit se rserver son usage le temps dune impression. On appelle ce domaine dexclusivit, une section critique.

1.4.1. Lattente active sur un verrou

La faon la plus ancienne de raliser lexclusion mutuelle sous Unix est deffectuer un verrouillage sur une variable partage. Cette opration de verrouillage doit tre indivisible (atomique). Lorsque le verrou est pos sur la variable, les processus excutent une attente active. Lorsquil se lve, un processus, et un seul, pose un nouveau verrou sur la variable et rentre dans la section critique. Il sait quil aura lexclusivit dune ressource, un fichier par exemple :

Processus 1 Processus 2

while (pos_ver(var) == chec)

rien; section_critique(); lve_ver(var);

while (pos_ver(var) == chec)

rien; section_critique(); lve_ver(var);

Tableau 6 Attente active sur un verrou.

Dans les vieilles versions dUnix, la variable de verrouillage correspondait souvent un fichier sans droits que chacun des processus tente de crer. Lorsquun processus termine sa section critique, il dtruit le fichier de verrouillage, laissant ainsi sa place dautres. On crera le verrou dans /tmp6, par exemple, de manire ce que tout le monde puisse le dtruire. Enfin, pour que ce procd

fonctionne, il est ncessaire que tous les processus cooprent.

6 Car /tmp est un rpertoire dont les droits sont : rwx rwx rwx

void main()

{

int desc; /* descripteur fichier de ressource */

int desc_verr; /* descripteur fichier verrou */

char i;

/* attente active */

while ((desc_verr = creat("/tmp/verrou", 0000)) == -1)

;

section_critique();

close(desc_verr); /* fermeture du verrou */

unlink("/tmp/verrou"); /* destruction du verrou */

}

int creat(char * ref_fichier, int mode) rend le descripteur du fichier ouvert en criture, ou -1 en cas dchec. mode dfinit les droits daccs, 0777 p. ex. Le mode rel est obtenu par un ET binaire avec le paramtre cmask positionn par la fonction :

int umask(int cmask)

int close(int desc_fichier) ferme le fichier considr. Cette fonction rend 0 en cas de succs et 1 en cas dchec.

int unlink(char * ref_fichier) dtruit le fichier dont le nom est pass en paramtre. Cette fonction rend 0 en cas de succs et 1 en cas dchec.

Au niveau du processeur, les variables de verrouillage se ralisent par une instruction de type Test and Set Lock (TSL).

On nutilise plus dsormais cette faon de procder. On prfre la fonction flock(int fd, int opration) qui a les mmes fonctionnalits. Elle permet un processus de verrouiller laccs un fichier de descripteur fd avec un verrou exclusif. Dans ce cas, opration est gal LOCK_EX. flock() est bloquante si le fichier est dj verrouill. Le processus qui excute cette fonction

attendra sil y a dj un processus ou posera le verrou et passera si la voie est libre. On retire le verrou avec la mme fonction. Lopration est LOCK_UN. Un processus bloqu passera donc lorsque le premier processus aura retir son verrou. Le fichier den-tte inclure est .

1.4.2. Les smaphores

Gnralits

Le concept de smaphore permet une solution lgante la plupart des problmes dexclusion. Ce concept ncessite la mise en uvre dune variable, le smaphore, et de deux oprations atomiques associes P et V. Soit sma la variable, elle caractrise les ressources et permet de les grer. Lorsquon dsire effectuer un exclusion mutuelle entre tous les processus par exemple, il ny a virtuellement quune seule ressource et on donnera sma la valeur initiale de 1.

Lorsquun processus effectue lopration P(sma) :

si la valeur de sma est suprieure 0, il y a alors des ressources disponibles,

P(sma) dcrmente sma et le processus poursuit son excution,

sinon ce processus sera mis dans une file dattente jusqu la libration dune

ressource.

Lorsquun processus effectue lopration V(sma) :

si il ny a pas de processus dans la file dattente, V(sma) incrmente la valeur de sma,

sinon un processus en attente est dbloqu.

P(sma) correspond donc une prise de ressource et V(sma) une

libration de ressource. Dans la littrature, on trouve parfois dautres

terminologies, respectivement, wait(sma) et signal(sma)7, ou

get(sma) et release(sma).

Le problme des producteurs et des consommateurs

Ce problme est un des cas dcole favoris sur les processus. Deux processus se partagent un tampon de donnes de taille N. Un premier processus produit des donnes et les crit dans le tampon. Un second processus consomme les donnes du tampon en les lisant et en les dtruisant au fur et mesure de leur lecture. Initialement, le tampon est vide. La synchronisation de ces deux processus peut se raliser grce des smaphores.

Les processus producteur et consommateur doivent accder de manire exclusive au tampon, le temps dune lecture ou dune criture. Un smaphore dexclusion mutuelle est donc ncessaire. Dautre part, on peut considrer que les ressources du processus producteur sont les emplacements vides du tampon, alors que les emplacements pleins sont les ressources du processus consommateur. Au dpart, le tampon tant vide, les ressources de consommation sont nulles, alors que les ressources de production correspondent la taille du tampon.

On obtient le programme suivant :

7 Le sens associ ces dnominations, bien que trs utilises, n'apparat pas trs clairement.

#define N 100 /* taille du tampon */

sma mutex = 1; /* sma dexclusion mut. */

sma production = N; /* sma places vides */

sma consommation = 0; /* sma places pleines */

void consommateur() {

while (1) {

P(consommation); /* une place pleine en moins */ P(mutex); /* section critique */ vider_case();

V(mutex); /* fin section critique */

V(production); /* une place vide en plus */

}

}

void producteur() {

while (1) {

P(production); /* une place vide en moins */ P(mutex); /* section critique */ remplir_case();

V(mutex); /* fin section critique */

V(consommation); /* une place pleine en plus */

}

}

Les smaphores sous Unix

Le systme Unix, dans la plupart de ses versions, fournit maintenant des smaphores. Les smaphores ne correspondent cependant pas une programmation classique de ce systme. On leur prfre les verrous ou bien les tubes quand cest possible. Par ailleurs, les paramtres des fonctions smaphores peuvent tre lgrement diffrents suivant les versions dUnix. En cas de doute, consultez le manuel.

chacune des tapes de la manipulation dun smaphore :

1. Dclaration : Type Smaphore sma;

2. Initialisation : sma fichier abcd

^D

et sur un terminal, par la commande :

$ cat > /dev/tty abcd

^D

Le systme de fichiers rpartis NFS permet des oprations similaires travers un rseau.

3.1.2. La structure dun systme de fichiers

1. Le modle hirarchique

Les systmes dexploitation modernes adoptent une structure hirarchique des fichiers. Chaque fichier appartient un groupe dautres fichiers et chaque groupe appartient lui mme un groupe dordre suprieur. On appelle ces groupes, des rpertoires, ou des dossiers17, suivant les terminologies.

17 Ce terme, folder en anglais, consacr par le MacIntosh et repris par Windows 95, est nettement plus cohrent que le prcdent. Cependant, il est peu utilis par les informaticiens purs et durs , c'est pourquoi nous garderons la dsignation rpertoire .

Le schma de la structure gnrale dun systme de fichiers prend laspect dun arbre, form au dpart dun rpertoire racine recouvrant des priphriques et notamment un ou plusieurs disques. Dans chacun des rpertoires on pourra trouver dautres rpertoires ainsi que des fichiers de donnes ordinaires.

Figure 27 Une vue du gestionnaire de fichiers dOpen Look

2. Les rpertoires et ladressage dun fichier

Les rpertoires sont, eux aussi, des fichiers, constitus des noms et des rfrences de tous les fichiers quils contiennent. Cette structure permet alors de construire larborescence du systme. Pour dsigner un fichier quelconque, il suffit de spcifier lenchanement des rpertoires ncessaires son accs, partir de la racine. Dans le systme Unix, les rpertoires de cet enchanement sont spars par une oblique : / . Dans le systme DOS, par une contre-oblique : \ .

Dans le systme Unix, chaque rpertoire contient aussi sa propre rfrence, ainsi que celle du rpertoire immdiatement suprieur. . dsigne le rpertoire courant, et .. , le rpertoire suprieur. Linclusion de ces deux rfrences permet de dsigner un fichier quelconque, relativement au rpertoire courant.

Pour effectuer des entres-sorties par une dsignation relative, un processus ne peut sexcuter que dans un rpertoire. La rfrence de ce fichier est donc conserve dans la table de chaque processus.

En dehors des fichiers ordinaires et des rpertoires, nous avons vu que le systme Unix possde des fichiers spciaux de priphriques blocs et caractres. Il connat aussi les tubes nomms, qui sont des structures FIFO (FirstIn-FirstOut) permettant la communication entre processus.

La commande ls -l permet de vrifier le type des fichiers : dsigne les fichiers ordinaires, d les rpertoires, c les priphriques caractres, b les priphriques blocs, et p les tubes nomms.

3.1.3. Accs aux lments dun fichier

Les fichiers de donnes sur disques se composent dun ensemble de blocs, comprenant un nombre fixes doctets. La premire structure possible de ces fichiers correspond la suite des octets des blocs; ces blocs tant ordonns. Laccs un octet se fait alors par un dplacement partir de lorigine du premier bloc : le dbut du fichier. Le systme Unix, ainsi que le systme DOS ne connaissent que cet accs.

Certains systmes structurent les fichiers sous la forme denregistrements squentiels de tailles fixes, lensemble des blocs tant toujours ordonn linairement. Ce principe est peu prs le mme que le prcdent. Il permet de lire, de substituer un lment ou den ajouter dautres la fin, mais on ne peut pas en dtruire ou en insrer de nouveaux au milieu du fichier.

Laccs squentiel index est une mthode plus labore, mise en uvre, entre autres, sur les systmes MVS dIBM. On structure les blocs des fichiers sous la forme dun arbre. Cette structure permet linsertion dlments nimporte quel endroit dun fichier.

3.2. Les blocs du disques

Les fichiers de donnes sur les disques se rpartissent dans des blocs de taille

fixe correspondant des units dentres-sorties du contrleur de ce priphrique.

La lecture ou lcriture dun lment dun fichier impliquera donc le transfert du bloc entier qui contient cet lment. On peut formater les disques, les rendre utilisables par le systme dexploitation , avec une taille particulire de blocs. Cette taille rsulte dun compromis entre la vitesse daccs aux lments des fichiers et lespace perdu sur le disque.

Lors dun transfert de donnes dun disque vers lespace dadressage dun processus, le temps de lecture ou dcriture sur le disque est ngligeable devant le temps daccs au bloc, et ceci quelque soit la taille du bloc. Pour un accs rapide, on aura donc intrt prendre des blocs de grande taille. Cependant, les fichiers, y compris les fichiers de 1 octet, ont une taille minimale de 1 bloc. Si un disque comprend beaucoup de fichiers de petite taille et si les blocs sont de grandes dimensions, lespace gaspill sera alors considrable.

Des tudes sur de nombreux systmes ont montr que la taille moyenne dun fichier est de 1 Ko18. Ce chiffre recouvre bien sr de grandes variations entre, par exemple, une base de donnes et un ordinateur usage pdagogique. Il conduit des tailles courantes de blocs de 512, de 1024, ou de 2048 octets.

Chaque disque conserve, dans un ou plusieurs blocs spcifiques, un certain nombre dinformations de fonctionnement, telles par exemple que le nombre de ses blocs, leur taille,. Il mmorise aussi en gnral lensemble de ses blocs ainsi que leur tat dans une table. Si cette table est binaire, un disque de n blocs devra alors rserver une table de n bits; la position de chaque bit indiquant si le bloc est libre ou si il est utilis par un fichier, par exemple, 0 pour un bloc occup et 1 pour un bloc libre. Certains systmes stockent lensemble des blocs libres dans une liste chane.

3.3. La rpartition physique des fichiers en blocs

18 Tanenbaum, op. cit., p. 285.

chaque fichier correspond une liste de blocs contenant ses donnes. Lallocation est en gnrale non contigu et les blocs sont donc rpartis quasi- alatoirement sur le disque. Les fichiers conservent lensemble de leurs blocs suivant deux mthodes : la liste chane et la table dindex.

3.3.1. La liste chane

Lensemble des blocs dun fichier peut tre chane sous la forme dune liste. Chaque bloc contiendra des donnes ainsi que ladresse du bloc suivant. Le fichier devant mmoriser indpendamment le numro du 1er bloc. Par exemple, si un bloc comporte 1024 octets et si le numro dun bloc se code sur 2 octets, 1022 octets seront rservs aux donnes et 2 octets au chanage du bloc suivant.

Figure 28

Cette mthode rend laccs alatoire aux lments dun fichier particulirement inefficace lorsquelle est utilise telle quelle. En effet pour atteindre un lment sur le bloc n dun fichier, le systme devra parcourir les n-1 blocs prcdents.

Le systme MS-DOS utilise des listes chanes. Il conserve le premier bloc de chacun des fichiers dans son rpertoire. Il optimise ensuite laccs des blocs suivants en gardant leurs rfrences dans une Table dAllocation de Fichiers (FAT). Chaque disque dispose dune FAT et cette dernire possde autant dentres quil y a de blocs sur le disque. Chaque entre de FAT contient le numro du bloc suivant.

Avec la table suivante19 :

19 Reprise de Tanenbaum, op. cit., p. 288.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

X

X

EOF

13

2

9

8

L

4

12

3

L

EOF

EOF

L

BE

Figure 29

o XX indique la taille du disque, L dsigne un bloc libre et BE un bloc endommag, le fichier commenant au bloc 6, sera constitu des blocs : 6

8 4 2.

Le parcours de la FAT est nettement plus rapide que la chane des blocs. Cependant si elle nest pas constamment, tout entire en mmoire, elle ne permet pas dviter les entres-sorties du disque.

3.3.2. La table dindex

Le systme Unix rpertorie chaque fichier par un numro unique pour tout un disque. chaque numro, correspond un enregistrement, un nud dindex, (i- node), comportant un nombre fix de champs. Parmi ces champs, certains, 13 au total, mmorisent lemplacement physique du fichier. Les 10 premiers champs (sur les 13) contiennent les numros des 10 premiers blocs composant le fichier.

Nud dindex

bloc n 1

bloc n 2

bloc n 3

bloc n 4

Figure 30

Pour les fichiers de plus de 10 blocs, on a recours des indirections. Dans le cas du systme Unix, le bloc n 11 contient le numro dun bloc compos lui- mme dadresses de blocs de donnes. Si les blocs ont une taille de 1024 octets et si ils sont numrots sur 4 octets, le bloc n 11 pourra dsigner jusqu 256 blocs. Au total, le fichier utilisant la simple indirection aura alors une taille maximale de

266 blocs. De la mme manire, le bloc n 12 contient une adresse, un pointeur, double indirection, et le bloc n 13, un pointeur triple indirection. Avec

lexemple que nous avons donn, un fichier peut avoir une taille maximale de 16

Go quand il utilise ces pointeurs triple indirection.

Bloc n 11

Bloc n 12

Bloc n 13

Pointeur simple

indirection

Pointeur double

indirection

Pointeur triple indirection

Figure 31

3.4. Les dossiers ou les rpertoires

Les rpertoires des systmes de fichiers hirarchiques sont des fichiers dont le contenu est particulier. Ils permettent de rfrencer et de retrouver physiquement les fichiers immdiatement en dessous deux dans la hirarchie. La structure la plus commune des rpertoires prend la forme dun arbre, que nous avons illustr au paragraphe 1. On peut parfois mettre en uvre des structures plus complexes, de graphes acycliques ou de graphes gnraliss.

Un graphe permet deux rpertoires de rfrencer le mme fichier. On a ainsi le moyen de partager un fichier entre, par exemple, deux utilisateurs. En gnral, on construit les rpertoires de manire viter les cycles :

Figure 32

ci :

Cependant, on peut parfois construire des structures cycliques, telle que celles-

Figure 33

3.4.1. Les rpertoires du systme MS-DOS

Les rpertoires du systme MS-DOS possdent une entre par fichier et chaque entre la structure suivante :

Nom du fichier

Extension

Attributs

Rserv

Heure

Date

N du 1er bloc

Taille

Figure 34

Le numro du premier bloc, cluster dans la terminologie MS-DOS, indexe la Fat et permet de retrouver la suite des lments du fichier.

3.4.2. Les rpertoires dUnix

Les rpertoires du systme Unix disposent, eux aussi, dune entre par fichier. Chaque entre possde au moins les deux champs suivants, le numro du nud dindex et le nom du fichier. Par exemple :

26

.

59

..

267

toto

534

titi

Figure 35

La structure exacte dune entre varie suivant les versions dUnix. Dans la

version System V, elle dcrite par le fichier den-tte

/usr/include/sys/dir.h.

On peut visualiser, et interprter, le contenu du rpertoire courant, par exemple, grce la commande :

od -c .

3.4.3. Structure et manipulation des nud dindex

Le numro du nud dindex renvoie un enregistrement sur le disque contenant les numros des blocs, comme on la prsent au paragraphe prcdent. Cet enregistrement contient aussi des informations, concernant la gestion des fichiers20, dont les principales sont les suivantes :

Nud dindex

Uid du propritaire

Gid du propritaire

Type du fichier

Permissions

Nombre de liens

Taille du fichier

Date de cration

Date du dernier accs

Date de dernire modif.

13 numros de blocs et de

pointeurs

Figure 36

20 Bach, p. 64, op. cit.

Lorsquon manipule des fichiers, les nuds dindex correspondants, auxquels sajoutent quelques champs supplmentaires, sont chargs en mmoire. Parmi les champs supplmentaires, on trouve notamment divers indicateurs, de verrouillage du nud en mmoire, dattente de processus sur le nud, de modification en mmoire, du nud ou du fichier, non encore reporte sur le disque. Le nud en mmoire contient aussi, le numro du priphrique (du disque) sur lequel se trouve le fichier, le numro du nud dindex, le nombre de fois o le fichier a t charg en mmoire (le nombre douvertures en cours)21.

Pendant lexcution dun appel systme concernant un fichier, le nud dindex se verrouille. Deux processus ne peuvent donc pas effectuer, simultanment, une opration sur le mme fichier. En cas de conflit, lun des deux doit attendre. Ceci vite que le nud ne se retrouve dans un tat incohrent. Cependant ce nud nest pas verrouill entre les appels systme et des processus peuvent donc se partager un fichier ouvert. Si un utilisateur dsire un accs exclusif, il devra mettre en uvre, par exemple, un smaphore.

La position courante de lecture et dcriture des processus dans un fichier, nest pas contenue dans le nud dindex, mais dans une table spare, globale tous les processus. Cette organisation est ncessaire pour que deux processus puissent lire ou crire des endroits diffrents du fichier. On repre les entres de cette table par les descripteurs des fichiers22, rendus par open, et que manipule read, write,. En revanche, la position courante est partage par les fils dun processus, lorsque le fichier a t ouvert avant la cration de ces fils. Les fils se rfrent alors au fichier par le mme numro de descripteur. Grce ces

proprits, on peut, par exemple, tablir une communication travers un tube.

21 Bach, p. 65, op. cit.

22 Ces descripteurs de fichiers indicent une table prive (propre chaque processus) dont les lments pointent sur la cellule de la table globale o se trouve la position courante.

Table des f ic hiers ouv erts , (par

proc ess us)

Table s tructure de f ic hiers

Table des i-nuds

Pre

Fils

0

1

2

3

4

0

1

2

3

4

Figure 37

3.4.4. Le partage de fichiers par liens avec Unix

Un mcanisme permet de construire des structures de rpertoires ayant la forme de graphes acycliques orients et ainsi de partager des fichiers. Pour cela, plusieurs rpertoires doivent rfrencer le mme nud dindex, ventuellement sous un nom diffrent. On appelle chaque nouveau rfrencement dun nud, la cration dun lien sur le fichier correspondant.

Une fois les liens tablis, le fichier pourra tre dsign sous lun quelconque des noms. Pour sa part, le nud dindex conservera, dans un de ses champs, le nombre de fichiers qui le rfrence, indpendamment des protections sur le

fichier. Lajout dune rfrence incrmentera le nombre de liens du nud. Llimination dun fichier par un utilisateur dcrmentera ce nombre. La destruction effective du nud, et par l du fichier, aura lieu lorsque le compte des liens sera nul.

3.5. La mmoire cache (lantmmoire)

Les processus ne peuvent pas manipuler directement les donnes du disque. Ils sont obligs, pour cela, de les dplacer en mmoire centrale. Les transferts seffectuent par blocs et il est souvent inutile deffectuer autant dentres-sorties sur disque que daccs au fichier. La plupart des systmes de fichiers gre les entres-sorties grce une mmoire intermdiaire : la mmoire cache ou lantmmoire. Cette antmmoire fait correspondre des blocs tampons en mmoires aux blocs du disque.

La stratgie gnrale dutilisation de lantmmoire est la suivante : on lui alloue un certain nombre de blocs en mmoire centrale. Lorsque lon accde un lment dun fichier, on examine la suite de ces blocs. Si le bloc dsir celui qui contient llment du fichier se trouve dans lantmmoire, on pourra y lire ou y crire directement llment, sinon, on produira un bloc libre de lantmmoire, on y chargera le bloc du disque et on effectuera les oprations de lecture ou dcriture. Un bloc un tampon pourra tre partag dans lantmmoire par plusieurs processus et il ne pourra sy trouver quen un seul exemplaire.

Dans le systme Unix23, les blocs tampons sont relis par un double chanage des blocs libres et des blocs occups. Ils possdent, dautre part, un en-tte indiquant le numro du priphrique, le numro du bloc, ainsi que ltat du tampon :

23 Bach, chap. 3, op. cit.

N du

priph.

N du

bloc

tat

Ptr sur le

bloc de donnes

Ptr sur

tampon occup suiv.

Ptr sur

tampon occup prc.

Ptr sur

tampon libre suiv.

Ptr sur

tampon libre prc.

Figure 38

Le systme Unix ordonne ses tampons suivant lordre dernire utilisation. En cas de demande de chargement dun bloc du disque, il liminera le moins rcemment utilis (algorithme LRU). Un codage par hachage acclre laccs.

Il existe plusieurs politiques de recopie des blocs de lantmmoire sur le disque lorsquils ont t modifis, en fonction dun compromis entre la scurit et la vitesse. Dans le systme Unix, les nuds dindex et les rpertoires sont recopis immdiatement aprs leur modification. Les blocs de donnes ordinaires sont recopis si leur tampon atteint la fin de la liste LRU ou automatiquement par un dmon toutes les 15 secondes. On peut dclencher ce dmon par lappel systme :

sync()

Les tampons du systme MS-DOS sont recopie immdiate.

3.6. La structure physique dun disque Unix

Chaque disque physique au format Unix possde la structure suivante :

Bloc

dmarrage

Super bloc

Table bits

i-nuds

Table bit

blocs donnes

nuds dindex

(plusieurs blocs)

Donnes

(plusieurs blocs)

Figure 39

Le bloc de dmarrage contient le code ncessaire tout disque pour se lancer. Le super bloc donne des informations sur les fichiers, telles que le nombre de

nuds dindex, le nombre de blocs, le premier bloc de donnes, la taille maximale

de fichiers, etc.

Le super bloc est charg en mmoire o on lui ajoute quelques informations supplmentaires, telles que le numro du priphrique, un indicateur de mise jour, etc.

3.7. La structure logique dun disque Unix

Le systme Unix permet de runir plusieurs disques sous une arborescence

unique.

/

users temp usr

/

anne1 anne2 anne3

Figure 40

On ralise cet attachement par un montage , grce la commande :

/etc/mount /dev/fd1 /users

o /dev/fd1 dsigne le disque monter. Le systme mont devient :

/

users temp usr

anne1 anne2 anne3

Figure 41

Une table des volumes monts garde la trace des diffrents priphriques24. Elle contient les lments suivants :

N du priph.

mont

Ptr sur le tampon

du super bloc

Ptr sur le i-nud du

systme mont

Ptr sur le i-nud du rpert.

de montage

Figure 42

Elle permet dassocier les disques larborescence du systme. Ainsi lutilisateur peut parcourir les rpertoires sans en supposer leur organisation physique.

3.8. Rparer le systme de fichier

Les disques magntiques sont des dispositifs dlicats et il est frquent de retrouver certains de leurs blocs, ou parfois mme leurs rfrences, dans un tat incohrent.

Pour vrifier cette cohrence, on peut reconstruire la table des blocs occups, en examinant tous les fichiers et en incrmentant le compte dun bloc chaque fois quil est rfrenc. Si le systme est cohrent, la table des blocs occups doit tre

complmentaire de celle des blocs libres.

24 Bach, p. 126, op. cit.

Si un bloc napparat ni dans la table des blocs libres, ni dans celle des blocs occups, le bloc est dit manquant. On peut le rparer en le rajoutant la liste des blocs libres.

Si un bloc appartient deux ou plusieurs fichiers, le systme est sans doute profondment incohrent. On peut effectuer une tentative de rparation en recopiant le bloc dfectueux des emplacements libres autant de fois quil est rfrenc puis en affectant chacun de ces nouveaux blocs lun des fichiers qui les rfrenaient.

On peut aussi vrifier la cohrence du point de vue des liens. Chaque numro de nud dindex doit apparatre autant de fois dans la structure arborescente quil possde de liens.

Sur la plupart des systmes Unix, le programme fsck effectue cette tche chaque dmarrage, si ncessaire.

3.9. La scurit

Ce paragraphe est incomplet en 1999

3.9.1. La protection physique

3.9.2. La protection des fichiers

3.9.3. les listes daccs

3.10. Les fonctions dUnix

Les appels systmes dUnix sont en majorit destins la gestion des fichiers et des rpertoires. Nous allons en donner ici une liste, ainsi quune description succincte. En cas derreur, les appels systme rendent en gnral -1.

int creat(char * ref, int droits) cre, ou tronquera, le fichier ref avec les droits daccs droits, masqus par le rsultat de la fonction umask. creat alloue un nouveau nud dindex, inscrit la rfrence dans le rpertoire parent et ouvre le fichier en criture. La fonction alloue un lment des tables globale et prive des fichiers. Elle rend un descripteur entier indexant cette dernire.

Nous avons dcrit int open(char * ref, int mode) dans les chapitres sur les processus et les entres-sorties. Du point de vue du systme de fichiers, open, alloue un lment des tables globale et prive des fichiers. La fonction rend un descripteur indiant la table prive et elle positionne, par dfaut, le dplacement 0 dans la table globale.

int read(int df, char * tampon, int nb) lit nb octets du fichier de descripteur df et les place dans tampon. Elle rend le nombre de caractres rellement lus. La fonction int write(int df, char * tampon, int nb) lui est similaire.

int close(int df) libre, ou dcrmente, les diffrents emplacements

correspondants des tables de fichiers, ainsi que des nuds dindex en mmoire.

int lseek(inf df, long dplacement, int origine) permet de positionner la lecture ou lcriture un endroit particulier du fichier de descripteur df, en fonction dun dplacement dplacement par rapport origine. origine peut prendre 3 valeurs, 0 indique le dbut du fichier, 1 la position courante et 2 la fin du fichier.

int mknod(char * rf, int mode, int dev) permet de crer

un nud dindex attach un fichier spcial.

int chdir(char * rf) permet un processus de changer de rpertoire de travail.

int chroot(char * rf) change le nud dindex de la racine du systme.

int chown(char * rf, int propr, int group) change le propritaire et le groupe du fichier rf.

int chmod(char * rf, int mode) change les droits du fichier

rf.

int stat(char * ref, struct stat * tampon) fournit le contenu du nud dindex du fichier rf, lexception des numros des blocs. Cette information sera rendue dans la structure tampon. Sa dfinition se trouve dans le fichier /usr/include/sys/stat.h

int fstat(int df, struct stat * tampon) est semblable la fonction prcdente, mais manipule le descripteur dun fichier ouvert.

int dup(int df) rend le plus petit descripteur de fichiers disponible et le fait pointer sur mme emplacement que df dans la table globale des fichiers.

int mount(char * priph, char * rpert, int options) rattache le priphrique de fichier spcial priph au rpertoire rpert. Les options permettent le rattachement en lecture seule.

int umount(char * priph) dtache le fichier spcial priph.

int link(char * fichier1, char * fichier2) cre la rfrence fichier2 et la rend quivalente fichier1. Cet appel aura pour effet dincrmenter le compte lien du nud dindex de fichier1.

int unlink(char * fichier) dtruit la rfrence fichier. Si le compte lien du nud dindex correspondant devient nul, le fichier sera limin du disque.

int access(char * rf, int mode) permet deffectuer des tests

sur les fichiers.

int fcntl(int df, int commande, int argument) est une fonction usages multiples. Elle permet de modifier finement le comportement des fichiers et notamment de verrouiller des enregistrements.

int pipe(&df[0]) cre un tube de communication. Voir le chapitre sur les processus.

3.11. Les fonctions de Windows NT

Le systme de fichiers de Windows NT est capable de fonctionner avec trois types de format : la FAT, NTFS et CDFS. Windows NT fournit un ensemble complet de fonctions pour grer le systme de fichier. Nous en en prsentons ici un aperu.

DWORD GetCurrentDirectory() permet dobtenir le rpertoire

courant.

BOOL SetCurrentDirectory() permet de positionner le rpertoire courant.

BOOL CreateDirectory() permet de crer un rpertoire. BOOL RemoveDirectory() permet de dtruire un rpertoire HANDLE CreateFile() permet de crer un fichier

BOOL CopyFile() copie un fichier dans un autre.

BOOL DeleteFile() dtruit un fichier.

BOOL MoveFile() dplace un fichier.

BOOL ReadFile() lit des donnes dans un fichier.

BOOL WriteFile() crit des donnes dans un fichier.

DWORD SetFilePointer() positionne le point de lecture dans un fichier.

BOOL SetEndOfFile()

BOOL FlushFileBuffer() vide le tampon et force lcriture sur le

disque.

BOOL LockFile() verrouille un segment de fichier

BOOL UnlockFile() dverrouille un segment de fichier

3.12. Linterface du langage C

Le langage C fournit une interface de manipulation de fichiers, disposant dune antmmoire et permettant des formats de type courant : entiers, rels, Les fonctions de manipulation correspondent louverture, la fermeture, lcriture,

Linterface du langage C rserve un tableau den-ttes, dcrits par la structure

_iobuf, dans le fichier stdio.h. louverture dun fichier, il correspondra laffectation dun de ces en-ttes. Le tampon de len-tte, dsign par le champ

_base de la structure sera alors allou.

_filbuf est la fonction de remplissage. Elle fait passer les donnes, de

lantmmoire des blocs au tampon point par _base.

_flsbuf est la fonction de vidage du tampon, dans lantmmoire des blocs. Elle intervient quand la tampon est plein ou la rencontre dun retour la ligne "\n".

FILE._base

_filbuf

_flsbuf

Antmmoire des blocs

Figure 43

Les principales fonctions de manipulation des fichiers sont :

FILE * fopen(char * nom, char * mode) ouvre un fichier et recherche un en-tte vide dans la table.

int fclose(FILE *) libre len-tte.

int getc(FILE *) lit un caractre dans le tampon.

int putc(char c, FILE *) crit un caractre dans le tampon. int fscanf(char *, lit un ensemble de variables suivant un format. int fprintf(char *, crit un ensemble de variables suivant un format.

int fseek(FILE *, long, int) effectue un dplacement dans le

fichier.

fflush(FILE *) vide immdiatement le tampon de la structure _iobuf

dans lantmmoire des blocs.

Le chapitre 8 du Langage C, de Kernighan & Ritchie fournit une description complte de la structure de donnes, ainsi que le code de la fonction fopen() crit partir de fonctions Unix. Dans ce chapitre de ce livre, les structures sont un peu simplifies. La partie qui suit est un exemple rel :

/* @(#)stdio.h 1.16 89/12/29 SMI; from UCB 1.4 06/30/83 */

#ifndef FILE

#define BUFSIZ 1024

#define _SBFSIZ 8

extern struct _iobuf {

int _cnt;

unsigned char *_ptr;

unsigned char *_base;

int _bufsiz;

short _flag;

char _file; /* should be short */

} _iob[];

#define _IOFBF 0

#define _IOREAD 01

#define _IOWRT 02

#define _IONBF 04

#define _IOMYBUF 010

#define _IOEOF 020

#define _IOERR 040

#define _IOSTRG 0100

#define _IOLBF 0200

#define _IORW 0400

#define NULL 0

#define FILE struct _iobuf

#define EOF (-1)

#define stdin (&_iob[0])

#define stdout (&_iob[1])

#define stderr (&_iob[2])

#ifdef lint /* so that lint likes (void)putc(a,b) */

extern int putc();

extern int getc();

#else

#define getc(p) (--(p)->_cnt>=0? ((int)*(p)->_ptr++):_filbuf(p))

#define putc(x, p) (--(p)->_cnt >= 0 ?\

(int)(*(p)->_ptr++ = (unsigned char)(x)) :\

(((p)->_flag & _IOLBF) && -(p)->_cnt < (p)->_bufsiz ?\

((*(p)->_ptr = (unsigned char)(x)) != \n ?\

(int)(*(p)->_ptr++) :\

_flsbuf(*(unsigned char *)(p)->_ptr, p)) :\

_flsbuf((unsigned char)(x), p)))

#endif

#define getchar() getc(stdin)

#define putchar(x) putc((x),stdout)

#define feof(p) (((p)->_flag&_IOEOF)!=0)

#define ferror(p) (((p)->_flag&_IOERR)!=0)

#define fileno(p) ((p)->_file)

#define clearerr(p) (void) ((p)->_flag &= ~(_IOERR|_IOEOF))

extern FILE *fopen(); extern FILE *fdopen(); extern FILE *freopen(); extern FILE *popen(); extern FILE *tmpfile(); extern long ftell(); extern char *fgets();

extern char *gets(); extern char *sprintf(); extern char *ctermid(); extern char *cuserid(); extern char *tempnam(); extern char *tmpnam();

#define L_ctermid 9

#define L_cuserid 9

#define P_tmpdir "/usr/tmp/"

#define L_tmpnam 25 /* (sizeof(P_tmpdir) + 15) */

# endif

Chapitre 4

Les entres-sorties

4.1. Comment le processeur communique avec

lextrieur

4.1.1. Gnralits

Lordinateur peut effectuer des entres-sorties changer des donnes avec des organes externes :

lectroniques, tels que les mmoires,

magntiques, tels que les disques ou les disquettes,

mcaniques, tels que le clavier, les imprimantes,

Les priphriques les organes externes mis en uvre sont de nature trs diffrente et lun des objectifs du systme de gestion des entres-sorties est de prserver une relative homognit dans leur mode daccs. Les entres-sorties forment une trs part importante, au moins en volume de code, des systmes dexploitation. Leur tude, qui prsente beaucoup plus daspects techniques que thoriques, est cependant parfois nglige.

On classe les priphriques dentres-sorties en deux catgories principales :

les priphriques blocs;

les priphriques caractres.

On gre les donnes des priphriques blocs par lintermdiaire de blocs de tailles fixes, couramment de 512 ou 1024 octets et parfois plus. Laccs chacun de ces blocs tant alatoire. Les disques correspondent, peu prs, aux priphriques blocs.

Les autres priphriques sont donc, en gnral, des priphriques caractres. Ils fournissent ou acceptent une suite de caractres sans relle structure. Les terminaux, les crans, les mmoires sont des priphriques caractres.

On doit noter que cette classification des priphriques en deux catgories est assez grossire et, dans certains cas, plutt arbitraire. Certains priphriques ne correspondent ni lune ni lautre dfinition, dautres tant recouverts, par contre, par les deux dfinitions, les drouleurs de bandes par exemple.

4.1.2. Les contrleurs

La plupart du temps, le processeur ne commande pas directement les priphriques. Il utilise pour cela un circuit spcialement adapt, un contrleur , de caractristiques propres chaque priphrique. Les commandes du processeur au priphrique sopreront alors par lintermdiaire de ce contrleur. Ces commandes correspondent directement aux mcanismes physiques du priphrique telles, par exemple, que le dplacement du bras dun lecteur de disque. Par ailleurs, les contrleurs sont souvent dune grande complexit lectronique.

On relie les contrleurs au bus de lordinateur et on leur alloue, chacun, un certain nombre dadresses. ces diffrentes adresses, on mettra des commandes de pilotage ou on effectuera des entres-sorties de donnes. Le contrleur reconnatra ses adresses grce une logique de dcodage. Dans certains ordinateurs, les contrleurs ne sont pas relis au bus mais des voies dentres- sorties spcifiques.

Ctl

P Disque

Bus

Figure 44

Les contrleurs et le processeur oprent en parallle. Le contrleur dispose dune mmoire tampon, pour lui permettre, par exemple, de lire des donnes en provenance du priphrique dentre pendant que le processeur traite une autre tche. Le contrleur signale lachvement de son travail en mettant une interruption qui lui est propre. la rception de cette interruption, le processeur se branche un emplacement fixe. La valeur de cet emplacement est contenue dans une adresse un vecteur spcifique chaque interruption25. ladresse dinterruption, une routine ralise, en gnral, le transfert des donnes vers la

mmoire principale, puis rend la main au processus prcdent.

Contrleur

Adresses dentres-sorties

Vecteurs

(IRQ)

Horloge

040-043

0

Clavier

060-063

1

Port COM 1

3F8-3FF

4

Table 1. Les adresses et les vecteurs de quelques priphriques de lIBM PC.

25 Et donc ce contrleur.

4.1.3. Un exemple simple de fonctionnement : crire sur un disque

Pour transfrer des donnes sur un disque, le pilote de ce disque met des commandes, aux adresses adquates, dans les registres du contrleur. Ces commandes sont, la mise en route ventuellement, le positionnement de la tte sur le bon cylindre, puis linstruction dcriture, avec les paramtres ncessaires, notamment le secteur o crire le bloc. Le pilote transmet ensuite les donnes crire, lune aprs lautre, dans les tampons du contrleur puis il se bloque en attendant la fin de lcriture effective.

Pendant ce temps, le processeur pourra lire une autre tche. Le contrleur crira seul, sur le disque, les donnes contenues dans ses tampons et quand il aura termin son action, il mettra une interruption. Linterruption dbloquera le pilote et lancera lordonnanceur. Ce dernier pourra activer le pilote qui vrifiera alors que lopration sest bien droule.

4.1.4. Laccs direct la mmoire

Pour les priphriques blocs, le transfert des donnes entre la mmoire et le contrleur nest pas, en gnral, ralis par le processeur, mais par un circuit spcialis daccs direct la mmoire (DMA).

Ce circuit DMA est attach au priphrique. Il utilise des instants particuliers du cycle de fonctionnement du processeur pour crire les donnes de la mmoire centrale vers les tampons du contrleur, ou bien linverse. Il permet ainsi doccuper le processeur dautres tches de traitement. Avant de le lancer, le processeur doit bien sr lui communiquer, le sens du transfert, ladresse dorigine de la zone mmoire o on dsire lire ou crire des donnes, ainsi que le nombre doctets transfrer.

4.2. Les diffrents niveaux des logiciels dentres- sorties

Le traitement des entres-sorties se fait sur plusieurs niveaux, des plus proches du matriel aux plus proches de lutilisateur. Les niveaux proches de lutilisateur doivent sefforcer, autant que possible, de masquer les particularits physiques des priphriques.

Les niveaux purement matriels sont constitus des interruptions mises par les diffrents priphriques vers le processeur. Ces interruptions correspondent des indications, par exemple de fin de traitement. Le systme dtermine lorigine des interruptions et fait passer le pilote destinataire, en gnral, de ltat bloqu ltat prt. Les interruptions ont aussi souvent pour effet de relancer lordonnanceur. Si le pilote est de nouveau lu, et il le sera de toute faon un moment, il transmettra au processus demandeur, les rsultats de lentre-sortie, et il le dbloquera son tour. Du point de vue conceptuel, ces dblocages de ressources se formalisent par des oprations sur des smaphores :

V(ressource).

Les pilotes de priphriques soccupent de traduire les requtes des entres- sorties dans des commandes propres chaque contrleur. Ils grent aussi une partie des erreurs matrielles. Ils sintgrent enfin, dans le cas dUnix, dans le systme de fichiers. Les fichiers pouvant recouvrir la fois des donnes sur disques, des priphriques, Ce systme de fichiers lavantage de prsenter une interface uniforme aux entres-sorties :

dadressage,

de protection,

dallocation et de libration des priphriques,

de signalisation des erreurs, etc.

Pour lutilisateur, les fonctions dinterface, les appels systme, correspondent alors louverture ou la fermeture dun fichier, la lecture ou lcriture de donnes, enfin, au positionnement des conditions dchange pour les priphriques caractres.

4.3. Les dispositifs matriels dentres-sorties

Cette partie est incomplte en 1999

4.3.1. Les disques

Les disques sont constitus dun ou plusieurs cylindres. Chaque cylindre possde un certain nombre de pistes. Un disquette simple face a une piste par cylindre, une double face en possde deux. Chaque piste est divise en secteurs dangles gaux. En gnral, on a un bloc par secteur, parfois il faut plusieurs secteurs pour un bloc. Les paramtres temporels importants sont les temps moyens de positionnement du bras et le temps de rotation.

Plusieurs algorithmes permettent dordonnancer le bras du disque. Le plus simple est celui qui sert les demandes dans leur ordre darrive. (First Come-First Served). Lun des plus efficace est celui de lascenseur. Il traite les demandes en les ordonnant en fonction de la position de leur cylindre sur le disque, de lintrieur vers lextrieur et en oprant des balayages entre les deux secteurs extrmes.

4.3.2. Les terminaux

Les terminaux, de type VT100, sont relis lordinateur par une voie RS-232 asynchrone. La transmission sopre en srie par lintermdiaire dun circuit UART (Universal Asynchronous Receiver Transmitter). La vitesse de transmission est, en gnral, paramtrable et sexprime, de manire impropre, en bauds.

Les terminaux plus rcents, tels que les consoles graph