CISCO IOS (Partie 5)
Par Mathieu le dimanche 20 janvier 2008, 19:45 - Lien permanent
Lorsque l’on alloue de la mémoire à un processus (malloc), Le Pool Manager
prend une zone de mémoire libre et l’attribue à un processus. Le Pool Manager
tient donc une table de blocs de mémoire contigus. Lorsqu’un processus libère
une zone mémoire (free), le Pool Manager essaie de concaténer la zone de
mémoire fraichement libérée avec ses voisines. Malgré cette concaténation une
fragmentation est inévitable. Une mémoire extrêmement fragmentée peut mener à
des erreurs de malloc « %SYS-2-MALLOCFAIL ».
En effet, il se peut qu’il y ait suffisamment de mémoire disponible, mais pas
de blocs contigus suffisant pour permettre la taille de malloc demandée.
Dans ce dernier
exemple, il n’y a que des petits blocs non contigus libérés, résultat : Si un
processus désire allouer une zone mémoire plus importante, il ne pourra pas le
faire et nous aurons un « MALLOCFAIL ». Le Chunk Manager va permettre de régler
ces soucis en allouant plus intelligemment la mémoire aux processus. Le Chunk
Manager est responsable de l’allocation de Chunk. Un Chunk contient un nombre
de blocs finis de taille égale. Si on utilise tous les blocs présents dans un
Chunk, le Chunk Manager alloue un nouvel espace (Sibling). Si plus aucun des
blocs de ce « Sibling » n’est utilisé, il est libéré « Freed/Trimmed ». Un
processus se voit donc attribuer une plus grande zone mémoire découpée en plus
petits blocs. Lorsque le processus libère un bloc, il le fait dans son Chunk.
Il n’y a donc plus de fragmentation entre différents processus.
Dans ce dernier
exemple, il n’y a que des petits blocs non contigus libérés, résultat : Si un
processus désire allouer une zone mémoire plus importante, il ne pourra pas le
faire et nous aurons un « MALLOCFAIL ». Le Chunk Manager va permettre de régler
ces soucis en allouant plus intelligemment la mémoire aux processus. Le Chunk
Manager est responsable de l’allocation de Chunk. Un Chunk contient un nombre
de blocs finis de taille égale. Si on utilise tous les blocs présents dans un
Chunk, le Chunk Manager alloue un nouvel espace (Sibling). Si plus aucun des
blocs de ce « Sibling » n’est utilisé, il est libéré « Freed/Trimmed ». Un
processus se voit donc attribuer une plus grande zone mémoire découpée en plus
petits blocs. Lorsque le processus libère un bloc, il le fait dans son Chunk.
Il n’y a donc plus de fragmentation entre différents processus.
#show chunk Chunk Manager: 407660 chunks created, 406281 chunks destroyed 9349 siblings created, 406279 siblings trimmed Chunk element Block Maximum Element Element Total Cfgsize Ohead size element inuse freed Ohead Name 16 4 940 33 2 31 360 String-DB owne 0x654C2408 16 4 940 33 0 33 360 String-DB cont 0x654C27B4 312 16 65588 197 38 159 4072 Extended ACL e 0x654C3484 96 16 20052 171 9 162 3584 ACL Header 0x654D34B8 8536 0 65588 7 1 6 5784 Parseinfo Bloc 0x654DA14C 16 0 456 15 1 14 164 tokenQ node 0x654EA180 20 0 456 13 13 0 144 Chain Cache No 0x654EA348 20 0 456 13 6 7 144 (sibling) 0x66BD0E50 20 0 460 13 13 0 148 (sibling) 0x66F33EE0Au sein d’un Chunk, les blocs possèdent un header (ou non taille=0). La taille du header par Chunk est fixe (0, 4, 16, 20, 24). Ex : ACL Header, un Chunk de maximum 171 éléments avec 96 éléments au départ. Chaque bloc possède un header de 16 Bytes et pèse 20.052 Bytes. J’ai actuellement 9 blocs utilisés dans ce Chunk. Prochain post : Les Buffers.