Vous êtes sur la page 1sur 51

Cours: Système d’exploitation

Chapitre 4: La gestion des fichiers


PLAN

L’organisation des fichiers

2 Le système de gestion de fichiers

Les types d’allocation de l’espace disque

Le système de gestion de fichiers sous UNIX/Linux


3 Introduction
 Plusieurs processus doivent pouvoir accéder simultanément aux informations

 Ces informations ne doivent pas disparaître lorsque le processus qui les utilise se termine

stocker des informations dans des fichiers sur le disque dur ou autres supports
d’une façon permanente

 Les fichiers sont gérés par le système d’exploitation

 La manière dont ils sont structurés, nommés, utilisés, protégés et implémentés sont des points
majeurs de la construction du SE.
4
L’organisation des fichiers
Le concept de fichier
Le concept de repertoire
Le concept d’un systéme de fichiers
Le concept de fichier
5
 Définition

 Un fichier est un ensemble d'informations structurées regroupées en vue de leur


conservation (notion de persistance) et de leur réutilisation dans un système
informatique.

 Dans un fichier, on peut écrire du texte, des images, des calculs, des programmes.

 Les fichiers sont généralement créés par les utilisateurs.

 Certains fichiers sont générés par le système ou certains outils comme les
compilateurs.

 Chaque fichier est identifié par un nom auquel on associe un emplacement sur le
disque et possède un ensemble de propriétés : ses attributs.
Le concept de fichier
6
 Affectation des noms de fichiers

 Le nom est en général, composé de deux parties séparées par un point.

Nom.extension

 Règles d’affectation des noms de fichiers varient selon le système.

 Les chiffres et les caractères spéciaux sont autorisés pour certains systèmes de fichiers.

 UNIX différencie les minuscules des majuscules, DOS ne fait pas de différence.

 L'extension peut être de taille fixe, comme dans MS-DOS ou variable comme c'est le cas
d'Unix/Linux ; obligatoire ou non.

 L'extension est nécessaire dans certains cas.

 Exemple: le compilateur C rejettera le fichier prog.txt même si son contenu est un programme C.
7 Le concept de fichier
 Types de fichiers

Fichier ordinaire : contient les informations des utilisateurs


Types de fichiers

Les répertoires : fichiers systèmes qui maintiennent la structure du système de fichiers

Fichiers spéciaux caractères : liés aux E/S et permettent de modéliser les périphériques
d’E/S série tels que les terminaux, imprimantes et les réseaux

Fichiers spéciaux blocs : modélisent les disques


8 Le concept de fichier
 Types de fichiers

 Les fichiers ordinaires sont en général des fichiers ASCII ou des fichiers binaires.

Fichiers ASCII Fichiers binaires

 contiennent des lignes de texte  contiennent des caractères de signes


éditer par éditeur standard incompréhensibles

si le fichier est utilisé en E/S par un  Ils ont une structure interne
programme, il est alors facile de faire  Il existe une commande permettant
communiquer la sortie du programme d’avoir des indications sur les fichiers
avec l’entrée d’un autre programme. d’un répertoire :
Exemple : le tube (pipe). file * (dans le répertoire courant)
9 Le concept de fichier
 Types de fichiers

 Dans le système Unix/Linux:

 "-" désigne les fichiers ordinaires,

 "d" les répertoires,

 "c" les périphériques à caractères,

 "b" les périphériques à blocs,

 et "p" les tubes avec nom (named pipe).


10 Le concept de fichier
 Attributs des fichiers

 Chaque fichier possède un nom et des données.

 Tous les SE associent les informations complémentaires pour chaque fichier qu’on
appelle attributs des fichiers (exp : date, heure de création, taille du fichier, etc..).

 La liste des attributs varie d’un système à un autre.


11 Le concept de fichier
 Attributs des fichiers
Champ Signification

Protection Qui peut accéder au fichier et de quelle façon

Mot de passe Mot de passe requis pour accéder au fichier

Créateur Personne qui a créé le fichier

Propriétaire Propriétaire courant

Indicateur lecture seule 0 pour lecture/écriture, 1 pour lecture seule

Indicateur fichier caché 0 pour fichier normal, 1 pour ne pas l‘afficher dans les listages

Indicateur fichier système 0 pour fichier normal, 1 pour fichier système

Indicateur d’archivage 0 le fichier a été archivé, 1 il doit être archiver

Indicateur fichier ASCII/binaire 0 pour fichier ASCII, 1 pour fichier binaire

Indicateur d’accès aléatoire 0 pour accès séquentiel, 1 pour accès aléatoire

Indicateur fichier temporaire 0 pour fichier normal, 1 pour supprimer le fichier lorsque le processus se termine

Indicateur de verrouillage 0 pour fichier non verrouillé, 1 pour fichier verrouillé

Longueur d’enregistrement Nb d’octets dans l’enregistrement

Position de la clé Position relative de la clé dans chaque enregistrement

Longueur de la clé Nb d’octets du champ clé

Date de création Date et heure de création du fichier

Date du denier accès Date et heure du dernier accès au fichier


12 Le concept de fichier
 Le cycle de vie d’un fichier

 Les fichiers (comme bien d'autres composants) ont un cycle de vie :


creat
 Ils sont créés (ou ouverts),

 Ils sont modifiés (écrire), open write

 Leurs données sont récupérables (lire),


read
 et finalement, peut-être, ils meurent (sont effacés).
lseek
 Ces opérations sont illustrés avec des appels système.

close

unlink
13 Le concept de fichier
 Services Posix pour un fichier

 Les systèmes fournissent un ensemble d'appels système relatifs aux fichiers.

 Dans le cas d'Unix/Linux, les principaux appels système Posix relatifs aux fichiers sont :

 open() et creat() pour l'ouverture d’un fichier.

 close() pour la fermeture d’un fichier.

 read() pour la lecture d’un fichier. Tous ces appels systèmes peuvent être

 write() pour l'écriture dans un fichier. utiliser dans un programme afin de


travailler sur des fichiers.
 lseek() pour déplacer le pointeur de fichier.

 stat() pour récupérer des informations d’un fichier.

 link() pour créer un lien entre deux fichiers.


14 Le concept de fichier
 Exemple: Ecrire un programme qui permet de calculer et afficher le nombres de caractères d'un
fichier ASCII (Utiliser n'importe quel fichier du répertoire).

#include <stdio.h> while (buffer[compteur] != '\n'){


#include<unistd.h> lus = read(fd, buffer, 1);
#include<fcntl.h> compteur++;u
#include<sys/stat.h> }
#define taille 80 close(fd);
int main() { printf("TAILLE DU FICHIER: %d OCTETS\n",compteur);
char buffer[taille]; return 0;
int fd,lus,compteur=0; }

fd=open("exemple.c", O_CREAT|O_WRONLY);
lus = read(fd, buffer, taille);
15 Le concept de répertoire
 Définition

 Le répertoire peut être considéré comme une table sur le support permettant de référencer
tous les fichiers existants avec leurs noms et leurs attributs principaux qui peuvent varier d'un
système d'exploitation à un autre.

 Parmi ces attributs, on peut citer:

 le nom

 le type

 la taille

 le propriétaire

 la protection

 la date de création

 la localisation sur disque (ou l'adresse du premier enregistrement).


16 Le concept de répertoire
 Un répertoire contient un certain nombre d’entrée, une entrée par fichier.

 Deux possibilités:

Chaque entrée contient le nom du fichier, ses attributs et ses adresses sur le disque où les
données sont stockées.
Chaque entrée contient le nom du fichier et un pointeur sur une structure contenant ses
attributs et ses adresses sur le disque.
17 Le concept de répertoire
 Les chemins d’accès

 Chemin d’accès absolu

 constitué à partir du répertoire racine

 Sous UNIX, le séparateur « / »

 Sous DOS et Wxx, le séparateur « \ »

 Chemin d’accès relatif

 permet d'identifier l'emplacement d'un fichier à partir du répertoire courant.

 . répertoire courant

 .. Le père du répertoire courant


18 Le concept de répertoire
 Les chemins d’accès

 Dans la figure, le fichier exemple.txt possède comme:

 chemin absolu A/B/E/

 chemin relatif au répertoire B, B/E/.


closedir() fermer un répertoire.

19 Le concept de répertoire
readdir() lire les entrées d'un répe
rewindir() placer le pointeur d'un répertoire.
 Services Posix sur les répertoires
link() créer une entrée dans un répertoire.
 mkdir() créer un répertoire.

 rmdir() supprimer un répertoire vide. unlink() effacer une entrée d'un répertoire.

 opendir() ouvrir un répertoire. chdir() changer de répertoire de travail.


 closedir() fermer un répertoire.
rename() renommer un répertoire.
 readdir() lire les entrées d'un répertoire.
getcwd() obtenir le nom du répertoire actuel
 rewindir() placer le pointeur d'un répertoire.

 link() créer une entrée dans un répertoire.

 unlink() effacer une entrée d'un répertoire.

 chdir() changer de répertoire de travail.

 rename() renommer un répertoire.

 getcwd() obtenir le nom du répertoire actuel


20 Le concept de système de fichiers
 Un système de fichiers est une représentation de bas niveau des données sauvegardées
(fichiers et répertoires)

 Les systèmes d'exploitation modernes adoptent une structure arborescente pour représenter
le système de fichiers.

 Les nœuds de l'arbre sont des répertoires et les feuilles sont des fichiers
21
Le Système de Gestion de Fichiers (SGF)
La notion d’un SGF

Les fonctionnalités d’un SGF


22
La notion d’un SGF

 Le SGF est un module du noyau qui sert à gérer un système de fichiers.

 Il s’agit d’un ensemble de méthodes et de structures de données permettant de manipuler


les données (fichiers et répertoires) stockées sur des mémoires secondaires.

 En effet, il est chargé d’organiser et d’optimiser l’implantation des fichiers sur les différents
supports.

 Une telle gestion des fichiers permet de traiter et de conserver des quantités importantes de
données ainsi que de les partager entre plusieurs programmes informatiques.

 Il offre à l’utilisateur une vue abstraite sur ses données et permet de les localiser à partir d’un
chemin d’accès.
23 Les fonctionnalités d’un SGF
 Le SGF joue un rôle primordial dans un système d’exploitation car il doit gérer la
plupart des informations des utilisateurs et du système lui-même.

 Il a comme fonctionnalités :

 Conservation permanente des fichiers.

 Manipulation des fichiers : le SGF fournit un certain nombre d'opérations pour la


manipulation des fichiers et des répertoires (création, insertion, suppression, modification).

 Allocation de zones mémoires : le SGF alloue à chaque fichier un nombre variable de


blocs (suite d'octets de taille fixe).
24 Les fonctionnalités d’un SGF
 Il a comme fonctionnalités :

 Localisation des fichiers : chaque fichier est décrit par un ensemble d'informations qui
permettent d'identifier son emplacement (nom, adresse, etc.).

 Partage des fichiers : assurer une utilisation d'un même fichier / répertoire / disque par des
utilisateurs différents.

 Protection des fichiers : le SGF doit assurer la sécurité et la confidentialité des données
surtout en cas de partage. Des droits d'accès sont ainsi associés à chaque fichier pour
assurer une protection contre les accès interdits.
25
Les types d’allocation de l’espace disque
Allocation contiguë
Allocation chaînée
Allocation indexée
26 Types d’allocation de l'espace disque
 Un fichier physique est constitué d'un ensemble de blocs physiques.

 Un bloc définit la plus petite unité allouable sur le support.

 L’allocation de ces blocs au fichier représente l’une des principales fonctions d’un
SGF.

 Différents points doivent être pris en considération pour l'allocation de l'espace


disque :

 l'optimisation du temps d'accès

 le coût de stockage

 l'évolution de la taille des fichiers (la fragmentation)


27 Types d’allocation de l'espace disque
 On distingue trois techniques d’allocation qui sont:

 l’allocation contiguë

 l’allocation chaînée

 l’allocation indexée
28 Allocation contiguë
 La méthode d'allocation contiguë consiste à stocker chaque fichier dans une suite de blocs
consécutifs.

 Pour chaque fichier à enregistrer, le système recherche une zone suffisamment grande pour
accueillir le fichier.

 Chaque fichier est ainsi décrit par l'adresse disque du premier bloc et sa taille.

 Les adresses des différents blocs d'un fichier sont obtenues par simple addition.
29 Allocation contiguë
 Avantages

 Simplicité de la mise en œuvre: il suffit de mémoriser un seul nombre, l’adresse du premier


bloc pour localiser le fichier.

 Performance excellente (la rapidité de l’accès): le fichier peut être lu en une seule opération
(limite les déplacements de la tête le lecture/écriture).

 Inconvénients

 Difficulté de prédiction de la taille qu’il faut réserver au fichier

 un fichier est amené à augmenter de taille, par conséquent il faut prévoir de l’espace
libre après le dernier secteur alloué.

 Si le fichier est agrandi, il faudra le déplacer pour trouver un nouvel ensemble de blocs
consécutifs de taille suffisante.
30 Allocation contiguë
 Inconvénients

 La perte d’espace sur le disque

 si on prévoit trop d’espace libre, le fichier risque de ne pas l’utiliser en entier.

 si on prévoit trop peu d’espace libre, le fichier risque de ne pas pouvoir être
étendu.

 Gaspillage de place: le dernier bloc a toutes chances d'être sous-utilisé

 Problème de fragmentation externe : c’est l’espace perdu en dehors des fichiers.

 Au fil de l’utilisation, il peut se créer un grand nombre de petites zones dont la


taille ne suffit souvent pas pour allouer un fichier mais dont le total correspond a
un espace assez volumineux.
31 Allocation chainée
 Chaque fichier est une liste chaînée de blocs de disques.

 Ces blocs peuvent être dans n'importe quel emplacement sur le disque.

 Chaque bloc, excepté le dernier, contient un pointeur vers le bloc suivant.

 Le dernier bloc d'un fichier contient un pointeur vers le premier emplacement libre.
32 Allocation chainée
 Avantages
 Elimination du problème de fragmentation externe: pas d’espace perdu
 Tous les blocs peuvent être utilisés

 Inconvénients
 L’accès au fichier est totalement séquentiel, on doit toujours commencer le parcours du
fichier à partir du début.
 La perte d’un chaînage entraîne la perte de tout le reste du fichier. Pire encore, il suffit
qu’une valeur soit modifiée dans un pointeur pour qu’on se retrouve dans une autre zone
de la mémoire.
33 Allocation indexée
 Ce système d’allocation utilise une table d’index pour allouer les blocs au fichier.

 A chaque fichier sera associée une entrée dans la table.

 Ainsi, cette table contient la liste des pointeurs des blocs alloués au fichier.
34 Allocation indexée

 De cette manière, les informations sur les numéros de blocs peuvent être obtenue à tout
moment.

 Chaque élément de la table contient l’adresse physique du bloc alloué au fichier.

 Ceci permet d’accéder directement à chaque bloc du fichier sans être obligé d’accéder au
bloc précédent.
35 Allocation indexée
 Avantages

 Implémentation efficace de l’accès direct

 Inconvénients

 Problème de la taille des index


36 Allocation indexée
 La plupart des systèmes actuels appliquent ce mode.

 MS-DOS utilise la FAT (File Allocation Table) pour y conserver les chaînages entre
les blocs.

 Windows NT utilise la MFT (Master File Table) associé au système NTFS (New
Technology File System),

 UNIX, GNU/Linux utilisent le I-Node (Index node).


37 La gestion de l’espace libre sur le disque
 Les systèmes d’exploitation utilisent essentiellement deux approches pour mémoriser
l’espace libre :

 une statique (Bitmap)

 une dynamique (liste chainée)


38 La gestion de l’espace libre sur le disque
 Bitmap

 Approche statique utilise une table de bits (vecteur de bits n blocs) comportant autant
de bits que de blocs sur le disque.

 A chaque bloc du disque, correspond un bit dans la table, positionné à 1 si le bloc est
occupé, à 0 si le bloc est libre (ou vice versa).

0 1 2 N-1
……………

 Si les blocs 3, 4, 5, 9, 10, 15, 16 sont libres : 11100011100111100…

 Cette solution est utilisée pour trouver n blocs contigus, elle est utilisée dans les systèmes :
NTFS, ext2fs
39 La gestion de l’espace libre sur le disque
 Liste chaînée

 Approche dynamique utilise une liste chaînée constituée d’éléments, chacun


mémorisant des numéros de blocs libres.

 Tous les blocs libres sont liés ensemble par des pointeurs. 11100011100111100

3,3 9,2 12,1

occupé libre
40
Le SGF sous Unix/Linux
41 Le SGF sous Unix

icônes
 Un fichier Unix est une suite finie de bytes (octets).
Interface graphique
 Un fichier est matérialisé par une inode et des blocs noms
symboliques
du disque. Gestion des catalogues
descripteurs
 C’est l’inode qui définit les fichiers avec un
Opérations d’accès
ensemble d’informations (taille, dates,
i-nodes
localisation…). Conservation des fichiers
adresses
physiques
disque
42 Le SGF sous Unix
 Les inodes
Attributs
 Un nœud d’index est constitué de:

 attributs décrivant le fichier ou le répertoire


Adresses
 adresses de blocs contenant des données
blocs

inode
43 Le SGF sous Unix
 Les inodes
Attributs
 Cette structure contient les attributs suivants :

 Type( régulier, répertoire, caractères, spécial, tube)


Adresses
 Les droits d’accès
blocs
 le nombre de références existant pour ce fichier dans le système

 l’identité du propriétaire et du groupe


inode
 la taille

 les dates de création, de dernière consultation et de dernière modification


44 Le SGF sous Unix
 Les inodes

 les dix premiers pointeurs aux blocs de données

 d’autres entrées contiennent l’adresse d’autres blocs (on parle alors de bloc
d’indirection) :

 une entrée pointe sur un bloc d'index qui contient 128 ou 256 pointeurs sur bloc de
données (simple indirection)

 une entrée pointe sur un bloc d'index qui contient 128 ou 256 pointeurs sur bloc
d'index dont chacun contient 128 ou 256 pointeurs sur bloc de données (double
indirection)

 une entrée pointe sur un bloc d'index qui contient 128 ou 256 pointeurs sur bloc
d'index dont chacun contient 128 ou 256 pointeurs sur bloc d'index dont chacun
45 Le SGF sous Unix

Attributs

Bloc de données
Adresses
blocs
Bloc d’indirection
simple

inode
Bloc d’indirection
double

Bloc d’indirection
triple
46 Le SGF sous Unix
 Les inodes

 Capacité de la structure d'index

 numéro de bloc sur 32 bits (4 octets)

 bloc de 1 KO

 On peut donc mettre p = 256 numéros de blocs dans un bloc.

 blocs directs : 10 blocs

 bloc indirect_1 : 256 blocs

 bloc indirect_2 : 256 2 blocs

 bloc indirect_3 : 256 3 blocs

 Nombre maximum de blocs dans un fichier : 10 + 256 + 2562+ 2563


47 Le SGF sous Unix
 Exercice d’application

 On considère un fichier de type UNIX.

 Le fichier a une taille de 16 Moctets.

 Les blocs disque sont de 1024 octets.

 Un numéro de bloc occupe 2 octets.

1. Quel est le nombre de blocs de données du fichier ?

2. Combien comporte-t-il de blocs d’adresses ?

3. Représentez sur un schéma l’allocation des blocs de données du fichier et donnez


le nombre total de blocs d’adresses nécessaires pour allouer le fichier.
48 Le SGF sous Unix
 Correction d’exercice

1. Nombre de blocs de données du fichier = Taille_fichier / Taille_bloc_disque


= 24 * 220 / 210 = 214
= 16384 blocs de données.

1. Nombre de blocs d’adresses = Taille_bloc_disque / Taille_numero_bloc

= 1024 / 2

= 512 entrées.
49 Le SGF sous Unix
 L’allocation est réalisée comme suit : 10 blocs de données sont en accès direct pointés par

les 10 premières entrées de la table de l’inode.

 Il reste à allouer 16384 – 10 = 16374 blocs de données.

 Le niveau INDIRECT_1 permet d’allouer 512 blocs. Il reste 16374 – 512 = 15862 blocs de

données. On a à ce niveau un premier bloc d’adresses (ou d’index).

 Le niveau INDIRECT_2 permet d’allouer au maximum 5122 blocs de données ce qui est

largement supérieur à 15862.

 Tous les blocs restants sont donc repérés à partir de ce niveau. Il faut déterminer jusqu’à

quelle profondeur. On peut écrire que 15862 = 512 * 30 + 502, nécessite donc 31 blocs
50 Le SGF sous Unix
BD1

Attributs
BD2

BD11
Adresses
512 blocs de
blocs BD10
données
BD522

30*512 blocs
de données
inode
INDIRECT1
512 entrées
INDIRECT2-1

INDIRECT2-30

Non utilisé
INDIRECT2
512 entrées INDIRECT2-31
51 Le concept de fichier
 Exemple: Ecrire un programme qui permet de calculer et afficher le nombres de caractères d'un
fichier ASCII (Utiliser n'importe quel fichier du répertoire).

#include<unistd.h> write(1, " Ouverture avec succès",30);


//copier les données introduites à partir du clavier dans
#include<fcntl.h>
le fichier
#define taille 80
while((nbcar=read(0,buf,taille))>0)
int main(){
if(write(fd,buf,nbcar)==-1)
int fd,nbcar;
return -1;
char buf[taille];
return 0;
//crée puis ouvre un fichier en écriture exclusive
}
fd=open("fichier",O_CREAT|O_WRONLY);
if(fd==-1){
write(2, " Erreur d’ouverture ",25);
return -1;}

Vous aimerez peut-être aussi