3.11. Macintosh: gestion de l’espace disque

Nous nous intéressons à une gestion particulière de l'espace attribué aux fichiers. L'espace disponible pour les données des fichiers est découpé en blocs (au plus 32768 blocs) de taille fixe, multiple de 512 (taille d'un secteur). Les blocs de cet espace sont numérotés à partir de 0. L'espace libre est représenté par un tableau de bits. Le descripteur de volume contient les informations suivantes :
taille d'un bloc en octets (32 bits),
nombre total de blocs du volume (16 bits),
nombre de blocs libres de l'espace libre (16 bits),
numéro du premier bloc libre (16 bits),
L'espace alloué à un fichier est représenté par un certain nombre de zones, chaque zone étant définie par le numéro de son premier bloc et le nombre de blocs qu'elle contient. Les seize premières zones d'un fichier sont mémorisées dans le descripteur de fichier qui contiennent les informations suivantes :
la longueur physique du fichier en octets,
la longueur logique du fichier en octets,
16 descripteurs de zones (numéro de premier bloc, nombre de blocs).
Lorsque l'on tente d'écrire au delà de la fin physique d'un fichier, le système alloue un nouveau bloc. La recherche de ce bloc libre se fait de préférence au bout de la dernière zone déjà allouée au fichier. Si ce n'est pas possible, une nouvelle zone est ajoutée au fichier (le système peut gérer un nombre quelconque de zones, mais nous supposerons ici qu'il n'y en a jamais plus de 16).
A- Comment peut-on déterminer la taille en nombre d'octets du volume, ainsi que celle de l'espace libre? En supposant qu'un volume contient 1 Go, donner la taille minimale d'un bloc.
B- Quelle différence faites vous entre la longueur physique d'un fichier et sa longueur logique?
C- Expliquer les opérations effectuées pour trouver le secteur qui contient un octet quelconque, dont on connaît le numéro dans l'organisation non structurée.
D- Montrer que, s'il reste de l'espace libre, l'allocation est toujours possible. Evaluer le temps d'une allocation.
E- Cette implantation, faite sur un ordinateur individuel, permet en général d'avoir des zones de grandes tailles. Par contre, si elle est faite sur un ordinateur utilisé simultanément par beaucoup d'utilisateurs, elle conduira à des zones de petites tailles. Expliquer pourquoi.
F- Décrire ce qu'il faut faire lors de la destruction d'un fichier, quant à l'espace qu'il occupe.
G- Quels sont les avantages et les inconvénients de cette implantation.
Solution de l’exercice 3.11

3.11.1. Question A

La taille en nombre d'octets du volume est obtenue en faisant le produit entre les deux valeurs "taille d'un bloc en octets" et "nombre total de blocs du volume" qui sont situés dans le descripteur de volume. Pour connaître la taille de l'espace libre, il suffit de faire le produit entre les deux valeurs "taille d'un bloc en octets" et "nombre de blocs libres de l'espace libre" qui sont situés dans le descripteur de volume.
Si on suppose que le volume contient 1 Go, le nombre total de blocs étant limité à 32768, la taille d'un bloc est donc au moins de 1Go/32768, soit 32768. Notons que un bloc représente 64 secteurs.

3.11.2. Question B

La longueur physique d'un fichier représente la quantité d'espace disque qui lui est alloué. C'est donc le nombre d'octets qu'il occupe réellement sur le disque. La longueur logique d'un fichier représente le nombre d'octets qui contiennent des informations appartenant au fichier. C'est donc le nombre d'octets utiles du fichier. La longueur logique est toujours inférieure ou égale à la longueur physique, et la différence est un espace inutilisé du disque. Ces deux quantités ne sont pas égales, en général. La première est liée à la quantité d'informations à mettre dans le fichier. La seconde tient compte de la méthode de gestion de l'espace disque.

3.11.3. Question C

Notons Zi la i-ème zone d'un fichier, Ti sa taille en nombre de blocs, et Di le numéro de son premier bloc. Notons Tb la taille d'un bloc du volume. Rechercher le secteur qui contient l'octet de numéro N du fichier, en supposant que N est inférieur à la longueur logique du fichier, et donc à sa longueur physique, consiste d'abord à rechercher la zone Zi qui contient cet octet, ainsi que la position relative Pr de l'octet dans la zone. Le secteur est alors celui de numéro (Pr + Di * Tb)/512, la place de l'octet dans le secteur correspondant au reste de cette division.
Pour déterminer la zone, il faut déterminer i tel que :
, on a alors
On peut l'obtenir par le petit programme suivant:
Pr := N;				/* position dans le fichier */
I := 0;					/* première zone */
tantque Pr >= T[I] faire
	Pr := Pr - T[I];	/* position relative dans la suite */
	I := I + 1;
fait;
Ns := (Pr + D[I] * Tb)/512;

3.11.4. Question D

L'allocation d'espace se fait lorsque l'on tente d'écrire au delà de la fin physique du fichier, et dans ce cas on alloue un bloc unique. Donc s'il reste de l'espace libre, l'allocation sera possible, puisque n'importe quel bloc peut convenir. Si le système cherche de préférence à allouer un bloc au bout de la dernière zone, il alloue un autre bloc quelconque lorsque ce n'est pas possible. La seule contrainte pourrait être la limitation du nombre de zones d'un fichier. Or il est dit que le système gère un nombre quelconque de zones.
On peut penser que la table de bits représentant l'espace libre est toujours présente en mémoire, et n'est réécrite que de temps en temps lorsqu'elle a été modifiée. Ceci peut poser des problèmes de sécurité, mais nous n'en parlerons pas. Cette table contient au plus 32768 bits, donc 4096 octets, ou 8 secteurs. Ce n'est pas trop encombrant en mémoire centrale.
Lors de l'allocation, il faut d'abord tester si le bloc qui suit la dernière zone est libre. Notons qu'il s'agit du bloc de numéro Di + Ti, si i est le numéro de cette zone. Si ce bloc est libre, il suffit de changer son état à occupé et d'allonger la zone Zi en incrémentant Ti. Si ce bloc n'est pas libre, on crée une nouvelle zone, de taille 1, qui commence au numéro du premier bloc libre trouvé dans le descripteur du volume. Enfin, il faut mettre à jour la longueur physique du fichier et le nombre de blocs libres de l'espace libre. Toutes ces actions demandent un temps fixe que l'on peut estimer à quelques microsecondes sur les ordinateurs actuels.
Il faut également mettre à jour le numéro du premier bloc libre du descripteur de volume, si c'est ce bloc qui a été alloué. Cela implique de rechercher à partir de ce numéro de bloc (il est inutile de rechercher avant, car il n'y en a pas) le prochain bloc libre. Il est possible que ce soit le suivant. Il est possible que l'on ait besoin d'en parcourir beaucoup avant d'en trouver un de libre. Évidemment, il y en a au pire 32768, si le dernier bloc libre était le premier. Intuitivement, si l'on n'est pas trop près de la saturation, il y a des blocs libres un peu partout dans l'espace, et on ne mettra pas trop de temps pour le trouver. Supposons qu'il soit nécessaire de parcourir 1000 blocs occupés avant d'en trouver un de libre. S'il faut 1 microseconde par bit, cela donne 1 milliseconde. Cependant ceci peut être amélioré. En effet si on représente l'état occupé par un bit à 0, la recherche d'un bloc libre est la recherche d'un bit à 1. Mais un tel bit est alors situé dans un octet qui n'est pas nul, ou encore dans un mot machine qui n'est pas nul. Sur une machine à 32 bits, cela signifie rechercher un mot non nul parmi 32. Une fois ce mot trouvé, on recherche le bit à 1 parmi les 32 du mot. Tout ceci doit pouvoir être fait en au plus 64 microsecondes.

3.11.5. Question E

Sur un ordinateur individuel, il n'y a qu'un seul utilisateur à la fois. Il s'en suit qu'il n'y a en général qu'un seul fichier en cours de création. Bien que l'allocation se fasse bloc par bloc, l'espace alloué au fichier viendra des premières portions d'espace contigu, qui sont libres avant cette création.
Si l'ordinateur est utilisé simultanément par beaucoup d'utilisateurs, cela implique qu'il peut y avoir plusieurs fichiers en cours de création. Le système sera alors amené à allouer de l'espace, à raison de un bloc à la fois, tantôt pour l'un tantôt pour l'autre de ces fichiers. Les blocs ainsi alloués ne seront alors jamais au bout de la dernière zone déjà allouée au fichier, et conduiront à l'ajout d'une nouvelle zone. Notons que ceci pourrait également se faire sur un ordinateur individuel si un même programme créait deux fichiers simultanément, en écrivant tantôt dans l'un tantôt dans l'autre. Un tel programme est cependant assez rare.

3.11.6. Question F

Lors de la destruction d'un fichier, en dehors des actions à faire sur les répertoires, il faut restituer à l'espace libre l'espace qu'il occupait. Ceci se traduit simplement par la remise à l'état libre de chacun des blocs contenus dans chacune des zones du fichier. En même temps, il faut éventuellement remettre à jour le numéro de premier bloc libre du descripteur de volume. Le morceau de programme suivant donne les grandes lignes de ce qu'il faut faire.
J := Longueur_Physique / Tb;  /* nombre de blocs du fichier */
I := 0;							/* première zone du fichier */
tantque J > 0 faire
	pour K dans D[I] .. D[I] + T[I] - 1 faire
		Etat[K] := Libre;	/* libérer les blocs de la zone */
	fait;
	si D[I] < Premier_Bloc_Libre alors Premier_Bloc_Libre := D[I]; finsi;
	J := J - T[I];
	I := I + 1;
fait;

3.11.7. Question G

Les avantages comme les inconvénients ont déjà été évoqués, en grande partie du moins, dans les questions précédentes. On note ainsi que, contrairement aux différentes techniques d'allocation par zone, l'allocation est toujours possible, pourvu qu'il reste de la place, évidemment. En ce sens, le système se rapproche de la technique utilisée dans VMS, lorsque l'utilisateur demande une allocation au mieux. De plus, si le disque comporte de grandes zones libres, le système allouera un nombre réduit de zones au fichier, améliorant les performances par rapport à une allocation par blocs de taille fixe. On a donc un bon compromis entre les deux techniques d'allocation.
L'inconvénient majeur est lié au fait que les zones d'un fichier sont de tailles variables. Si on ne fait que des accès séquentiels sur de tels fichiers, ce n'est pas gênant, puisqu'on va parcourir les zones les unes après les autres en tenant compte de leurs tailles successives. Si on fait de l'accès aléatoire, nous avons vu dans la question C qu'il faudra parcourir la table des descripteurs de zones du fichier, pour déterminer celle qui contient l'information recherchée. Si le fichier contient peu de zones, ce parcours sera très rapide. S'il contient beaucoup de zones, cela peut prendre un peu de temps. Encore faut-il relativiser: s'il y a 50 zones, il faut en parcourir 25 en moyenne, ce qui peut demander 100 microsecondes à raison de 4 microsecondes par zone. Or la question E induit l'idée que même un gros fichier ne comportera qu'un nombre réduit de zones.
Remarque (hors sujet): cet exercice, comme le précédent d’ailleurs, est tiré de la gestion du MacIntosh. Dans le système réel, le descripteur de fichier ne contient que 3 descripteurs de zones, les autres descripteurs de zones éventuels sont rangés dans un B-arbre, tous fichiers confondus. L'expérience montre que très peu de fichiers ont plus de 3 zones, cependant la méthode n'impose pas de véritable limite sur le nombre de zones d'un fichier.