Bonjour,
Je dois recoder malloc pour mon ecole, je n'ai le droit qu'a brk/sbrk pour allouer de la memoire (et j'ai aussi le droit a toute la libc) et j'ai une petite question.
J'ai donc trouve pleins d'algo different, j'ai compris comment malloc fonctionne et comment le recoder mais je n'arrive pas a comprendre quel taille devront avoir les differents bloc memoires.
Pour ceux qui ne savent pas comment malloc doit marcher, en gros c'est ca :
On alloue la memoire sous forme de bloc de X octets (en fonction du nombre d'octet demande et de la memoire que notre malloc a besoin).
On garde en memoire (souvent sous forme de liste chainee) les differents blocs alloues ou free (avec differentes infos comme l'adresse memoire du debut du bloc, sa taille, etc, etc).
Si un bloc est free et qu'un bloc adjacent est free, on les "colle".
Si un bloc est libre et qu'il correspond aux bon nombres d'octets qu'on a besoin, on le donne a l'utilisateur.
etc
Sur le net, j'ai trouve pas mal d'algo qui utilise les puissances de 2 ou les multiples de 4 (en gros, c'est jamais alloue au "pif", ca suit toujours une regle precise) pour allouer X octets par blocs.
Donc en gros, si l'utilisateur a besoin de 42 octets et que mon malloc a besoin de 32 octets pour fonctionner (donc pour stocker les differentes infos), le malloc doit regarder a quelle puissance de 2 cela correspond.
Pour l'exemple, ca fait 42 + 32 = 74 ce qui nous donne 2^7 = 128.
Donc je vais devoir allouer un bloc de 128 ou 128 - 74 = 54 octets seront libres.
Le probleme, c'est que si le mec demande 4 octets, je peux utiliser le bloc de 54, donc il restera 54 - (32 + 4) = 18 octets de libre.
Sauf que mon malloc a besoin de 32 octets donc au final, ce bloc de 18 octets ne sera jamais utilise.
Et donc, s'il y a de la memoire non utilisee c'est pas opti ! (en gros, si a la fin de chaque bloc y a genre ~20 octets non utilise je trouve pas du tout ca opti).
C'est ca que j'arrive pas a comprendre, dans tous les algos que j'ai trouve, a chaque fois on peut arriver a ce cas.
Est ce que j'ai rien compris ou c'est tout simplement normal ??
NB : Si on alloue trop d'octets a chaque fois, c'est justement pour appeler le moins de fois les fonctions sbrk/brk.
Et dsl pour les accents mais je suis en qwerty.
Partager