<figure><img src="image_1.png" /></figure>

HAL
open science

# Le systeme de gestion de fichiers sgf-da

Michel Grave, Georges Ouanounou, Eric Saltel

► To cite this version:

Michel Grave, Georges Ouanounou, Eric Saltel. Le systeme de gestion de fichiers sgf-da. [Rapport de recherche] IRIA-RR-254, IRIA. 1977, pp.40. hal-04716444

HAL Id: hal-04716444

https://inria.hal.science/hal-04716444v1

Submitted on 1 Oct 2024

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_2.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
DW-03476 RR 254

IRIA

laboria

Institut de Recherche
d'Informatique
et d'Automatique

Domaine de Voluceau
Rocquencourt
B. P. 105 78150 - Le Chesnay
France
Tél.: 954 90 20

laboratoire de recherche
en informatique
et automatique

<figure><img src="image_3.png" /></figure>

LE SYSTÈME DE GESTION
DE FICHIERS SGF. DA

Michel GRAVE,
Georges OUANOUNOU,
Eric SALTEL

Rapport de Recherche N° 254

Octobre 1977

40p.
# LE SYSTEME DE GESTION DE FICHIERS SGF.DA

Michel Grave, Georges Ouanounou, Eric Saltel

IRIA/LABORIA

## Résumé :

Ce rapport présente un système de gestion de fichiers développé sur Mitra 15. Ce système se compose de 2 ensembles de sous-programmes, l'un écrit en assembleur et offrant un ensemble complet de possibilités de manipulation de fichiers, l'autre écrit en FORTRAN pour des raisons de portabilité, mais n'offrant qu'un sous-ensemble des possibilités du premier. Ce rapport est principalement destiné à servir de manuel d'utilisation, mais on trouvera cependant dans la der-nière partie quelques résultats obtenus sur les vitesses d'exécution des sous-programmes, dans différents contextes.

## Abstract :

This report presents a system for file management developed on a Mitra 15. This system consists in 2 sets of subroutines: the first one is written in assembly code and provides a complete set of possibilities for file manipulation; the second one is written in FORTRAN for portability, but provides only a subset of the possibilities of the first one. This report is mainly written as a user's manual, however in the last section, some results about speed of execution of subroutines in different contexts are presented.
## SOMMAIRE

1 Introduction 1

2 Généralités 2

2.1 Organisation des disques 2

2.2 Organisation d'une zone 2

2.3 Organisation des fichiers 3

3 Description des sous-programmes 5

3.1 Sous-programmes écrits en assembleur 5

3.1.1 Utilisation à partir de l'assemblageur 5

3.1.2 Détail des sous-programmes 7

G:DEBU 7

G:INIT 7

G:VERD 7

G:LFIL 7

G:GRFL 7

G:DEFL 8

G:AJEN 8

G:DEEN 8

G:IREN 8

G:FCEN 8

G:PROT 8

G:TYFL 8

G:FLSH 9

G:SDMP 9

G:ESEC 9

3.1.3 Utilisation à partir de FORTRAN 10

INITDA 10

DEFDSQ(DSQ,NAMDSQ) 10

OPNFCH(NAMFIC) 10

CREFCH(NAMFIC,N) 10

DETFCH(NAMFIC) 11

INSENR(N,BUF) 11
<table><tbody><tr><td>DETENP(N)</td><td>11</td></tr><tr><td>DEFENR(N)</td><td>11</td></tr><tr><td>ECRENR(BUF)</td><td>11</td></tr><tr><td>LIRENR(BUF)</td><td>11</td></tr><tr><td>NBRENR(N)</td><td>11</td></tr><tr><td>FLASH(OUT)</td><td>11</td></tr><tr><td>3.2 Sous-programmes écrits en FORTRAN</td><td>12</td></tr><tr><td>3.2.1 Généralités</td><td>12</td></tr><tr><td>3.2.2 INIDAG et GESTDA</td><td>13</td></tr><tr><td>3.2.3 Autres sous-programmes</td><td>15</td></tr><tr><td>3.2.4 Interface</td><td>15</td></tr><tr><td>4 Durées d'exécution des principaux sous-programmes</td><td>18</td></tr><tr><td>4.1 Version écrite en assembleur</td><td>18</td></tr><tr><td>4.2 Version écrite en FORTRAN</td><td>20</td></tr><tr><td>5 Développements ultérieurs</td><td>21</td></tr></tbody></table>

Annexes

<table><tbody><tr><td>1 Table de correspondance entre nombre de descripteurs par secteur et taille des descripteurs.</td><td>22</td></tr><tr><td>2 Tables donnant la taille des sous-programmes</td><td>23</td></tr><tr><td>3 Messages d'erreur</td><td>25</td></tr><tr><td>4 Courbes des durées d'exécution</td><td>29</td></tr><tr><td>5 Exemple de programme utilisant le SGF.DA</td><td>33</td></tr></tbody></table>
# 1. Introduction

Ce système de gestion de fichiers a été développé principalement pour 2 raisons : tout d'abord, l'utilisation de programmes graphiques interactifs a mis en évidence, si cela était encore nécessaire, le besoin de disposer de moyens permettant l'utilisation d'une mémoire secondaire le plus simplement possible, ensuite sous les systèmes fonctionnant sur MITRA 15, une zone est réservée sur les disques pour que les utilisateurs puissent y ranger des informations (le nom de cette zone -zone DA- explique le nom donné à ce système).

Le SGF.DA se présente sous la forme de 2 ensembles de sous-programmes. Le premier est écrit en assembleur et offre de nombreuses possibilités à l'utilisateur, le second est écrit en FORTRAN pour des raisons de portabilité, et ne présente qu'un sous-ensemble des possibilités pour des raisons d'encombrement mémoire des sous-programmes.

Le SGF.DA est destiné à permettre la manipulation de fichiers par programme sous une forme simple et les fichiers créés ne sont pas accessibles par les processeurs tels que le compilateur FORTRAN ou l'éditeur de liens. Il ne s'agit que de la gestion des données pour les programmes utilisateurs. L'information rangée dans les fichiers n'est pas contrôlée, et l'utilisateur qui a stocké des données doit savoir comment il l'a fait pour les retrouver.

Ce rapport est principalement destiné à servir comme manuel d'utilisation, et la présentation portera beaucoup plus sur les modalités d'utilisation que sur la justification des solutions qui ont été adoptées. On trouvera cependant certaines indications portant sur la mesure des durées d'exécution des principaux sous-programmes, l'utilisateur ayant la possibilité d'ajuster certains paramètres pour optimiser ces durées.

Le SGF.DA n'est que le point de départ de systèmes plus élaborés pour la mémorisation, et certains développements prévus ou souhaitables seront présentés succinctement à la fin de ce rapport.
## 2. Généralités

### 2.1 Organisation des disques

Dans une configuration, on peut trouver plusieurs unités de disques, par exemple on peut trouver une unité de disques amovibles de 2,5 M octets et une unité de disques souples amovibles de 250 K octets dans la configuration sur laquelle fonctionne le système graphique GIPSY pour lequel le SGF.DA a été développé. Chaque disque est découpé en plusieurs zones dont l'une est réservée aux utilisateurs (zone DA), ainsi un utilisateur peut avoir à sa disposition plusieurs zones simultanément. De plus, les disques étant amovibles, le nombre de zones que peut avoir un utilisateur est potentiellement infini.

Une zone devra donc être identifiée à l'aide de 2 noms, l'un repérant le type de disque, l'autre désignant le disque lui-même.

Une zone DA est un ensemble de secteurs consécutifs de 256 octets chacun, et la taille de la zone est fixée au moment de l'initialisation du disque.

### 2.2 Organisation d'une zone

Une zone sera divisée en 3 parties :

- Un _descripteur-disque_ qui contiendra tous les renseignements nécessaires à son identification et à l'initialisation de certaines variables. De plus ce descripteur contiendra une table donnant l'accès aux fichiers.

- Une _table d'allocation_ dont la taille variera avec celle de la zone.

- Une partie constituée de la suite de la zone et qui contiendra les fichiers.

Le descripteur-disque occupera le premier secteur et sera organisé de la façon indiquée sur le schéma suivant :
<figure><img src="image_4.png" /></figure>

La table d'allocation aura une taille égale à un nombre entier de secteurs, un secteur contenant 2048 bits et chaque bit étant as-socié à un secteur de la zone (1 pour secteur libre et 0 pour secteur occupé), si N est la taille en secteurs de la zone DA, la taille de la table sera égale à la partie entière de $(N-1)/2048$ plus 1.

L'allocation se fera par nombres entiers de secteurs.

## 2.3 Organisation des fichiers

Pour l'utilisateur, un fichier sera composé d'une liste d'enregistrements, l'accès à un enregistrement se faisant par l'intermédiaire du numéro représentant son rang dans la succession des enregistrements. Il sera possible de rajouter ou de détruire un enregistrement à tout endroit du fichier, et la lecture et l'écriture se feront sur tout enregistrement. Tous les enregistrements d'un même fichier auront la même taille qui sera égale à un nombre entier de secteurs, et le SGF,DA ne fera aucun contrôle sur l'information qui sera stockée sur les fichiers.
Un fichier sera composé de 2 parties :

- Un descripteur-fichier qui contiendra tous les renseignements nécessaires.

- Un ensemble d'enregistrements, non nécessairement consécutifs physiquement.

L'accès au descripteur d'un fichier se fait par l'intermédiaire d'un hash-code, à l'aide de la table située dans le descripteur du disque. A chaque nom on associera une valeur entière qui donnera la position dans la table du mot contenant l'adresse à laquelle on trouvera le descripteur du fichier. Lorsque plusieurs noms donnent le même hash-code, tous les descripteurs correspondant à ce code sont chaînés. Le chaînage est réalisé de façon différente suivant la situation. Si le secteur contenant les descripteurs de fichiers dont les noms ont donné le même hash-code n'est pas plein, le nouveau descripteur est mis à la suite des autres (le nombre de descripteurs par secteur est fixé au moment de l'initialisation de la zone et ce nombre est contenu dans le 7ᵉ mot du descripteur disque). Si le secteur est plein, une extension est créée, et son adresse est mise dans le dernier mot du secteur. On ne trouvera jamais dans un même secteur des descripteurs de fichiers n'ayant pas le même hash-code.

L'organisation d'un descripteur-fichier sera de la forme suivante :

<figure><img src="image_5.png" /></figure>
Les 14 premiers octets d'un descripteur sont destinés à recevoir certains renseignements et les octets reçoivent les adresses des premiers secteurs de chaque enregistrement (les secteurs d'un enregistrement sont consécutifs dans la zone). Ces adresses seront rangées dans le descripteur tant qu'il y aura de la place. Lorsque le descripteur est plein, on crée une extension dont l'adresse est rangée dans le 6ᵉ mot du descripteur. Il peut y avoir autant d'extensions qu'il est nécessaire et le 7ᵉ mot du descripteur contient l'adresse de la dernière des extensions.

Au moment de l'initialisation d'une zone, il faudra prendre garde à la valeur donnée pour le nombre de descripteurs par secteur. En effet, un choix judicieux permet des améliorations sensibles des vitesses d'exécution des sous-programmes. Ainsi, si l'on pense avoir de nombreux fichiers ne comportant qu'un petit nombre d'enregistrements, le nombre de descripteurs par secteur devra être assez grand, alors que si l'on pense avoir peu de fichiers mais des nombres d'enregistrements importants, le nombre de descripteurs devra être petit. Le tableau en annexe 1 donne une table de correspondance entre nombre de descripteurs par secteur et taille des descripteurs.

### 3. Description des sous-programmes

Dans le SGF.DA on trouve 2 ensembles de sous-programmes, le premier est écrit en assembleur Mitra 15 mais peut être utilisé aussi bien par des programmes écrits en assembleur que par des programmes écrits en FORTRAN, et le second est écrit en FORTRAN, de telle sorte qu'il peut être porté sur un autre calculateur en ne réécrivant que le sous-programme d'accès au disque. Le second ensemble de sous-programmes présente des restrictions par rapport au premier, sur un disque, le nombre de descripteurs par secteur est toujours égal à 1, les enregistrements ont toujours comme taille 1 secteur, et il n'est possible de rajouter un enregistrement ou de le détruire qu'à la fin du fichier. Ces restrictions ont permis de réduire la taille de certains sous-programmes, notamment les sous-programmes de destruction d'un fichier ou d'un enregistrement, et celui permettant de rajouter un enregistrement au fichier.
## 3.1 Sous-programmes écrits en assembleur

### 3.1.1 Utilisation à partir de l'assemblageur

Dans tout ce qui suit, le terme *nom de fichier* désignera l'ensemble des trois champs suivants :

- *code du disque* (DC ou DK ou DM) destiné à caractériser l'unité sur laquelle on travaille

- *nom du disque* (6 caractères) qui sert à vérifier si le disque monté est le bon

- *clé du fichier* (6 caractères) qui permet d'accéder au descripteur de fichier.

Pour l'appel des sous-programmes à partir de l'assemblageur, la séquence d'appel est toujours la même :

LEA nom de la table des paramètres

CLS nom du sous-programme

La *table des paramètres* est un tableau dont les 14 premiers octets contiennent le nom du fichier, les octets suivants (4 au maximum) contenant les autres informations éventuelles.

Les registres sont modifiés par ces sous-programmes, en particulier le registre A qui est utilisé pour indiquer si il y a eu ou non erreur au moment de l'exécution du sous-programme. Si tout s'est bien passé, A contient 0 sinon A contient 1 (ou parfois 2). De plus les erreurs provoquent l'impression de messages d'erreur (voir annexe 3).

Pour les sous-programmes appelés à partir de l'assemblageur, il n'y a pas de notion de fichier ou de disque courant, chaque sous-programme charge en mémoire le descripteur du fichier appelé, et change éventuellement de disque. Cependant, si l'on change le disque se trouvant sur une unité, il faut appeler un sous-programme faisant les mises à jour nécessaires. De plus, pour ces sous-programmes, la création et l'écriture d'un enregistrement sont indépendantes lors de la création d'un enregistrement, celui-ci est créé avec un contenu quelconque. Enfin l'écriture et la lecture sur le fichier se fait sans aucun contrôle, dans le cas d'une lecture, le contenu est transféré directe-
ment du disque vers le buffer utilisateur, et donc si l'enregistrement est trop grand, il y aura débordement du buffer.

### 3.1.2 Détail des sous-programmes

**G:DEBU** La référence à ce programme doit être la première rencontrée au moment de l'assemblage, ce sous-programme n'exécute aucune instruction, son rôle est d'assurer le bon chargement de la zone LDS qui est commune à tous les autres, au moment de l'édition de liens.

**G:INIT** Ce sous-programme n'est en général pas à utiliser dans un programme courant car c'est celui qui initialise une zone. Comme il n'est pas possible de vérifier si on ne détruit pas une zone déjà initialisée, il faut l'utiliser avec précautions.
Le paramètre supplémentaire à passer est le nombre de descripteurs par secteur qui doit être rangé dans le 7ᵉ mot de la table. Ce nombre doit être compris entre 1 et 18.

**G:VERD** Ce sous-programme vérifie si le nom du disque demandé correspond à ce qui existe, il est appelé par tous les autres, directement ou par l'intermédiaire de G:LFIL, et il n'y a pas de paramètre supplémentaire à passer.

**G:LFIL** Ce sous-programme charge le descripteur du fichier dont le nom est donné en paramètre, il sert également à vérifier l'existence d'un fichier. Aucun paramètre supplémentaire.

**G:CRFL** Sous-programme permettant la création d'un fichier. En plus du nom, il faut donner dans le 7ᵉ mot la taille des enregistrements.
G:DEFL Sous-programme détruisant un fichier. Aucun paramètre supplémentaire.

G:AJEN Sous-programme rajoutant un enregistrement. Il faut donner comme paramètre supplémentaire le numéro de cet enregistrement. Si ce numéro est inférieur ou égal à 1, l'enregistrement est inséré en tête du fichier, si il est supérieur au nombre d'enregistrements du fichier, l'enregistrement est rajouté en fin de fichier, sinon si ce nombre est n, on le rajoute devant le n<sup>e</sup> enregistrement du fichier.

G:DEEN Ce sous-programme détruit un enregistrement. Contrairement à G:AJEN, si le nombre donné en paramètre supplémentaire ne correspond pas à un enregistrement existant, il y a émission d'un message d'erreur et aucun enregistrement n'est détruit.

G:LREN Ces deux sous-programmes correspondent au même module à 2

G:ECEN points d'entrée. Ils permettent la lecture ou l'écriture d'un enregistrement. Les paramètres à passer sont le numéro d'enregistrement et l'adresse relative à G du buffer utilisateur.

G:PROT Ce sous-programme modifie la protection d'une zone ou d'un fichier. Le paramètre supplémentaire précise l'opération désirée : il est constitué d'un nombre héxadécimal :

<table><tr><td>&0000</td><td>pour déprotéger un fichier</td></tr><tr><td>&0001</td><td>pour protéger un fichier</td></tr><tr><td>&0100</td><td>pour déprotéger un disque</td></tr><tr><td>&0101</td><td>pour protéger un disque</td></tr></table>

G:TYFL Ce sous-programme retourne dans le registre E le nombre d'enregistrements que contient le fichier dont le nom a été passé en paramètre.
**G:FLSH** Ce sous-programme provoque l'impression sur un périphérique de la liste des fichiers contenus dans une zone avec la taille de chacun. Le paramètre supplémentaire est formé des 2 caractères associés au périphérique (LP, TY, ...)

Les deux sous-programmes décrits ci-dessous sont des utilitaires écrits pour aider la mise au point du SGF.DA, ils ne sont en général pas à utiliser, mais peuvent être utiles pour faire certaines récupérations en cas d'ennui.

**G:SDMP** Provoque le dump sur un périphérique du contenu d'un secteur. Le premier paramètre supplémentaire est le numéro de ce secteur, le second est comme pour F:FLSH le code du périphérique.

**G:ESEC** Ce sous-programme permet d'écrire directement un mot dans un secteur. Les paramètres à passer sont le numéro du secteur, le numéro du mot et le nouveau contenu de ce mot.

**Remarque** : Dans tous les cas, lorsqu'il faut passer une valeur, il s'agit de la représentation binaire de cette valeur, aucune conversion n'est faite.
### 3.1.3 Utilisation à partir de FORTRAN

Des interfaces ont été écrites de façon à permettre l'appel des sous-programmes directement en FORTRAN. Ces interfaces introduisent les notions de disque, de fichier et d'enregistrement courants, et de plus l'opération rajoutant un enregistrement provoque également une écriture dans le nouvel enregistrement.

Tous les sous-programmes se présentent sous la forme de fonctions entières qui retournent 0 si il n'y a pas eu d'erreur ou 1 sinon.

Dans la liste ci-dessous, on trouvera en face du nom en FORTRAN le (ou les) nóm(s) des sous-programmes assembleurs équivalents.

Pour les paramètres, la terminologie utilisée est :

<table><tr><td>DSQ</td><td>pour le code disque</td></tr><tr><td>NAMDSQ</td><td>pour le nom du disque</td></tr><tr><td>NAMFIC</td><td>pour la clé du fichier</td></tr><tr><td>N</td><td>pour une valeur entière (en général n° d'enregistrement)</td></tr><tr><td>BUF</td><td>pour le buffer d'entrées-sorties.</td></tr></table>

#### Liste des sous-programmes

**INITDA** (G:DEBU) c'est le seul sous-programme à appeler par un CALL.

**DEFDSQ(DSQ,NAMDSQ)**

(G:VERD) les valeurs passées en paramètres sont rangées dans un tableau commun et définissent le disque courant. Il y a ensuite vérification.

**OPNFCH(NAMFIC)**

(G:LFIL) le fichier dont le nom est donné est pris comme fichier courant.

**CREFCH(NAMFIC,N)**

(G:CRFL) la valeur N est la taille des enregistrements.
DETFCH (NAMFIC)

(G:DEFIL) Après cette opération, il faudra prendre garde de redéfinir un fichier courant pour d'autres opérations.

INSEN'R (N, BUF)

(G:AJEN + G:ECEN) L'enregistrement créé devient courant.

DETEN'R (N)

(G:DEEN) L'enregistrement précédent ou suivant peut devenir courant selon le contexte.

DEFEN'R (N)

Ce sous-programme n'est équivalent à aucun sous-programme assembleur, il est utilisé pour définir l'enregistrement courant.

ECREN'R (BUF)

(G:ECEN) Demande d'une écriture dans l'enregistrement courant.

LIRENR (BUF)

(G:LREN) Lecture de l'enregistrement courant.

NBRENR (N)

(G:TYFL) N est utilisé pour retourner le nombre d'enregistrements du fichier courant.

FLASH (OUT)

(G:FLSH) OUT désigne les 2 caractères indiquant le périphérique physique sur lequel il faut sortir la liste des fichiers du disque courant.
## 3.2 Sous-programme écrits en FORTRAN

### 3.2.1 Généralités

Cet ensemble de sous-programmes permet de manipuler une zone ou un fichier avec certaines restrictions par rapport à la version réalisée en assembleur. Tout d'abord, le nombre de descripteurs de fichiers par secteur est toujours égal à 1, ce qui simplifie énormément la gestion des chaînages en cas de collision dans le hash-coding. Ensuite, la longueur d'un enregistrement dans un fichier est toujours égale à 1 secteur. Enfin, il n'est possible de rajouter ou de détruire un enregistrement qu'à la fin d'un fichier, on peut cependant lire ou écrire tout enregistrement d'un fichier. Ces restrictions font que les sous-programmes sont plus courts et de plus, leur exécution est plus rapide aussi bien à cause de leur simplicité qu'à cause du fait que les accès disque ont été diminués. En effet, dans la version assembleur, chaque fois qu'il y a une modification dans un descripteur ou dans la table d'allocation, on recopie sur disque le (ou les) secteur(s) modifié(s), dans la version FORTRAN, ces recopies ne sont faites que sur une demande de l'utilisateur ou sur un changement de disque ou de fichier. Cette différence implique des résultats différents dans le cas où un programme ne se termine pas normalement.

Pour l'utilisateur, il n'existe que deux sous-programmes : INIDAG qui sert à initialiser une zone et GESTDA qui est utilisé pour toutes les autres opérations, un paramètre servant à préciser l'opération désirée. Les 11 autres sous-programmes ne sont que des utilitaires pour les deux précédents, ils réalisent entre autres les fonctions d'allocation et d'accès au disque.

L'avantage principal de cette version réside dans le fait qu'elle est écrite en FORTRAN, et donc pour les programmes écrits en FORTRAN 3D, il n'y a pas de restriction à leur portabilité car il n'y a que peu de sous-programmes à réécrire pour simuler une gestion de zone DA sur un calculateur autre que le MITRA 15 (voir les manuels FORTRAN 3D, notes internes groupe graphique Laboria).
### 3.2.2 INIDAG et GESTDA

#### INIDAG

L'appel de ce sous-programme se fait de la manière suivante :

CALL INIDAG(DSQ,NAMDSQ,SIZEDA)

où DSQ et NAMDSQ sont le code disque et le nom de la zone, et SIZEDA est la taille de la zone. En effet, dans la version assembleur, la fonction INITDA (ou G:INIT) se charge d'aller trouver la taille de la zone dans le premier secteur du disque qui contient cette valeur, mais dans la version FORTRAN, l'utilisateur doit donner cette valeur. On peut donc simuler la gestion de zone DA en gérant les secteurs d'un fichier dont on a donné la taille à l'initialisation.

Tous les secteurs de la zone sont initialisés, les 128 mots du secteur i contiennent la valeur i. Enfin, comme le nombre de describeurs par secteur étant fixé à 1, cette valeur n'est plus à passer en paramètre. Il n'y a pas de retour d'erreur envisagé.

#### GESTDA

L'appel de ce sous-programme se fait de la manière suivante :

CALL GESTDA(CODOP,P1,P2)

ou CODOP est un entier entre 1 et 11 qui indique quelle opération doit être faite, et P1 et P2 sont 2 tableaux entiers servant à passer les paramètres, P1 a 128 éléments et P2 n'en a que 3.

#### Détail des différents codes et sous-programmes assembleur équivalent

1. Définition de disque courant (DEFDSQ).
   P1 contient dans son premier élément le code du disque, et
   les 3 éléments de P2 contiennent le nom de la zone. En retour,
   P1(2) contient 0 si la zone existe et 1 si il y a eu une erreur.

2. Ouverture d'une clé avec création (CREFCH)
   les 3 premiers éléments de P1 donnent le nom de la clé à créer.
   Cette clé ne doit pas exister, et c'est à l'utilisateur de faire
   cette vérification. Il n'y a pas de retour d'erreur.
3 Fermeture de la clé courante

C'est par cette commande que la mise à jour sur disque des descripteur-disque, table d'allocation et descripteur-fichier se font. Pas de paramètre à passer, et aucun retour d'erreur.

4 Destruction d'une clé et de ses enregistrements (DETFCH)

Permet de détruire la clé passée dans les trois premiers mots de P1. Avant de détruire une clé il faut avoir testé son existence, c'est-à-dire l'avoir rendue courante. Il n'y a aucun retour d'erreur.

5 Retourne dans P1(1) le nombre d'enregistrements de la clé courante (NBRENR).

6 Lecture d'un enregistrement (LIRENR)

Permet de transférer le contenu de l'enregistrement, dont le numéro est contenu dans P2(1), dans le buffer P1.

7 Ecriture d'un enregistrement (ECRENR)

Le contenu du tableau P1 est rangé dans l'enregistrement dont le numéro est passé dans P2(1).

8 Ajoute un enregistrement en fin de fichier (INSENR)

Un enregistrement est créé en fin de fichier, et le contenu du tableau P1 est transferé dans cet enregistrement.

9 Détruit le dernier enregistrement (DETENR)

Il faut prendre la précaution de fermer la clé si l'on veut que le disque soit mis à jour.

10 Test de l'existence d'une clé (OPNFCH)

Si la clé existe, elle est rendue courante. P1 contient le nom de la clé dans les trois premiers mots, et le retour se fait dans le premier mot de P2 : on y trouve 0 si la clé existe et 1 sinon.
11. Donne au retour un nom de clé existant.

Cet ordre permet de parcourir la liste des noms de clés existant sur le disque courant.

Il faut commencer par un appel avec P1(1) = 1 pour initialiser la lecture. Ensuite, à chaque appel avec P1(1) = 0, le sous-programme retournera un nom de clé dans les trois mots de P2. Dans P1, en retour, on trouvera dans le premier mot 0 si le sous-programme a trouvé un nom de clé ou 1 si toute la suite a été parcourue.

Il faut éviter au cours d'une suite d'appels avec l'ordre 11 d'utiliser GESTDA pour une autre opération, car à ce moment là certains pointeurs pourraient être modifiés.

Cet ordre est surtout destiné à permettre à l'utilisateur de connaître l'ensemble des clés existant afin de les sortir sur un périphérique de son choix, dans un format de son choix.

Cette version du SGF.DA range sur disque des informations sous une forme qui peut être manipulée avec l'autre version, mais l'inverse n'est pas toujours vrai, il faut donc faire certaines vérifications avant d'utiliser une zone déjà initialisée.

De plus, comme on peut le constater dans la présentation ci-dessus, de nombreuses vérifications sont à la charge de l'utilisateur, et les mises à jour dans un fichier ne sont répercutées sur le disque que si il y a eu une demande explicite de la part de l'utilisateur.

C'est sur ces différences que l'on gagne le plus de temps et de place en mémoire pour l'exécution des sous-programmes.

### 3.2.3 Autres sous-programmes

Pour utiliser les 2 sous-programmes INIDAG et GESTDA, il faut également disposer de 11 autres sous-programmes, dont 6 sont écrits en assembleur et 5 en FORTRAN.
## Sous programmes écrits en assembleur

Ces sous-programmes sont à réécrire pour permettre l'exécution
de GESTDA et INIDAG sur un autre calculateur que le MITRA 15.
Ce sont des sous-programmes très courts pour la plupart.

### RDDSQ

Est utilisé par un appel FORTRAN de la forme :
CALL RDDSQ(P1,P2,P3)

où P1 est le nom d'un buffer de 128 mots destiné à
recevoir le contenu du secteur P2 du disque dont le code est
passé dans P3.

### WRTDSQ

Est appelé de la même façon que RDDSQ, et fait l'écriture
sur un secteur.

### IODA

Ce sous-programme est appelé par RDDSQ et WRTDSQ. Ces
2 sous-programmes ne font que la mise en place des para-
mètres et laissent à IODA le soin de faire les accès
au disque. Ce sous-programme n'est pas à réécrire si
RDDSQ et WRTDSQ font eux-mêmes les accès.

### IOR, IAND, IEOR

Ces 3 fonctions réalisent les fonctions logiques :
OU ET OU EXLUSIF.

Elles sont utilisées par des appels de la forme :
A = F(B,C)
## Sous-programmes écrits en FORTRAN

Ces sous-programmes ne sont pas à réécrire, et la liste donnée ici n'est destinée qu'à permettre de vérifier que tous les sous-programmes nécessaires pour gérer des fichiers par GESTDA sont présents sur le site sur lequel l'implantation se fait.

**ALLOCA** réalise les fonctions d'allocation.

**HCODE** calcule le Hash-code associé à un nom.

**KENR** retourne le numéro du secteur qui contient le kᵉ enregistrement,

**OUTEXT** sont deux utilitaires pour l'impression de textes de la manipulation de chaînes de caractères.

### 3.2.4 Interface

Il existe un interface qui permet d'utiliser la version FORTRAN du SGF.DA avec les mêmes noms de sous-programmes que pour l'interface entre la version assembleur et le FORTRAN.

Ainsi, le programme donné en Annexe 5 peut utiliser aussi bien la version assembleur que la version FORTRAN, le choix étant fait au moment de l'édition de liens.

Etant données les restrictions de la version FORTRAN, certaines opérations sont impossibles, et par exemple, si l'on rencontre un appel de la forme

$$I = INSENR(N,BUF),$$

le paramètre N est ignoré et le nouvel enregistrement est rajouté en fin de fichier. De même, quelque soit le deuxième paramètre donné à l'appel de CREFCH, la taille des enregistrements sera toujours égale à 1 secteur.

Cet interface se charge de demander les mises à jour sur disque, et donc les durées d'exécution de certaines opérations sont plus longues comme on le verra dans le § 4.
## 4. Durées d'exécution des principaux sous-programmes

Les mesures qui ont été faites sont surtout destinées à montrer l'influence du paramètre indiquant la taille des descripteurs de fichiers. De plus, les temps mesurés donneront à l'utilisateur des indications sur le comportement de ses programmes. Les mesures ont été faites sur un disque 2,5 M octets et pour avoir les durées d'exécution lorsque l'on utilise des disques souples de 250 K octets, il faut multiplier les valeurs indiquées par 4.

### 4.1 Version écrite en assembleur

(Les courbes données en Annexe 4 donnent les principaux résultats).

La première constatation que l'on peut faire est que les programmes qui modifient la taille d'un fichier ou qui créent ou détruisent des fichiers sont assez lents : il faut compter des durées de l'ordre de 400 ms. Comme on peut le voir sur les courbes de la première figure, la taille des descripteurs influe sur les durées lorsqu'il y a au moins 100 fichiers (en réalité le nombre minimal est 64, ce qui est le nombre d'entrées de la table-hash). Pour la création d'un fichier (vide) les durées peuvent varier entre 400 et 500 ms pour les cas extrêmes, en ce qui concerne la destruction, (toujours dans le cas de fichiers vides) les valeurs sont 300 et 480 ms. On voit donc qu'un nombre de descripteurs par secteurs petit donne des augmentations sensibles des temps nécessaires pour créer ou détruire un fichier. Ceci provient du fait que lorsque les descripteurs sont grands, les chaînages de collision ne sont pas réalisés à l'intérieur d'un même secteur mais sur plusieurs secteurs. Sur les 2 courbes suivantes, (insertion d'enregistrements ou destruction) les grands descripteurs apparaissent plus avantageux, car dans le cas où il y a 10 fichiers sur un disque, les durées varient entre 400 et 500 ms. Dans le cas où il y a 100 fichiers, on retrouve un désavantage pour la valeur 1 qui provient des temps d'accès aux descripteurs qui sont parfois plus longs lorsqu'il y a collision.
Ces courbes montrent en outre les désavantages dus aux valeurs extrêmes puisque dans le cas où la zone est de taille assez réduite (300 secteurs pour les mesures ce qui est une valeur courante sur les disques généralement utilisés) il n'est pas possible d'avoir un nombre très important de fichiers très courts.

Les dernières mesures ont porté sur les temps d'accès aux enregistrements d'un fichier. En général, on trouve des temps de l'ordre de 80 ms si il y a à charger le descripteur du fichier au préalable, ou 40 ms si il est déjà chargé. On voit que ces valeurs sont beaucoup moins importantes que précédemment, et donc l'accès aux informations sera assez rapide. Les mesures ont été faites avec des enregistrements de 1 secteur, mais comme les secteurs d'un enregistrement sont consécutifs sur disque, les durées de lecture pour des enregistrements auront des valeurs pratiquement identiques. Dans certains cas défavorables, on trouve cependant des durées de l'ordre de 250 ms (y compris le chargement du descripteur) si il y a de nombreux fichiers avec un nombre de descripteurs par secteur égal à 1. Si les descripteurs sont trop petits, et qu'il faut créer des extensions, les temps de lecture d'un secteur peuvent atteindre 120 ms si l'on veut accéder aux derniers enregistrements.

De ces mesures il ressort que si la zone a été initialisée correctement, l'utilisateur du SGF.DA peut voir les durées d'exécution de ses programmes sensiblement améliorées (gain de l'ordre de 20 % pour les sous-programmes du SGF.DA).

On remarque que sauf dans certains cas particuliers, un nombre de descripteurs par secteur égal à 5 ou 6 représente un compromis satisfaisant.

**Remarque** Les durées importantes d'exécution de certains sous-programmes proviennent principalement des accès disques nombreux (en particulier à chaque libération ou allocation de secteurs, la table d'allocation est réécrite sur le disque) et on pourrait envisager de diminuer ces accès au prix d'une moins bonne sécurité d'utilisation du SGF.DA. C'est la solution qui a été adoptée dans la version écrite en FORTRAN.
## 4.2 Version écrite en FORTRAN

Une autre série de mesures a été faite en utilisant le même programme que précédemment mais les sous-programmes appelés étaient ceux de l'interface avec GESTDA. Etant données les restrictions sur la manipulation des fichiers, l'insertion et la destruction d'enregistrements en tête de fichier se faisaient en queue de fichier, et donc les durées d'exécution doivent être comparées avec précaution.

On observe des performances nettement meilleures que pour la version assembleur pour les opérations modifiant la structure d'un fichier (création et destruction de fichiers ou d'enregistrements. Pour créer 200 fichiers, il faut 60 secondes au lieu de 110, et pour en créer 100, il faut 30 secondes au lieu de 47. En ce qui concerne la destruction, on a pour 200 fichiers 60 secondes au lieu de 96 et 30 au lieu de 47.

Il faut tenir compte, pour la destruction, du fait que dans la version FORTRAN les chaînages de collisions mettent le dernier fichier créé en tête de chaîne alors que dans la version assembleur, il est placé en queue, et donc pour accéder dans l'ordre de création aux fichiers, la version assembleur est favorisée.

En ce qui concerne l'allongement ou le raccourcissement d'un fichier, les performances sont toujours meilleures, mais dans un rapport moindre puisque ajouter un enregistrement demande 400 ms au lieu de 500, et enlever un enregistrement demande 300 ms au lieu de 400. Enfin, l'accès à un enregistrement pour une lecture ou une écriture se fait avec des durées égales pour les deux versions. Les améliorations proviennent des mises à jour sur disque mieux contrôlées dans le cas de la version FORTRAN. (le temps moyen d'accès à 1 secteur est de 90 ms).

Une dernière série de mesures a enfin été faite en utilisant directement GESTDA, alors on peut encore diminuer les accès disque en controlant les mises à jour, et dans ce cas, le temps moyen de création d'un fichier est ramené à 120 ms au lieu de 470 pour la
version assembleur, et dans certains cas, l'addition d'un nouvel enregistrement peut se faire en 100 ms au lieu de 400.

Il est donc évident que l'utilisation de GESTDA améliore les durées d'exécution des programmes, mais les contrôles sont alors à la charge de l'utilisateur, et une erreur de programmation peut entraîner des incohérences dans une zone.

## 5. Développements ultérieurs

Les utilisations du SGF.DA sont encore peu nombreuses (l'une d'entre elles concernant la mémorisation de dessins sera décrite dans un autre rapport) mais on peut déjà voir apparaître la nécessité de faire de nouveaux développements.

Il est tout d'abord envisagé d'écrire un processeur permettant de manipuler les zones et les fichiers de façon conversationnelle. Ce processeur disposera en outre de commandes permettant de transférer le contenu d'une zone dans une autre, ou d'une commande permettant de faire une "garbage collection" bien que cette possibilité n'offre aucun intérêt dans le cas fréquent où les enregistrements ont une taille égale à 1 secteur.

Il serait bon en outre d'avoir un programme permettant de récupérer les erreurs éventuelles qui pourraient exister dans une zone ou que l'utilisateur pourrait avoir faites. Par exemple si à la suite d'une erreur l'utilisateur a détruit un fichier important, il suffit dans certains cas de quelques écritures dans différents mots pour restaurer ce fichier. De plus il se peut que dans certains cas les incohérences apparaissent dans une zone (fichiers incomplètement détruits à la suite d'un problème dans une écriture disque) et donc on pourrait récupérer au moins une partie des informations rangées dans la zone.

Enfin, la manipulation des fichiers se fait à un niveau assez bas, et plusieurs extensions sont actuellement à l'étude dans le cadre d'applications particulières.
Annexe 1

<table><caption>Table de correspondance entre nombre de descripteurs et taille des descripteurs</caption><thead><tr><th>Nombre de desc/sect.</th><th>taille d'l desc.</th><th>Perte totale</th><th>nombre d'enr. sans extension</th></tr></thead><tbody><tr><td>1</td><td>252</td><td>0</td><td>119</td></tr><tr><td>2</td><td>126</td><td>0</td><td>56</td></tr><tr><td>3</td><td>84</td><td>0</td><td>35</td></tr><tr><td>4</td><td>62</td><td>4</td><td>24</td></tr><tr><td>5</td><td>50</td><td>2</td><td>18</td></tr><tr><td>6</td><td>42</td><td>0</td><td>14</td></tr><tr><td>7</td><td>36</td><td>0</td><td>11</td></tr><tr><td>8</td><td>30</td><td>12</td><td>8</td></tr><tr><td>9</td><td>28</td><td>0</td><td>7</td></tr><tr><td>10</td><td>24</td><td>12</td><td>5</td></tr><tr><td>11</td><td>22</td><td>10</td><td>4</td></tr><tr><td>12</td><td>20</td><td>12</td><td>3</td></tr><tr><td>13</td><td>18</td><td>18</td><td>2</td></tr><tr><td>14</td><td>18</td><td>0</td><td>2</td></tr><tr><td>15</td><td>16</td><td>12</td><td>1</td></tr><tr><td>16</td><td>14</td><td>28</td><td>0</td></tr><tr><td>17</td><td>14</td><td>14</td><td>0</td></tr><tr><td>18</td><td>14</td><td>0</td><td>0</td></tr></tbody></table>

La perte totale est le nombre d'octets qui ne sont pas utilisés dans un secteur. En particulier, pour les valeurs 13, 16, 17 on voit que cette perte est inutile puisque les tailles des descripteurs sont identiques à des tailles données par d'autres valeurs.
Tables donnant la taille des sous-programmes

<table><thead><tr><td>Nom du sous-programme</td><td>taille (en octets)</td><td>Remarques</td></tr></thead><tbody><tr><td>G:INIT</td><td>298</td><td></td></tr><tr><td>G:VERD</td><td>108</td><td></td></tr><tr><td>G:IFIL</td><td>158</td><td></td></tr><tr><td>G:CRFL</td><td>250</td><td></td></tr><tr><td>G:DEFL</td><td>668</td><td></td></tr><tr><td>G:PROT</td><td>138</td><td></td></tr><tr><td>G:AJEN</td><td>806</td><td></td></tr><tr><td>G:DEEN</td><td>704</td><td></td></tr><tr><td>G:ECEN/G:IREN</td><td>252</td><td>Ces 2 sous-programmes sont dans le même module (à 2 points d'entrée)</td></tr><tr><td>G:TYFL</td><td>24</td><td></td></tr><tr><td>G:BIBL</td><td>1600</td><td>Ce module n'est pas exécutable, il contient les variables et tableaux communs (ce qui explique sa taille) ainsi que des sous-programmes communs (allocateur,...).</td></tr><tr><td>G:FLSH</td><td>520</td><td></td></tr><tr><td>G:SDMP</td><td>230</td><td></td></tr><tr><td>G:ESEC</td><td>60</td><td></td></tr></tbody></table>

L'ensemble de ces sous-programmes représente donc une taille globale de 5816 octets (ou 2098 mots) mais les sous-programmes G:INIT,
G:FLSH, G:SDMP, et G:ESEC n'ont en général pas à être utilisés dans un programme et donc 1108 octets sont à enlever. Un programme utilisant le SGF.DA chargera donc environ 2,5 K mots de code pour la gestion des informations sur disque.

La taille du module G:BIBL provient entre autres des buffers utilisés pour la gestion du disque (ils sont au nombre de 4 et occupent chacun 256 octets).

## Taille des sous-programmes de la version écrite en FORTRAN

<table><thead><tr><td>Nom</td><td>Taille en octets</td></tr></thead><tbody><tr><td>INIDAG</td><td>460</td></tr><tr><td>GESTDA</td><td></td></tr><tr><td>ALLOCA</td><td>3430</td></tr><tr><td>KENR</td><td></td></tr><tr><td>HCODE</td><td></td></tr><tr><td>WRTDSQ</td><td></td></tr><tr><td>RDDSQ</td><td>140</td></tr><tr><td>IODA</td><td></td></tr><tr><td>+ communs</td><td>1030</td></tr></tbody></table>

taille globale 5060 octets dont 460 pour INIDAG qui ne figure en général pas dans les programmes, et donc un programme utilisant cette version chargera approximativement 2,3 K mots de code et buffers.
## Messages d'erreur

Les messages d'erreur apparaissent sur le périphérique associé à l'étiquette logique DO. Une erreur peut provoquer l'apparition de plusieurs messages car lorsque l'un des sous-programmes du SGF.DA en appelle un autre et qu'une erreur se produit dans l'appelé, l'appelant et l'appelé produisent tous deux un message.

Un message se présente sous la forme suivante :

**XXYYYYYYYZZZZZZ ERREUR TT

où XX est le code du disque sur lequel on travaille

YYYYYY est le nom de la zone DA de ce disque

ZZZZZZ est la clé du fichier sur lequel on travaille

et TT représente 2 chiffres héxadécimaux précisant l'erreur,
le premier donnant le sous-programme ayant produit le message, le
second donnant l'origine de l'erreur.

Le tableau ci-dessous donne la signification de chaque code d'erreur. Les erreurs marquées d'un signe + sont celles qui ne doivent pas se produire, sauf si il y a des ennuis hardware ou si une erreur subsistait dans le logiciel SGF.DA.

<table><thead><tr><td>Numéro</td><td>SS-programme</td><td>Signification</td></tr></thead><tbody><tr><td>11</td><td>G:INIT</td><td>erreur code disque inconnu</td></tr><tr><td>12</td><td>"</td><td>disque inexistant</td></tr><tr><td>13</td><td>"</td><td>zone DA trop petite</td></tr><tr><td>14</td><td>"</td><td>erreur dans une écriture disque</td></tr><tr><td>15</td><td>"</td><td>paramètre > 18 ou &lt; 0</td></tr><tr><td>21</td><td>G:LFIL</td><td>fichier inexistant</td></tr><tr><td>22</td><td>"</td><td>erreur dans une section appelée</td></tr><tr><td>31</td><td>G:VERD</td><td>erreur au chargement du descripteur</td></tr><tr><td>32</td><td>"</td><td>nom de disque incorrect</td></tr></tbody></table>
<table><thead><tr><th></th><th>Numéro</th><th>ss-programme</th><th>signification</th></tr></thead><tbody><tr><td>+</td><td>41</td><td>G:BIBL</td><td>erreur au chargement de la table d'allocation</td></tr><tr><td></td><td>42</td><td>"</td><td>allocation impossible (faire garbage)</td></tr><tr><td>+</td><td>43</td><td>"</td><td>erreur dans une écriture disque</td></tr><tr><td></td><td>44</td><td>"</td><td>allocation impossible (même après garbage)</td></tr><tr><td>+</td><td>45</td><td>"</td><td>nombre de secteurs à allouer négatif ou nul</td></tr><tr><td>+</td><td>46</td><td>"</td><td>libération d'un secteur protégé</td></tr><tr><td>+</td><td>47</td><td>"</td><td>nombre de secteurs à libérer</td></tr><tr><td>+</td><td>48</td><td>"</td><td>même erreur que 41 mais au cours d'une libération</td></tr><tr><td>+</td><td>49</td><td>"</td><td>libération d'un secteur déjà libre</td></tr><tr><td>+</td><td>4A</td><td>"</td><td>débordement dans un accès à la zone</td></tr><tr><td>+</td><td>51</td><td>"</td><td>erreur dans un accès disque</td></tr><tr><td></td><td>81</td><td>G:CRFL</td><td>le disque demandé n'est pas accessible</td></tr><tr><td>+</td><td>82</td><td>"</td><td>erreur dans une lecture disque</td></tr><tr><td></td><td>83</td><td>"</td><td>disque protégé !</td></tr><tr><td></td><td>84</td><td>"</td><td>erreur à l'allocation</td></tr><tr><td></td><td>85</td><td>"</td><td>le fichier existe déjà</td></tr><tr><td></td><td>86</td><td>"</td><td>paramètre incorrect</td></tr><tr><td>+</td><td>87</td><td>"</td><td>erreur dans une écriture disque</td></tr><tr><td></td><td>88</td><td>"</td><td>erreur à l'exécution de G:LFIL</td></tr><tr><td></td><td>91</td><td>G:SDMP</td><td>erreur dans un ss-programme appelé</td></tr><tr><td></td><td>92/93</td><td>"</td><td>erreur sur le code du périphérique de sortie</td></tr></tbody></table>
+

+

+

+

+

+

<table><thead><tr><th>Numéro</th><th>ss-programme</th><th>signification</th></tr></thead><tbody><tr><td>A1</td><td>G:AJEN</td><td>erreur dans G:LFIL</td></tr><tr><td>A2</td><td>"</td><td>fichier ou disque protégé</td></tr><tr><td>A3</td><td>"</td><td>erreur à l'allocation</td></tr><tr><td>A4</td><td>"</td><td>erreur lecture disque</td></tr><tr><td>A5</td><td>"</td><td>erreur écriture disque</td></tr><tr><td>B1</td><td>G:FLSH</td><td>disque inexistant</td></tr><tr><td>B2/B3</td><td>"</td><td>erreur sur le code du périphérique de sortie</td></tr><tr><td>B4</td><td>"</td><td>erreur dans une lecture disque</td></tr><tr><td>C1</td><td>G:PROT</td><td>disque inexistant</td></tr><tr><td>C2</td><td>"</td><td>erreur dans un accès disque</td></tr><tr><td>C3</td><td>"</td><td>erreur disque protégé</td></tr><tr><td>C4</td><td>"</td><td>erreur dans G:LFIL</td></tr><tr><td>D1</td><td>G:DEFL</td><td>disque inexistant</td></tr><tr><td>D2</td><td>"</td><td>disque ou fichier protégé</td></tr><tr><td>D3</td><td>"</td><td>erreur dans une libération</td></tr><tr><td>D4</td><td>"</td><td>erreur dans une lecture</td></tr><tr><td>D7</td><td>G:DEEN</td><td>enregistrement inexistant</td></tr><tr><td>D8</td><td>"</td><td>erreur dans G:LFIL</td></tr><tr><td>D9</td><td>"</td><td>fichier ou disque protégé</td></tr><tr><td>DA/DE</td><td>"</td><td>erreur dans un accès disque</td></tr><tr><td>DB</td><td>"</td><td>erreur dans une libération</td></tr></tbody></table>
+

<table><thead><tr><td>Numéro</td><td>ss-programme</td><td>signification</td></tr></thead><tbody><tr><td>E1</td><td>G:ECEN/G:LREN</td><td>erreur au chargement du fichier</td></tr><tr><td>E2</td><td>"</td><td>disque protégé</td></tr><tr><td>E3</td><td>"</td><td>fichier protégé</td></tr><tr><td>E4</td><td>"</td><td>fichier vide</td></tr><tr><td>E5/E6</td><td>"</td><td>erreur dans un accès disque</td></tr><tr><td>E7</td><td>"</td><td>erreur dans un paramètre</td></tr></tbody></table>
Annexe 4

Courbes de durées d'exécution

<figure><img src="image_6.png" /></figure>

Création de n fichiers et destruction dans l'ordre dans
lequel ils ont été créés (n = 50 , 100 , 200)
courbes de création marquées par des +
courbes de destruction marquées par des •
<figure><img src="image_7.png" /></figure>

Insertion de n enregistrements de l secteur en tête de fichier chaque courbe est marquée par un couple, m, n où m est le nombre de fichiers de la zone et sur lesquels les enregistrements ont été rajoutés et n est le nombre d'enregistrements insérés.

(Les 2 courbes en pointillés sont incomplètes car la zone de test avait une taille de 300 secteurs, et dans certains cas, il n'a pas été possible de créer les 200 enregistrements).
<figure><img src="image_8.png" /></figure>

Destruction des enregistrements d'un fichier (dans le même ordre que pour la création)

Mêmes remarques que pour l'insertion.
<figure><img src="image_9.png" /></figure>

Courbes des temps d'accès au descripteur d'un fichier (il s'agit du dernier créé) pour des nombres de fichiers différents sur une même zone.

A partir de certaines valeurs, les courbes sont confondues car la taille des descripteurs n'a pas d'influence si elle est assez grande.
Annexe 5

Exemple de programme utilisant le SGF.DA

1.000 C PROGRAMME DE MESURES DU SGF.DA (VERSION 1)
5.000 C CE PROGRAMME APPELLE LA VERSION FORTRAN OU LA VERSION
5.000 C ASSEMBLEUR DU SGF.DA (1901) FERMENT SUIVANT LA MIBLIO-
5.000 C THEURE UTILISEE A L'EDITION DE LIENS.
7.000 C INTEGER NAMDSQ(3),NAMFIC(3),DSQ,BUF (512)
8.000 C LES SOUS-PROGRAMMES APPELES DOIVENT ETRE DECLARES COMME
10.000 C ETANT DES FONCTIONS EXTERNES ENTIERES.
11.000 C EXTERNAL DEFDSQ,OPFCH,CREFCH,DETFCH,INSENRI,DETENR
12.000 C IF (DEFDSQ,OPFCH,CREFCH,DETFCH,INSENRI,DETENR)
13.000 C 100 FORMAT (2X,TAPER DC OU DK)
15.000 C 101 FORMAT (2A)
16.000 C 110 FORMAT (2X,DONNER LE NOM DE LA ZONE*)
17.000 C 111 FORMAT (3A2)
18.000 C 200 FORMAT (2A,DONNER LE NUMEDE FICHIEH*)
19.000 C 300 FORMAT (2A,DONNER LE NUMEDE ENREGISTREMENTS*)
20.000 C 400 FORMAT (2A,DONNER LA TAILLE DES ENREGISTREMENTS*)
25.000 C 500 FORMAT (2A,DONNER UN ORDRE*)
22.000 C 600 FORMAT (2A,DONNER LE NUMERO DU FICHIER*)
23.000 C 700 FORMAT (2A,DONNER LE NUMEDE ENREGISTREMENT*)
24.000 C 800 FORMAT (2A,DONNER LE NUMEDE DESOULES*)
25.000 C DATA NAMFIC(1),NAMFIC(2),2HZ,2HPP/
29.000 C APPEL DU SOUS-PROGRAMME ASSURANT UN CHARGEMENT CORRECT
28.000 C AU MOMENT DE L'EDITION DE LIENS.
29.000 C CALL INITDA
30.000 C WRITE (108,100)
31.000 C READ(105,101)DSQ
33.000 C WRITE (108,110)
34.000 C READ(105,111) (NAMDSQ(1),I=1,3)
35.000 C DECLARATION DE DISQUE COURANT ET VERIFICATION DE
36.000 C SON EXISTENCE
37.000 C IF (DEFDSQ(DSQ,NAMDSQ),NE.0) STOP
39.000 C 2000 WRITE (108,500)
40.000 C CALL INPUT(I)
41.000 C GOTO (100,1300,1400,1500,1600,1700),1
42.000 C GOTO (100,1300,1400,1500,1600,1700,1)
43.000 C CREATION DE N'FICHIER DE NOMS 'ZZPP'01,'ZZPP'02, ...
44.000 C 1100 WRITE (108,200)
45.000 C CALL INPUT(N)
46.000 C WRITE (108,400)
47.000 C CALL INPUT(M)
48.000 C DO I=10 I=1,N
49.000 C NAMFIC(3)=I
50.000 C CREATION D'UNE CLE
51.000 C IF (CREFCH(NAMFIC,M),NE.0) GOTO 2000
52.000 C 1110 CONTINUE
54.000 C GOTO 2000
55.000 C GOTO 2000
56.000 C DESTROCTION DE N'FICHIER ('ZZPP'01, .. , 'ZZPP'N)
57.000 C 1200 WRITE (108,200)
58.000 C CALL INPUT(N)
59.000 C DO I=121 I=1,N
60.000 C NAMFIC(3)=I
61.000 C DESTRUCTION D'UN FICHIER
62.000 C IF (DETFCH(NAMFIC),NE.0) GOTO 2000
63.000 C 1210 CONTINUE
64.000 C GOTO 2000
65.000 C GOTO 2000
66.000 C INSERTION D'UN ENREGISTREMENT EN TETE DES N PREMIERS FICHIERS
67.000 C OPERATION REPETEEM FQIS
68.000 C 1300 CONTINUE
70.000 C WRITE (108,200)
72.000 C CALL INPUT(N)
73.000 C CALL INPUT(M)
74.000 C DO I=10 I=1,N
75.000 C NAMFIC(3)=I
76.000 C DECLARATION DE CLE COURANTE ET VERIFICATION DE SON EXISTENCE
78.000 C IF (OPFCH(NAMFIC),NE.0) GOTO 2000
79.000 C DO I=320 I=1,M
80.000 C INSERTION D'UN ENREGISTREMENT EN TETE DE FICHIER LE CONTENU
81.000 C DE CET ENREGISTREMENT EST INITIALISE AVEC CELUI DU TABLEAU BUF
82.000 C IF (INSENR(1,BUF),NE.0) GOTO 2000
83.000 C 1320 CONTINUE
87.000 C 1310 CONTINUE
88.000 C GOTO 2000
89.000 C DESTROSION DU PREMIER ENREGISTREMENT DES N PREMIERS FICHIERS
90.000 C OPERATION REPETEEM FQIS
91.000 C 1400 CONTINUE
92.000 C WRITE (108,200)
93.000 C CALL INPUT(N)
94.000 C WRITE (108,300)
95.000 C CALL INPUT(M)
96.000 C DO I=16 I=1,N
97.000 C NAMFIC(3)=I
98.000 C DECLARATION DE CLE COURANTE ET VERIFICATION DE SON EXISTENCE
99.000 C IF (OPFCH(NAMFIC),NE.0) GOTO 2000
100.000 C DO I=142 I=1,M
102.000 C DESTRUCTION DU PREMIER ENREGISTREMENT DU FICHIER COURANT
105.000 C IF (DETFCH(1),NE.0) GOTO 2000
107.000 C 1420 CONTINUE
109.000 C 1410 CONTINUE
110.000 C GOTO 2000
111.000 C CLE DE FICHIER DE REGISTREMENT DU FICHIER M
112.000 C WRITE (108,100)
113.000 C 1000
114.000 C CALL INPUT(M)
15.000 WRITE(108.700)
16.000 CALL INPUT(N)
17.000 WRTT(108.900)
18.000 CALL INPUT(K)
19.000 DO 1510 I=1,K
20.000 NAMFIC(3)=M
21.000 C
22.000 C DECLARATION DE CLE COURANTE ET VERIFICATION DE SON EXISTENCE
23.000 C IF (OPNFCH(NAMFIC).NE.0) GOTO 2000
24.000 C
25.000 C DECLARATION D'ENREGISTREMENT COURANT
26.000 C MESER = DEFENR(N)
27.000 C
28.000 C DESTRUCTION DE L' ENREGISTREMENT COURANT DU FICHIER COURANT
29.000 C IF (LIRENR(BUF).NE.0) GOTO 2000
30.000 C
31.000 C
32.000 IF (LIRENR(BUF).NE.0) GOTO 2000
33.000 C NAMFIC(3)=M+1
34.000 C
35.000 C DECLARATION DE CLE COURANTE ET VERIFICATION DE SON EXISTENCE
36.000 C IF (OPNFCH(NAMFIC).NE.0) GOTO 2000
37.000 C
38.000 C DECLARATION D'ENREGISTREMENT COURANT
39.000 C MESER = DEFENR(N)
40.000 C
41.000 C
42.000 C DESTRUCTION DE L' ENREGISTREMENT COURANT DU FICHIER COURANT
43.000 C IF (LIRENR(BUF).NE.0) GOTO 2000
44.000 C
45.000 C IF (LIRENR(BUF).NE.0) GOTO 2000
46.000 C 1510 CONTINUE
47.000 C GOTO 2000
48.000 C CHARGEMENT DU DESCRIPTEUR DU FICHIER N, M FOIS
49.000 C 1600 CONTINUE
50.000 WRITE(108.000)
51.000 CALL INPUT(N)
52.000 WRITE(108.800)
53.000 CALL INPUT(M)
54.000 DO 1610 I=1,M
55.000 NAMFIC(3)=N
56.000 C
57.000 C DECLARATION DE CLE COURANTE ET VERIFICATION DE SON EXISTENCE
58.000 C IF (OPNFCH(NAMFIC).NE.0) GOTO 2000
59.000 C
60.000 C NAMFIC(3)=N+1
61.000 C
62.000 C DECLARATION DE CLE COURANTE ET VERIFICATION DE SON EXISTENCE
63.000 C IF (OPNFCH(NAMFIC).NE.0) GOTO 2000
64.000 C
65.000 C 1610 CONTINUE
66.000 C GOTO 2000
67.000 C 1700 STOP
68.000 C END
1.000 C PROGRAMME DE MESURES DU SGF.OA (VERSION 2)
2.000 C CE PROGRAMME UTILISE DIRECTEMENT LA VERSION FORTRAN
3.000 C PAR DES APPLIES DE GESTOA.
4.000 C
5.000 C INTEGER NAMUSQ(3),DSK(2),NAMFIC(3),DSQ,HUF(S12)
6.000 C
7.000 C 100 FORMAT (A,1,TAPER DC OU OK')
8.000 C 101 FORMAT (A,1)
9.000 C 110 FORMAT (A,1,DONNER LE NOM DE LA ZONE')
10.000 C 111 FORMAT (A,1)
11.000 C 200 FORMAT (A,1,DONNER LE NUME DE FICHIER)
12.000 C 300 FORMAT (A,1,DONNER LE NUME DE ENREGISTREMENTS')
13.000 C 400 FORMAT (A,1,DONNER LA TAILLE DES ENREGISTREMENTS')
14.000 C 500 FORMAT (A,1,DONNER UN ORDRE')
15.000 C 600 FORMAT (A,1,DONNER LE NUME DU FICHIER')
16.000 C 700 FORMAT (A,1,DONNER LE NUME DU ENREGISTREMENT')
17.000 C 800 FORMAT (A,1,DONNER LE NUME DE DOUCLES')
18.000 C DATA NAMFIC(1),NAMFIC(2),2HZ2,hPP7
19.000 C WRITE (108,100)
20.000 C READ (108,101)DSQ
21.000 C WRITE (108,110)
22.000 C READ(108,111)(NAMDSQ(I),I=1,3)
23.000 C DSK(I)=DSQ
24.000 C
25.000 C DEFINITION DE DISQUE COURANT ET VERIFICATION DE SON EXISTENCE
26.000 C CALL GESTOA(1),DSK,NAMDSQ)
27.000 C IF(DSK(2),N=0)STOP
28.000 C 2000 WRITE (108,300)
29.000 C CALL INPUT(1)
30.000 C GOTO (1100,1200,1300,1400,1500,1600,1700),1
31.000 C CREATION DE N FICHIER DE NOMS '+ZZPP'01'+ZZPP'02, . . .
32.000 C 1100 WRITE (108,200)
33.000 C CALL INPUT(1,N)
34.000 C #WRITE (108,200)
35.000 C
36.000 C CALL INPUT(1)
37.000 C DO 1110 I=1,N
38.000 C NAMFIC(3)=1
39.000 C
40.000 C VERIFICATION DE LA NOM EXISTENCE D'UNE CLE
41.000 C ET CREATION DE CETTE CLE
42.000 C CALL GESTOA(10,NAMFIC,IM)
43.000 C CALL GESTOA(2,NAMFIC)
44.000 C 1110 CONTINUE
45.000 C
46.000 C FERMETURE DE LA CLE COURANTE
47.000 C
48.000 C CALL GESTOA(3)
49.000 C GOTO 2000
50.000 C
51.000 C DESTRUCTION DE N FICHIER ('ZZPP'01, . . . '+ZZPP'N)
52.000 C 1200 WRITE (108,200)
53.000 C CALL INPUT(1,N)
54.000 C DO 1210 I=1,N
55.000 C NAMFIC(3)=1
56.000 C
57.000 C VERIFICATION DE L'EXISTENCE D'UNE CLE ET DESTRUCTION

58.000 C DE CETTE CLE
59.000 C CALL GESTOA(10,NAMFIC,IM)
60.000 C CALL GESTOA(4,NAMFIC)
61.000 C 1210 CONTINUE
62.000 C GOTO 2000
63.000 C
64.000 C ADDITION D'UN ENREGISTREMENT EN QUEUE DES N PREMIERS FICHIER
65.000 C OPERATION REPETEE M FOIS
66.000 C 1300 CONTINUE
67.000 C #WRITE (108,200)
68.000 C CALL INPUT(1,N)
69.000 C WRITE (108,300)
70.000 C CALL INPUT(1)
71.000 C DO 1310 I=1,N
72.000 C NAMFIC(3)=1
73.000 C
74.000 C DECLARATION DE CLE COURANTE
75.000 C CALL GESTOA(10,NAMFIC,IM)
76.000 C DO 1320 J=1,M
77.000 C
78.000 C ADDITION D'UN ENREGISTREMENT EN QUEUE DU FICHIER
79.000 C COURANT L'ENREGISTREMENT EST INITIALISE AVEC LE CONTENU
80.000 C DU TABLEAU BUR.
81.000 C
82.000 C CALL GESTOA(18,HUF)
83.000 C 1320 CONTINUE
84.000 C
85.000 C FERMETURE DE LA CLE COURANTE
86.000 C
87.000 C CALL GESTOA(3)
88.000 C 1310 CONTINUE
89.000 C GOTO 2000
90.000 C
91.000 C DESTRUCTION DU PREMIER ENREGISTREMENT DES N PREMIERS FICHIER
92.000 C OPERATION REPETEE M FOIS
93.000 C 1400 CONTINUE
94.000 C WRITE (108,200)
95.000 C CALL INPUT(1,N)
96.000 C WRITE (108,300)
97.000 C CALL INPUT(1)
98.000 C DO 1410 I=1,N
99.000 C NAMFIC(3)=1
100.000 C
101.000 C DECLARATION DE CLE COURANTE
102.000 C CALL GESTOA(10,NAMFIC,IM)
103.000 C DO 1420 J=1,M
104.000 C
105.000 C DESTRUCTION DU DERNIER ENREGISTREMENT DE LA CLE COURANTE
107.000 C
108.000 C CALL GESTOA(9)
109.000 C 1420 CONTINUE
110.000 C
111.000 C FERMETURE DE LA CLE COURANTE
112.000 C
113.000 C CALL GESTOA(3)
114.000 C 1410 CONTINUE
```
15.000 GOTO 2000
10.000 C LECTURE DE L'ENREGISTREMENT N DU FICHIER M
17.000 C OPERATION DEPELET K FOIS
18.000 1500 CONTINUE
19.000 WRITE(108,800)
20.000 CALL INPUT1(M)
21.000 WRITE(108,700)
22.000 CALL INPUT1(N)
23.000 WRITE(108,600)
24.000 CALL INPUT1(K)
25.000 DO 1510 I=1,K
126.000 NAMFIC(3)=M
127.000
28.000 C DECLARATION DE CLÉ COURANTE ET LECTURE DE L'ENREGISTREMENT
29.000 C N DE CETTE CLÉ
30.000 C CALL GESTOA(10,NAMFIC,IM)
31.000 CALL GESTOA(5,BUF,N)
32.000 NAMFIC(3)=N+1
33.000
34.000 C
35.000 C DECLARATION DE CLÉ COURANTE ET LECTURE DE L'ENREGISTREMENT
36.000 C N DE CETTE CLÉ
37.000 C CALL GESTOA(10,NAMFIC,IM)
38.000 CALL GESTOA(5,BUF,N)
39.000
40.000 1510 CONTINUE
41.000 GOTO 2000
42.000 C CHARGEMENT DU DESCRIPTEUR QU FICHIER N, M FOIS
43.000 1600 CONTINUE
44.000 WRITE(108,600)
45.000 CALL INPUT1(N)
46.000 WRITE(108,500)
47.000 CALL INPUT1(M)
48.000 DO 1510 I=1,M
49.000 NAMFIC(3)=N
50.000 CALL GESTOA(10,NAMFIC,IM)
51.000 NAMFIC(3)=N+1
52.000 CALL GESTOA(10,NAMFIC,IM)
153.000 1610 CONTINUE
54.000 GOTO 2000
55.000 STOP
56.000 1700 END
%EUO
```