5. Gestion des fichiers d’accès direct#

Le gestionnaire de mémoire JEVEUX gère les déchargements mémoire sur disque, pour libérer de la place en mémoire au cours de l’exécution et pour archiver les résultats en fin de travail. On utilise à cette fin des fichiers d’accès direct. Ce sont les utilitaires OPENDR, WRITDR, READDR et CLOSDR qui sont appelés (bibc/utilitai/iodr.c).

L’adresse disque des objets JEVEUX est obtenue par combinaison du numéro de l’enregistrement du fichier d’accès direct utilisé pour déposer les valeurs, et éventuellement la position au sein de cet enregistrement.

La longueur des enregistrements est fixe, sa valeur est choisie lors de l’ouverture des bases JEVEUX par l’intermédiaire de la routine JEINIF.

Le nombre d’enregistrements qui fait partie des paramètres, est déterminé dans Code_Aster en fonction des conditions d’exploitation. Chaque base est découpée en unité logique de longueur 12884901888octets (notion d“« extend »), cette valeur est affectée à travers la fonction ENVIMALOFIEM et stockée dans le commun /FENVJE/. JEVEUX gère un index global qu’il découpe ensuite pour chaque extend, l’adresse disque est mesurée par rapport à l’index global, puis modulo le nombre d’enregistrements, on obtient facilement le numéro de l’extend et l’adresse relative. Les différentes unités logiques sont accessibles par un nom local qui est composé à partir des quatre premiers caractères en minuscules du nom de la base associée et du numéro d’extend.

La taille des enregistrements définit deux classes d’objets JEVEUX :

  1. les petits objets dont la taille est inférieure à la longueur d’un enregistrement, ils sont accumulés dans un espace de la taille d’un enregistrement avant transfert sur disque,

  2. les gros objets qui nécessitent plusieurs enregistrements pour stocker leur contenu.

Lors d’une requête d’écriture sur disque, le contenu des gros objets sera directement transféré sur disque, alors qu’un tampon d’écriture sera utilisé pour les petits objets afin de les cumuler et d’atteindre environ la longueur d’un enregistrement avant leur transfert. Lors d’une requête de lecture, au minimum c’est un enregistrement qui sera utilisé, dans le cas des petits objets on utilise un tampon de lecture. Les tampons de lecture et d’écriture font partie des objets système associés à chaque base JEVEUX.

La fermeture des fichiers d’accès direct est indispensable pour actualiser l’index d’accès, c’est la routine JXFERM qui appel l’utilitaire CLOSDR.

Description des enregistrements

_images/10007DB0000034D000000634E32E665CD20C77C3.svg

Chaque enregistrement est auto-décrit de façon à pouvoir facilement identifier son contenu. Comme pour la zone mémoire, les enregistrements sont vus comme une suite de mots de type entier (INTEGER*8). Les deux premiers mots donnent une information globale sur la taille des objets stockés :

  • si Ident1=Ident2=0 l’enregistrement contient des petits objets, trois mots entiers (descripteurs) sont placés devant chaque segment de valeurs, il contiennent respectivement, quand ils existent, l’identificateur de collection (Idc1), l’identificateur d’objet simple ou le numéro d’objet de collection (Ids1) et la longueur du segment de valeur, suit le segment de valeurs, et on recommence pour le suivant jusqu’à ce que Idcn=Idsn=0 ;

  • si Ident1 ou Ident2 est différent de 0, l’enregistrement contient tout ou partie du segment de valeurs associé à un gros objet.

Lors de la destruction d’un gros objet les identificateurs Ident1 et Ident2 sont positionnés à la valeur opposées (affectation du signe -). De même, lors de la destruction d’un petit objet, les identificateurs Idci et Idsi sont affectés du signe -.

Écriture des objets

C’est la routine JXECRO qui traite l’écriture des objets JEVEUX. Elle assure aussi, quand c’est nécessaire, l’ouverture des unités logiques associées à la partition en extend des bases. La routine examine les différents enregistrements pour trouver une suite d’enregistrements pouvant accueillir le segment de valeurs ou le tampon suivant les cas. Les enregistrements correspondant à de gros objets détruits peuvent ainsi être récupérés. L’écriture d’un petit objet se traduit par un déplacement du contenu du segment de valeurs dans le tampon d’écriture par la routine JXDEPS avec actualisation des descripteurs. Le tampon est transféré sur disque uniquement si le segment de valeurs est d’une taille supérieure à l’espace libre restant. Le segment de valeurs associé à de gros objets est transféré sur disque par la routine JXECRB. JXECRB est un chapeau faisant appel à l’utilitaire WRITDR qui actualise les descripteurs Ident1 et Ident2 ainsi qu’un compteur associé à l’enregistrement. Lors des déchargements ultérieurs, le tampon de lecture peut être utilisé pour actualiser l’image disque ; un logique indique alors ce type d’usage.

Lecture des objets

C’est la routine JXLIRO qui traite la lecture des objets JEVEUX. Le segments valeurs associé aux petits objets est rechargé en mémoire à partir d’un des tampons de lecture ou d’écriture. Le tampon de lecture peut éventuellement être déchargé sur disque avant de charger un nouvel enregistrement. Le segment de valeurs associé aux gros objets est directement relu à l’aide de la routine JXLIRB.