Université Pierre et Marie Curie

Systèmes d'exploitation des ordinateurs

Chapitre 1. Les systèmes d'exploitation
Chapitre 2. Mécanismes d'exécution et de communication
Chapitre 3. Gestion des activités parallèles
Chapitre 4. Gestion des fichiers
4.1. Principes de la gestion de l'information
4.2. Systèmes de fichiers
4.3. Organisation sur un support physique
4.4. Système de fichiers sous Unix
4.5. Fonctions d'accès élémentaires
Chapitre 5. Partage des ressources
Chapitre 6. Au-dessus du système d'exploitation
Chapitre 7. Notions sur les communications
Chapitre 8. Notions sur la sécurité
Bibliographie
Chapitre 9. Exercices et TPs
Examens
Page d'accueilTable des matièresNiveau supérieurPage précédenteBas de la pagePage suivante

4.5. Fonctions d'accès élémentaires

Fonctions d'accès élémentaires

Un processus qui doit échanger des informations avec un fichier doit mettre en oeuvre un ensemble de fonctions qui réalisent les différentes opérations que nous avons évoqué tout au cours de ce chapitre, à savoir:

  • construction du flot d'entrées-sorties et liaison avec le système de fichiers. Cette opération est faite lors de l'ouverture du fichier. Après usage la liaison est rompue par la fermeture. Les paramètres gérables par le programmeur dépendent du système d'exploitation et des informations qui existent dans les descripteurs.
  • usage du fichier en utilisant une méthode adaptée. Nous les avons évoquées dans la section 2.

La syntaxe des fonctions qui réalisent les entrées-sorties dépend du langage de programmation. Néanmoins on retrouve un certain nombre de principes communs qui seront évoqués ici. Le problème le plus délicat est celui des options, par exemple l'accès en lecture seulement ou la vérification que le fichier n'existe pas préalablement dont la syntaxe dépend du système d'exploitation et du langage, voire du compilateur. Lorsqu'on envisage de porter un programme sur différentes plates-formes il est donc sage de bien structurer l'application afin de regrouper ces parties du code pour pouvoir les modifier facilement. Il faut également éviter, dans la mesure du possible, les fonctions trop particulières qui pourraient ne pas exister ailleurs ni employer des techniques qui n'utilisent pas les appels normaux au système d'exploitation. Le non respect de ces quelques règles peut conduire à des programmes non portables ou même, dans le cas le pire, à des applicatifs qui ne fonctionnent plus lors d'un simple changement de version du système d'exploitation. La rapidité des processeurs modernes ne justifie plus les "bidouillages" souvent employés par le passé.

Organisation du descripteur

Le descripteur d'un fichier contient des informations :

Parmi les informations relatives à l'utilisation d'un fichier on retiendra l'existence d'indicateurs sur :

  • l'usage courant du fichier: disponibilité ou réservation par un ou plusieurs processus. On dit alors que le fichier est bloqué.
  • la nature du fichier. MacOS est capable de reconnaître l'application qui a créé le fichier car cette information est inscrite dans le fichier. Windows le fait par identification de l'extension du nom de fichier. Dans le cas d'Unix, cela n'est pas prévu sauf lorsqu'on emploie les interfaces graphiques comme KDE.
  • la taille du bloc physique de transfert. Elle n'est pas toujours mentionnée. Les anciens systèmes IBM, comme VM par exemple, demandent cette information.
  • les dates de création, de dernière modification, de lecture, le nombre d'accès...
  • a nécessité de sauvegardes. Un drapeau spécial peut être exploité par une procédure spéciale. Ce drapeau est levé chaque fois que le fichier est modifié.
  • les droits d'accès pour les systèmes qui les gèrent.

Cette liste n'est pas limitative. Elle dépend du système d'exploitation. Ainsi la notion de droits d'accès est inexistante sur les micro-ordinateurs employant le système de fichiers FAT32, ce qui est le cas pour XP Home Edition. Unix ignore toute notion de bloc physique de transfert.

Accès à un fichier

L'accès à un fichier comprend obligatoirement trois étapes. L'ouverture pour en permettre l'usage, les opérations de lecture et d'écriture puis la fermeture qui déclenche le vidage des tampons sur disque. Ces différentes opérations nécessitent la connaissance d'un certain nombre de paramètres indispensables à la communication. Leur nombre, leur nature est très dépendant du système d'exploitation et de sa réalisation. 

Ouverture et fermeture

L'ouverture d'un fichier est le préalable à tout usage de celui-ci. La forme de la demande dépend à la fois du système d'exploitation et du langage utilisé. Parmi les nombreux paramètres possibles on retiendra :

  • le nom externe du fichier et éventuellement le nom interne.
  • son état: existant, nouveau à créer...
  • les conditions d'utilisation: en lecture, en écriture, les deux à la fois...
  • l'état du fichier: nouveau, déjà existant, temporaire pour la durée d'utilisation...
  • une longueur de bloc de transfert éventuellement.

La primitive d'ouverture crée la structure d'utilisation du flot (fig. 4.9) et marque, dans l'interface, les conditions d'usage. On peut éventuellement préciser les conditions de partage entre plusieurs processus. Une lecture simultanée ne pose pas de problème lorsque l'information ne change pas mais devient délicate si elle est modifiée. Nous l'évoquerons au paragraphe suivant. Lors de l'ouverture on alloue les tampons nécessaires au transfert - on peut parfois indiquer leur taille et leur nombre- et on crée éventuellement le fichier ainsi que son descripteur s'il n'existe pas encore. La primitive retourne un code d'erreur qu'il convient de tester avant de commencer la moindre opération sur le fichier.

En langage C la fonction qui procède à cette ouverture, fopen, retourne un pointeur sur cette structure. En Fortran elle est identifiée par un numéro choisi par le programmeur.

A la fermeture il suffit, dans la majorité des cas, de donner la référence du flot de communication. Le descripteur en mémoire est supprimé, celui sur le disque est mis à jour et les tampons sont vidés. Il faut insister sur l'importance de cette dernière opération. En général lorsqu'un processus se termine normalement les fichiers encore ouverts sont automatiquement fermés. Mais si le processus s'arrête de façon anormale, en cas d'erreur ou de panne, l'information contenue dans les tampons est perdue. Ce risque est facilement évitable en évitant de maintenir ouvert un fichier plus longtemps que son usage ne le nécessite.

Accès à l'information

Les primitives de lecture et d'écriture doivent gérer non seulement les informations à lire ou à écrire mais aussi un ensemble de paramètres qui dépendent de la méthode d'accès. On utilisera des fonctions différentes pour les accès synchrones et asynchrones.

Accéder à l'information nécessite trois opérations :

  • la détermination des adresses physiques de transfert en mémoire et sur disque
  • la préparation du transfert
  • le transfert proprement dit.

Il faut savoir que les deux premières étapes sont sensiblement de même durée que la quantité d'information à transférer soit petite ou grande, d'où la nécessité absolue de gérer correctement les tailles de blocs physiques échangés afin de minimiser le nombre d'interruptions du processeur.

Dans le cas de fichiers partagés, c'est également au cours de la préparation du transfert que doivent être réglés les conflits d'accès éventuels, notamment en écriture. Sans précaution particulière on risquerait de voir deux processus différents modifier presque simultanément un même enregistrement; l'information écrite sur le disque pourrait donc être fausse. Pour répondre à cette difficulté il existe deux techniques.

Dans la première on réserve le fichier à l'usage exclusif d'une seule application. Les autres processus sont mis en attente mais des délais maximum doivent être précisés si on veut éviter des verrous mortels. Cette technique est trop frustre si un fichier doit être partagé entre un grand nombre d'applications : on imagine mal les différents terminaux d'un système de réservation se mettant en attente les uns sur les autres jusqu'à la fin des transactions précédentes! Les systèmes transactionnels, les bases de données utilisent une approche plus fine en bloquant uniquement l'accès à un enregistrement donné. Si une application lit un article avec l'intention de le modifier, par exemple pour une réservation de siège dans un train, elle le marque et le rend indisponible pour tout autre. Le schéma temporel est le suivant :

Requête 1 Requête 2
......
boucle sur les enregistrements
lire le fichier;
.....
choix de l'enregistrement n à modifier;
bloquer (n);
fin boucle
.....
modifier (n);
libérer (n);

 

......
boucle sur les enregistrements
lire le fichier;
.....
ignore n si bloqué
fin de boucle
......

 

L'article n reste invisible ou non modifiable pour la deuxième reqête tant que la première n'a pas terminé son opération.

Une erreur classique est de ne pas vérifier, avant modification, si un article qui a été préalablement lu sans blocage, n'a pas été modifié depuis. Ceci explique les gags comme les doubles réservations. Il faut aussi faire très attention à bien gérer la libération des articles: si une application vient à disparaître prématurément il n'est pas simple de gérer la libération des enregistrements qui n'ont pas été débloqués.


Copyright Yves Epelboin, université P.M. Curie, 2000, MAJ 8 mars, 2006

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