Hotfix Release available. [36.1] (what's this?)
 

Bibliothèque MMM (MultiMeMory)

Etude

Pour optimiser son fonctionnement, et augmenter sa réutilisabilité, cette bibliothèque va être réecrite. On trouvera ici les nouveau principes mis en oeuvre.

Glossaire

  • Fragment (fragment) : unité de stockage.
  • Fragment libre (free fragment) : fragment disponible ne contenant aucune donnée (mise à part sa taille).
  • Fragment utilisé (used fragment) : fragment contenant des données.
  • Fragment orphelin (orphan fragment) : fragment libre de taille inférieure à 6 (dont la position n'est pas stockée dans la pile des fragments libres).
  • Orphelin (orphan) : voir Fragment orphelin.
  • A la volée (opération …) : opérations supplémentaires réalisées lors d'une allocation ou une suppression.
  • Reliquat (remainder) : fragment libre résultant de la non utilisation de la totalité d'un fragment.
  • Fragment lié (linked fragment) : fragment lié à un autre fragment.
  • Lien (link) : position du fragment auquel est lié un fragment lié.
  • Link flag : drapeau indiquant que le fragment est un fragment lié, c'est-à-dire que les données sont réparties sur deus fragments. Ne concerne que les fragments utilisés.
  • Free flag : drapeau indiquant que le fragment précédent est un fragment libre. Ne concerne que les fragments utilisés.
  • Size flag : drapeau indiquant si la taille est stockée dans le fragment. Ne concerne que les fragments libres. Ce drapeau est mis à true pour les fragments libres de taille supérieure à 1.

Signification du premier octet de chaque fragment.

Si les 6 bits de poids faibles sont à 0, on est en présence d'un fragment non-occupé (disponible). Si le bit de poids fort (size flag) est à 0, l'ensemble du fragment est uniquement constitué de cet octet. Si le bit de poids fort est à 1, le ou les prochains octets donneront la taille du fragment. Le fragment sera alors constitué de ce premier octet, du ou des octets de taille, plus n éventuels octets, n étant donné par le ou les octets de taille (et pouvant être nul).

Si les 6 bits de poids faible ne sont pas tous à 0, alors on est en présence d'un fragment occupé (non-disponible). Ces 6 bits, plus éventuellement les octets qui suivent, donnent la taille utile de ce fragment (la taille des données). Si le bit de poids fort (link flag) est à 1, alors le fragment est chainé à un autre fragment, dont la position est donné par les 4 (8 dans une architecture 64 bits ?) octets dont la position est déduite par la taille donnée par le ou les octets de taille.

Un fragment occupé ne peut avoir une taille nulle.

Signification de la taille

La taille stockée dans un fragment utilisé est la taille des données, et non pas la taille totale du fragment.

La taille stockée dans un fragment libre est la taille totale du fragment.

Gestion des fragments libres

Principe général

Les différents fragments libres (sauf les fragments orphelins) sont organisés sous forme d'une double liste circulaire chaîné, chaque fragment contenant un pointeur sur un fragment libre (non orphelin) dit prédécesseur est un fragment libre (également non orphelin) dit successeur.

Un fragment orphelin est un fragment libre dont la taille ne permet pas de stocker l'ensemble des informations sur sa taille et la chaîne des fragments libres.

Dés qu'un fragment libre (orphelin ou non) est crée ou modifié, il fusionne avec l'éventuel fragment libre (orphelin ou non) qui le précède et l'éventuel fragment libre (orphelin ou non) qui le précède. Un fragment libre ne peut donc être que suivi ou précédé d'un fragment occupé (sauf évidemment les cas particulier ou le fragment en question est le premier ou le dernier). C'est ce mécanisme qui permet de récupérer les fragments orphelins.

Codage des fragment libres

Fragments libres orphelins :

1 octets   : 0x00
2 octets   : 0x80 0x02
3 octets   : 0x80 0x03  0x03
4 octets   : 0x80 0x04  x    0x04
5 octets   : 0x80 0x05  x    x    0x05
6 octets   : 0x80 0x06  x    x    x    0x06
7 octets   : 0x80 0x07  x    x    x    x    0x07
8 octets   : 0x80 0x08  x    x    x    x    x    0x08
9 octets   : 0x80 0x09  x    x    x    x    x    x    0x09
10 octets  : 0x80 0x0a  x    x    x    x    x    x    x    0x0A

Fragments libres non orphelins :

11 octets  : 0x80 0x0b  p1   p2   p3   p4   n1   n2   n3   n4   0x0B
12 octets  : 0x80 0x0c  p1   p2   p3   p4   n1   n2   n3   n4   x    0x0C
13 octets  : 0x80 0x0d  p1   p2   p3   p4   n1   n2   n3   n4   x    x    0x0D
14 octets  : 0x80 0x0e  p1   p2   p3   p4   n1   n2   n3   n4   x    x    x    0x0E
15 octets  : 0x80 0x0f  p1   p2   p3   p4   n1   n2   n3   n4   b1   b2   b3   b4   0xFF
16 octets  : 0x80 0x10  p1   p2   p3   p4   n1   n2   n3   n4   x    b1   b2   b3   b4   0xFF
17 octets  : 0x80 0x11  p1   p2   p3   p4   n1   n2   n3   n4   x    x    b1   b2   b3   b4   0xFF
18 octets  : 0x80 0x12  p1   p2   p3   p4   n1   n2   n3   n4   x    x    x    b1   b2   b3   b4   0xFF
...
  • p1, p2, p3, p4 : chacun des octets du pointeur sur le fragment libre précédent,
  • n1, n2, n3, n4 : chacun des octets du pointeur sur le fragment libre suivant,
  • b1, b2, b3, b4 : chacun des octets du pointeur sur le début du fragment,
  • x : octet de valeur quelconque.

_template

libraries/core/mmm.txt · Last modified: 2007/06/04 05:37 by 192.168.5.50
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki