Vous êtes sur la page 1sur 50

Gnralits sur les entes-sorties

Le processeur de lordinateur dialogue avec lextrieur par le biais des priphriques dentres-sorties dont les principaux sont par exemple : -le clavier, -la souris, -lcran, -limprimante, le disque, le lecteur DVD, les enceintes audio,etc. Les priphriques : - multitude, - diffrentes caractristiques techniques, - diffrentes manires de raliser des entes-sorties. La gestion des priphriques seffectue deux niveaux : - au niveau du matriel avec le dispositif de lunit dchange. - au niveau du systme dexploitation, avec le pilote dentes-sorties.

Gnralits sur les entes-sorties

Gnralits sur les entes-sorties

Un registre de commande dans lequel le processeur dcrit le travail effectuer Un registre de donnes qui contient les mots changer entre le priphrique et la mmoire centrale Une registre d tat qui indique - si l unit d change est prte, - si l change s est bien droul, - etc
3

Gnralits sur les entes-sorties


Le mcanisme dinterruption qui se trouve la base du module dentres/sorties des SE.

Dfinition et Principe : Une interruption est un mcanisme qui permet d'interrompre l'excution d'un processus suite un vnement extrieur ou intrieur et de passer le contrle une routine dite "routine d'interruption " . Les interruptions peuvent dtre dorigines diverses, mais on les classe gnralement en trois grands types : externes : interventions de l'oprateur, pannes, etc. droutements erreur interne du processeur, dbordement, division par zro, dfaut de page, etc. appels systmes :comme les demandes d'entres-sorties par exemple.

Gnralits sur les entes-sorties


Lorsque le signal dune interruption arrive, il modifie l'tat d'un indicateur (drapeau ou flag) qui est rgulirement test par l'unit centrale. Une fois que le signal est dtect, il faut dterminer la cause de l'interruption. Pour cela on utilise un indicateur, pour les diffrentes causes dinterruption. On utilise cet indicateur pour accder un vecteur dinterruptions qui associe chaque type dinterruption ladresse de la routine dinterruption correspondante. Un vecteur dinterruption a donc la structure suivante :

Gnralits sur les entes-sorties


Les contrleurs : Un priphrique dE/S contient en fait deux parties : un appareil (clavier, cran, disque, ) et un contrleur de priphrique. Le contrleur sert dinterface entre le priphrique et le processeur : - Les principales requtes quun processeur envoie un priphrique sont lecture et criture . Selon les priphriques ces requtes peuvent correspondre des commandes simples ou complexes. -Deux grandes catgories de priphriques : -les priphriques par caractres -les priphriques par blocs.

Gnralits sur les entes-sorties


Les drivers : A lorigine, le SE ne contient donc quune vue abstraite du systme matriel. Les drivers sont fourni par le constructeur et contiennent linterface de bas niveau pour lutilisation de priphriques. La couche logicielle de plus bas niveau est spcifique au priphrique et traduit des commandes gnrales des priphriques par blocs ou par caractres en commandes spcifiques au priphrique cible. open: cette fonction permet douvrir un priphrique, close: cette fonction rompt la liaison avec le priphrique, read, write: ces fonctions permettent des transferts avec lunit dchange. schedule: cette fonction permet dordonnancer les requtes dentressorties, interrupt: cette fonction constitue le gestionnaire dinterruptions.
7

Gnralits sur les entes-sorties


Protocole lmentaire dentres-sorties:
Valeur donne lmentaire Valeur donne prte Indicateur de donnes reues

Plusieurs modes dentres-sorties ont t proposs dans les systmes informatiques : -les E/S programmes, -les E/S par interruption, -les E/S avec accs DMA et les E/S avec processeur spcialis.

A la fin de cette partie, on revient sur les algorithmes dordonnancement des requtes pour les pilotes ainsi que les oprations de contrle sur les priphriques.
8

Les entes-sorties
Les lectures/critures sont appeles entres/sorties.
Une entre/sortie provoque une interruption. Le processus appelant est mis en attente (sommeil) le temps que sa demande soit traite. Pour acclrer les entres sorties, les systmes utilisent un mcanisme de cache : lorsquun processus fait une criture, elle est ralise en RAM et non sur le priphrique rel, dans une zone appele buffer cache. Le buffer cache est priodiquement synchronis avec le priphrique. Ce mcanisme est transparent pour le programmeur, part quau retour dune criture, les donnes ne sont pas ncessairement crites sur le priphrique.
9

Descripteurs
Avant de raliser une E/S, un processus doit acqurir les droits en mode - lecture, ou - criture, ou - lecture-criture.
Il le fait en demandant une ouverture du fichier, dans un des 3 modes. En cas de succs, le systme fournit au programmeur un identifiant entier, appel descripteur permettant les accs ultrieurs.

10

Descripteurs
Un descripteur obtenu par un processus lui est propre.
Il donne au processus le droit daccs une entre dans une table des fichiers ouverts (TFO). Un mme fichier peut tre ouvert plusieurs fois (dans des modes ventuellement diffrents) par un ou plusieurs processus. 3 descripteurs spciaux : - STDIN_FILENO, entre standard, - STDOUT_FILENO, sortie standard, - STDERR_FILENO, sortie erreur standard.

11

Ouverture dun fichier


Louverture dun fichier par un processus est demande par lappel # include <sys/ stat.h> // pour le mode douverture. # include <fcntl.h> int open( const char *path , int flag , ... /* mode */ ); 1er argument : chemin daccs au fichier. 2me argument : mode douverture. OU bit bit contenant lune des constantes O_RDONLY, O_WRONLY, O_RDWR. des options supplmentaires parmi : O_APPEND les critures se feront en fin de fichier, O_CREAT cration du fichier sil nexiste pas, O_TRUNC tronque le fichier sil existe, O_EXCL chec si cration demande et le fichier existe, O_SYNC attente que lcriture soit ralise physiquement. + 3me argument optionnel : mode de cration (modifi par lumask). 12

Ouverture : structures mises en jeu


En cas de succs, open renvoie un descripteur entre 0 et OPEN_MAX.
Cet entier identifie louverture du fichier par le processus. Il permet au noyau daccder une entre de la TFO prcisant le mode douverture du fichier, le nombre de descripteurs pointant sur lentre. le dcalage du curseur de lecture/criture par rapport au dbut (offset), un pointeur vers un i-noeud en mmoire.

Un i-noeud est une structure maintenue par le systme.


Cette structure contient des informations sur le fichier (propritaire, droits, etc.) et le moyen daccder aux donnes.
13

Ouverture : structures mises en jeu

14

Ouverture dun fichier


Louverture dun fichier par open() provoque 1. lallocation dun descripteur de fichier. 2. lallocation dune entre dans la table des fichiers ouverts (TFO). 3. lallocation ventuelle dune entre dans la table des v-noeuds, avec rcupration du i-noeud sur disque sil nest pas dans le cache. 4. les vrifications de droits daccs au fichier selon le mode demand. 5. le rejet ventuel doprations illgales (ouverture dun rpertoire, ou ouverture en criture dun excutable ouvert en cours dexcution). 6. la cration ventuelle du fichier sil nexiste pas et O_CREAT est demand. 7. si le fichier rgulier existe et peut tre ouvert en mode criture ou lecture-criture, et si O_TRUNC est demand, le fichier est tronqu libration ventuelle des blocs. 8. linitialisation du fichier ouvert (offset, pointeur sur v-noeud, mode douverture et compteur de rfrences).
15

Atomicit
Pour un processus P1, ouvrir un fichier en mode O_CREAT | O_EXCL nest pas quivalent 1. tester sil existe 2. si oui, ne rien faire. Sinon, louvrir avec le mode O_CREAT,
Dans le second cas, scnario suivant possible : P1 constate que le fichier nexiste pas. P2 cre le fichier et y crit. P1, qui a dj fait le test, ouvre le fichier bien quil existe. Mode O_CREAT | O_EXCL : [test et cration] atomique : garantie de non interruption entre test et cration.

16

Fermeture dun fichier


Lorsquun processus a fini dutiliser un fichier, il utilise # include <unistd .h> Int close ( int descr );
Lappel dsalloue le descripteur, ventuellement lentre de la TFO si le compte de descripteurs pointant sur lentre passe 0, ventuellement li-noeud en mmoire si le nombre douvertures passe 0, ventuellement les blocs du fichier si le nombre de liens et le nombre douvertures est 0. Un processus qui se termine ferme implicitement tous ses descripteurs. On verra certains cas o il est crucial de ne pas oublier close().
17

Tte (ou curseur) de lecture/criture


Pour lire ou crire dans un fichier, tout se passe comme si on avait une tte (ou curseur) de lecture-criture .
La tte sera dplace automatiquement chaque lecture ou criture. (tout se passe comme sur une bande magntique).

18

Dplacement du curseur de lecture/criture


Le curseur de lecture et/ou criture est associ un fichier ouvert. Un mme fichier peut tre ouvert plusieurs fois, avec des curseurs des places diffrentes. La position du curseur est mmorise par un entier > 0 dans lentre de la TFO. louverture, il est positionn : - la taille du fichier en mode O_APPEND ; - 0 sinon.
Sur les fichiers ordinaires, on peut demander un dplacement du curseur. Ce nest pas possible sur tout fichier (ex. terminal).

19

Dplacement du curseur de lecture/criture


Pour dplacer, si possible, le curseur associ un descripteur descr : # include <unistd .h> off_t lseek( int descr , off_t offset , int whence ); Si whence vaut SEEK_SET, dplacement 2me argument > 0 relatif au dbut de fichier. SEEK_CUR, dplacement 2me argument relatif la position courante. SEEK_END, dplacement 2me argument relatif la fin de fichier.
Lappel retourne la nouvelle position. On peut positionner le curseur aprs la fin de fichier.

20

criture
La lecture sur un fichier peut se faire par la fonction # include <unistd .h> ssize_t read( int descr , void *buf , size_t nbytes );
Lecture via le descripteur descr de nbytes octets, placer dans buf. 1. Lecture partir de la position (offset) correspondante dans la TFO. 2. Avancement du curseur du nombre doctets lus, Lecture atomique : ce qui est lu nest pas entrelac avec une autre E/S.

Retourne le nombre doctets effectivement lus.


read renvoie donc moins que nbytes si la fin de fichier est atteinte. Comportement sur tubes/sockets : vu plus tard.
21

criture
Lcriture dans un fichier par la fonction ssize_t write( int desc , const void *buf , size_t nbytes );
demande lcriture des nbytes premiers octets de buf via descr. - partir de la position courante, - avec crasement des anciennes donnes (ninsre pas) ou - extension du fichier si la fin est rencontre. Retourne le nombre doctets effectivement crits. Un retour infrieur nb peut se produire.

Remarque : on peut crire des donnes autres que chanes (codages dentiers, structures, etc.). Attention au codage (big/little endian, alignement).
22

Exercice
Exercice : Refaire les commandes cat et cp.
Si on doit faire plusieurs lectures ou critures, la taille du buffer influe notablement sur les performances. Les critures en mode synchrone sont beaucoup plus lentes. Mettre ceci en vidence.

23

Atomicit
Ouvrir un fichier en mode O_APPEND nest pas quivalent louvrir sans le mode O_APPEND, avant chaque criture, dplacer le curseur en fin de fichier.
Dans le second cas, le scnario suivant possible : Fichier ouvert en mode O_WRONLY par 2 processus P1, P2. P1 dplace le curseur en fin de fichier pour y crire. P2 idem. P2 crit en fin de fichier. P1 crit, mais pas en fin de fichier ! (crase lcriture de P2). P1 et P2 pensent avoir crit en fin de fichier. Ce nest pas le cas pour P1. En mode O_APPEND, [dplacement du curseur + et criture] atomique: garantie de non interruption entre dplacement du curseur et criture.
24

Duplications et redirections
Lobjectif de la TFO est de crer une indirection, pour permettre plusieurs processus de partager le mme curseur. Plusieurs moyens de crer ce partage. Quand un processus en cre un autre, il lui transmet ses descripteurs. On peut demander explicitement de dupliquer un descripteur par dup2. ... int dup2( int old_descr , int new_descr); old_descr doit correspondre un descripteur ouvert. La fonction 1. ferme le descripteur new_descr sil est ouvert, 2. le fait pointer vers la mme entre de la TFO que old_descr. 3. retourne la valeur de new_descr (1 si erreur). Les appels dup et fcntl permettent aussi de dupliquer.
25

Duplications et redirections

26

Manipulation de lentre TFO


Lappel fcntl permet de manipuler les attributs associs un descripteur ou une entre de la TFO. # include <unistd .h> # include <fcntl .h> int fcntl ( int descr , int commande , ...); Le second argument donne le type dopration raliser : - Rcupration/changement du mode douverture F_GETFL/F_SETFL. - Manipulation dun attribut du descripteur lui-mme (vu plus tard). - Duplication la dup. - Pose de verrous.

27

Entres-sorties sur rpertoires


On ne peut pas utiliser open() et read() sur les rpertoires. la place # include <dirent .h> DIR * opendir( const char * dirname); struct dirent * readdir( DIR * dirp ); void rewinddir( DIR * dirp );
La structure dirent contient un champ d_name : le nom de lentre dans le rpertoire. Curseur dplac lentre suivante aprs une lecture russie.

Remise du curseur au dbut du rpertoire par la fonction rewindir.

28

Fichiers
Un fichier est une entit sur laquelle on peut raliser certaines oprations, typiquement lecture et criture. Fichiers sur disque, contenant une squence doctets, Priphriques physiques : bandes magntiques, terminaux, imprimante,...
Un priphrique tel quun disque peut tre vu comme une succession ordonne de blocs. Le systme doit donner lutilisateur une vue arborescente, - avec des rpertoires, - la possibilit de nommer (rfrencer) un fichier, - la possibilit de protger ses donnes envers les autres utilisateurs (en lecture, en criture ou en excution), etc. Pour cela, chaque fichier est associ une structure appele i-noeud.
29

Systme de gestion des fichiers (SGF)


Chaque fichier dans larborescence est identifi par -le systme de fichiers sur lequel il rside, -un identifiant unique sur ce systme, appel i-noeud.
On peut greffer la racine dun systme de fichier dans un autre (mount). Un i-noeud contient des informations sur le fichier et ses premiers blocs. Pour les autres blocs, on utilise des blocs dindirection. -simple, -double, -triple. Note : Le nom de fichier (qui ne doit pas contenir / ou le caractre nul) nest pas stock dans le i-noeud.
30

Rcupration des attributs dun i-noeud


Les attributs dun i-noeud sont stocks dans une structure stat. # include <sys/stat.h> struct stat { dev_t st_dev ; // ID du priphrique ino_t st_ino ; // Numro du i- noeud mode_t st_mode; // Type et permissions nlink_t st_nlink; // Nb de liens physiques uid_t st_uid ; // UID propritaire gid_t st_gid ; // GID propritaire off_t st_size; // Taille totale en octets time_t st_atime; // Heure dernier accs time_t st_mtime; // Heure dernire modification time_t st_ctime; // Heure dernier changement tat }; Les types dev_t, ino_t, etc. encapsulent un type arithmtique.
31

Un premier appel systme : stat


# include <sys/ types.h> # include <sys/stat.h> # include <unistd .h> int stat( const char *path , struct stat * buf); int lstat( const char *path , struct stat * buf);
Renvoient 0 en cas de succs, 1 sinon. 1er argument : chemin daccs au fichier. En cas de succs, remplit la structure ladresse 2me argument avec les attributs du i-noeud trouv. stat suit les liens symboliques, contrairement lstat.
32

Champs de la structure stat


Un appel (l)stat provoque la lecture dun i-noeud. Les champs de la structure stat contiennent les informations du i-noeud autres que les blocs de donnes. Ex. st_size est la taille du fichier. Pour les rpertoires : en gnral un multiple de 1K. Pour les liens symboliques : le nombre de caractres de la cible. Les temps correspondent st_atime = dernire lecture des donnes. st_mtime = dernire criture des donnes. st_ctime = dernir changement de droits, propritaires, etc. On peut changer les 2 premiers (si on a les droits) ! # include <utime .h> int utime ( const char *path , const struct timeval times [2]);
33

Types de fichiers
Le champ st_mode donne les permissions et le type de fichier. Macros S_ISXXX() pour tester le type du fichier, o XXX est -REG fichier ordinaire sans interprtation de contenu. -DIR rpertoire contient typiquement couples (nom,i-noeud). -FIFO tube utilis pour communication entre processus. -CHR fich. spcial car. priphrique caractre (eg, terminal). -BLK fich. spcial bloc priphrique bloc (eg, disque). -LNK lien symbolique pas POSIX < 2001. -SOCK socket pas POSIX < 2001.

34

Permissions : propritaire et set-uid bit


Chaque processus possde (entre autres) -un propritaire et groupe propritaire rels. -un propritaire et groupe propritaire effectifs, et ventuellement des groupes supplmentaires. -es derniers dterminent les droits.
Chaque fichier a -un propritaire (champ st_uid de la structure stat) et -un groupe propritaire (champ st_gid de la structure stat). Lorsquun processus excute un programme, le propritaire effectif du processus est bascul, si le fichier excut a le set-uid bit positionn, au propritaire du fichier. 3 catgories de permissions : r/w/x.
35

Permissions
Pour ouvrir un fichier en lecture, criture, ou lecture-criture, il faut -laccs en excution sur les rpertoires du chemin travers pour laccs au fichier (donn explicitement ou non). -les permissions appropries sur le fichier lui-mme. -Permission en lecture pour lire un fichier ou lister un rpertoire, -Permission en criture pour modifier un fichier ou le contenu dun rpertoire (ajouter ou supprimer un fichier).

36

Permissions
Lautorisation dpend du propritaire, groupe propritaire du fichier et du propritaire, groupe propritaire effectifs du processus. si le propritaire effectif du processus est root (uid 0), OK. sinon, on compare le propritaire effectif du processus avec le propritaire du fichier. Sils sont identiques, les droits correspondants sappliquent. sinon, idem avec le groupe, sinon, on regarde les permissions pour les autres.
Rem int access(const char *path, int amode) ; teste les permissions vis--vis du propritaire rel.

37

Propritaires
A la cration, un fichier a comme propritaire le propritaire effectif du processus qui la cr. Le groupe propritaire dun fichier cr peut tre soit le groupe propritaire effectif du processus crateur, soit le groupe du rpertoire qui le contient. Le comportement dpend du systme ou des options de montage. La modification peut se faire par les fonctions # include <unistd .h> int chown( const char *path , uid_t owner , gid_t group ); int lchown ( const char *path , uid_t owner , gid_t group ); Si pathconf(path, _PC_CHOWN_RESTRICTED), ou _POSIX_CHOWN_RESTRICTED sont non nuls, seul root peut appeler chown. lchown (ne suit pas les liens symboliques) est une extension XSI.
38

Masque de cration
Chaque processus a une valeur de masque qui lui est associe. Lorsquun fichier (ou rpertoire) est cr, les bits de permission prsents dans le masque sont basculs off. Le masque est modifiable en utilisant lappel # include <sys/ stat.h> mode_t umask ( mode_t cmask ); o cmask est construit par | partir des constantes dfinies prcdemment. La fonction positionne le nouveau masque umask, renvoie la valeur de masque prcdent.

39

Changement des permissions


Un processus de propritaire effectif xyz (ou root) peut changer les permissions des fichiers de propritaire xyz. Ceci indpendemment des permissions quil a sur le fichier. Le changement de permissions peut se faire par la fonction chmod. # include <sys/ stat.h> int chmod ( const char *path , mode_t mode );

40

Liens
Un mme i-noeud peut apparatre dans plusieurs rpertoires, associ un ou plusieurs noms. Exemple espelette > ls -lid / / bin /.. 2 drwxr -xr -x 21 root root 4096 jan 30 09:20 / 2 drwxr -xr -x 21 root root 4096 jan 30 09:20 / bin /.. Les rpertoires / et /bin/.. correspondent au le mme i-noeud. On dit que ce sont des liens dun mme i-noeud. A part le cas de . et .., on ne peut pas crer de liens dun rpertoire (pour conserver laspect arborescent)...

41

Liens
La cration dun lien se fait par lappel # include <unistd .h> int link( const char * path_ori , const char * path_new); o path_new est le nouveau nom du lien. path_ori doit exister, avec permissions OK daccs au rpertoire de path_ori et daccs/cration dans le rpertoire de path_new. La suppression se fait par int unlink ( const char * path_ori); Ne suit pas les liens symboliques. Remarque Permission en criture sur le fichier lui mme non requise.

42

Liens
La cration/suppression dun lien affecte de faon atomique le rpertoire dans lequel le lien est cr ou supprim. le compte du nombre de liens (champ st_nlink). Blocs dsallous si st_nlink == 0 + aucun processus na le fichier ouvert Pour les rpertoires, on utilise rmdir.

43

Renommage de fichiers
Lappel rename permet de renommer un fichier # include <stdio .h> int rename ( const char *old , const char * new); Si old nest pas un rpertoire, new nest pas un rpertoire. Si old est un rpertoire, new est un rpertoire vide ou nexiste pas (et na pas old comme prfixe). Permissions en criture ncessaires pour les rpertoires modifis. Ne suit pas les liens symboliques. Pour renommer un fichier rgulier sur un mme sgf, pas besoin de copier les blocs de donnes, mais juste dune criture sur les rpertoires impliqus.

44

Liens symboliques
... on ne peut pas crer de liens dun rpertoire... ... ni crer un lien dun systme de fichier vers un autre (pourquoi ?). Pour pallier ces deux limitations, on utilise des liens symboliques. Ils sont vus par le systme comme des fichiers spciaux. Leur contenu dsigne un fichier cible, qui existe ou non. De nombreux appels systme POSIX-2001 suivent les liens symboliques. Fonctions qui suivent les liens symboliques et oprent rcursivement sur les rpertoires...

45

Liens symboliques
La cration de lien symbolique se fait par # include <unistd .h> int symlink( const char *path1 , const char * path2 ); La lecture du contenu dun lien symbolique se fait par ssize_t readlink( const char *path , char *buf , size_t bufsize); Le contenu du lien symbolique est le fichier point. La fonction readlink place ce contenu dans le buffer buf, Pas termin par \0. La fonction retourne le nombre doctets lus, jamais plus que bufsize.

46

Cration/supression de rpertoires
La cration et suppression de rpertoires se fait par # include <sys/ stat.h> int mkdir ( const char *path , mode_t mode ); int rmdir ( const char * path ); Le rpertoire cr est vide (avec liens . et ..). Largument mode de mkdir est le mode de cration modifi par le masque du processus. La suppression demande que le rpertoire soit vide. La suppression de blocs allous au rpertoire suit la mme rgle que pour un fichier.

47

Le rpertoire courant
A chaque processus est associ un rpertoire courant.
Le programmeur nomme les chemins dans larborescence - Soit de faon absolue, en commenant par la racine. - Soit de faon relative. Dans ce cas, le 1er composant du chemin est cherch partir du rpertoire courant.

Lappel int chdir ( const char *path ); permet de positionner le rpertoire courant du processus. char * getcwd ( char *buf , size_t size ); permet de rcuprer le rpertoire courant dans le buffer buf ayant size octets allous. longueur max dun chemin donne par pathconf(".", _PC_PATH_MAX).
48

Multiplexer des entres-sorties


On souhaite prsenter le problme des attentes actives sur plusieurs descripteurs. Lexemple le plus frquent est celui dun serveur web, le serveur doit grer simultanment un trs grand nombre de flux dentre et de flux de sortie et de flux de contrle (les information de contrle des sockets). Deux solutions : -Solution avec le mode non bloquant : -Pas optimal, -Cot de ressources cher. -Utiliser les mcanismes asynchrones : -Entres-sorties asynchrones utilisant SIGIO, -Valable que sur descripteurs qui sont des priphriques.

49

Outils de slection
La solution la plus efficace vient de systmes de slection qui prend un paramtre un ensemble de descripteurs, et qui permet tester si lun de ses descripteurs est prs satisfaire un appel systme read ou write. Cet appel est bloquant jusqu larrive de caractres sur un des descripteurs de lensemble. Ainsi il ny pas de consommation de ressource processus inutile, le travail est fait au niveau noyau. -La primitive select : - Les descripteurs que nous voulons scruter, - Les conditions de rveil sur chaque descripteur, - Combien de temps nous voulons attendre #include <sys/types.h> int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds struct timeval *delai); 50