La mise en œuvre de votre propre malloc/free avec mmap et munmap
J'ai mis en œuvre par les propres malloc et gratuit à l'aide de mmap. Maintenant, puisque contrairement à gratuit, munmap prend également en longueur comme paramètre, donc j'ai mis de la longueur comme une information supplémentaire dans la mémoire mappée.
Le code de mon malloc et gratuit est indiqué ci-dessous. Je veux demander, si ce code est bon ou suis-je encore oublié quelque chose ou de faire quelque chose dans un mauvais sens.
void * malloc ( size_t size )
{
int *plen;
int len = size + sizeof( size ); //Add sizeof( size ) for holding length.
plen = mmap( 0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
*plen = len; //First 4 bytes contain length.
return (void*)(&plen[1]); //Memory that is after length variable.
}
void free ( void * ptr )
{
int *plen = (int*)ptr;
int len;
plen--; //Reach top of memory
len = *plen; //Read length
munmap( (void*)plen, len );
}
Je suggère de faire un test de base du programme qui s'exécute ces un tas de fois avec un tas de différents paramètres et en l'exécutant à travers Valgrind pour voir si des problèmes de pop-up.
Appartient sur codereview.stackexchange.com ?
toujours avoir de la difficulté à s'orienter dans tous les sous forums, de celui que vous mentionnez, par exemple, SI le forum ubuntu. Pourriez-vous veuillez indiquer comment et où obtenir une liste?
cliquez sur le StackExchange mot de droite en haut de la page à gauche - cela fera apparaître une fenêtre puis cliquez sur "Tous les Sites"
Appartient sur codereview.stackexchange.com ?
toujours avoir de la difficulté à s'orienter dans tous les sous forums, de celui que vous mentionnez, par exemple, SI le forum ubuntu. Pourriez-vous veuillez indiquer comment et où obtenir une liste?
cliquez sur le StackExchange mot de droite en haut de la page à gauche - cela fera apparaître une fenêtre puis cliquez sur "Tous les Sites"
OriginalL'auteur MetallicPriest | 2011-12-12
Vous devez vous connecter pour publier un commentaire.
Quelques observations:
int
etsize_t
ont la même taille. Si vous souhaitez stocker unsize_t
de la valeur à la tête de l'allocation, alors pourquoi ne pas vous venez de le faire? Pourquoi introduireint
?mmap()
, et en général, les allocations ne peuvent pas être inférieure à une "page". La plupart des allocateurs essayez d'éviter d'attirer l'OS au niveau de la fonctionnalité de chaquemalloc()
, de diverses manières.mmap()
échoue, il sera de retourMAP_FAILED
, et devrait doncmalloc()
. Ainsi, vous avez besoin de tester pour que avant de référencement le pointeur retourné parmmap()
.free(NULL)
doit être valide chose à faire; avec votre mise en œuvre, il sera très probablement provoquer un plantage puisque vous n'avez pasNULL
-vérifier l'argument avant de supposer qu'il est valide.malloc
-ed la taille est beaucoup plus petite qu'une page, de sorte que vous devez garder plusieurs segments de mémoire dans l'un (ou plusieurs années consécutives) pages. Par exemple lorsque vous êtesstrdup
-ing certains nom ou le langage humain word, le format typique d'un ou de quelques dizaines d'octets, mais typique de la taille de la page est 4Kbytes! Vous devez également accepter de grandesmalloc
les demandes et de les gérer d'une façon spéciale.Cela dit, mon PC actuel a 4096 fois plus de mémoire que mon premier PC a permis à certains programmes. Il n'est donc pas hors de question que jouet programmes pourraient courir avec cette allocation, il suffit de ne pas essayer de relier Firefox contre elle. Ce que vous vraiment vous voulez, cependant, est deux pages par dérisoire dizaine d'allocation d'octets, aka "page de garde après" 😉
Oui, mais le logiciel de votre PC est d'utiliser peut-être cinq mille de plus de mémoire que ce qui a été utilisé avant. La RAM, c'est comme l'espace disque, il a tendance à être plein....
Ma RAM n'est pas complet: courant d'utilisation de la mémoire physique est de 50%, dont la plupart peuvent être transférées vers le fichier d'échange. Je le dis encore une fois, la taille de programme qui peut être exécuté sur mon PC avec cette absurde allocateur est à peu près comparable à la taille de programme qui peut être exécuté dans la mémoire conventionnelle sur mon premier PC. Ça ne veut pas en faire une bon allocateur, juste un qui est mieux que complètement inutile.
sera de retour
MAP_FAILED
lorsqu'elle échoue, plutôt que deNULL
.OriginalL'auteur unwind
Vous devriez, au moins.
mmap
échouesize_t
pour la taille, pas unint
. Ils peuvent être différents.int
, sans doute 4 octets à la page des données alignées de mmap. Cela signifie en stockant les valeurs qui ont besoin de plus d'alignement dans le retour de la mémoire, par exemple, un double encourt une pénalité de performances, ou carrément se bloque sur certaines architectures.NULL
passé à free (c'est censé être un no-op)Pour un malloc de la mise en œuvre, je voudrais aussi s'attendre à au moins rudimentaire prise en charge du débogage, par exemple, essayez de détecter les doubles libère, essayer de détecter gratuit avec des pointeurs invalides, de la liste de la mémoire ne sont pas libres avais etc.
Garder à l'esprit votre malloc mise en œuvre peuvent être extrêmement rentable. Si vous malloc 10 octets , vous finirez par l'allocation de 1 page (4096 octets), qui doivent toutes être mappé à la mémoire physique, avec le reste de 4082 octets être utilisés.
OriginalL'auteur user964970
Lire aussi c malloc sur wikipédia et d'étudier attentivement certains réel malloc implémentations comme Doug Lea malloc. Il y a beaucoup de littérature sur le sujet, par exemple en par Wolfram Gloger et beaucoup d'autres.
@MetallicPriest: vous devriez vraiment expliquent beaucoup beaucoup plus que vous êtes en train de faire (je ne suis pas très optimiste pour votre travail, mais vous aurez probablement apprendre énormément!)
OriginalL'auteur Basile Starynkevitch
Vous ne devriez pas appel mmap chaque fois que vous appelez votre personnalisé malloc. Comme l'a dit avant il y a une surcharge énorme de faire cela.
Vous devez créer une grande taille de la mémoire partagée (4K par exemple) et votre fonction de malloc n'aurez qu'à renvoyer les pointeurs dans la gamme de la mémoire vous alocated.
Alors si vous avez peu de mémoire, vous créez un autre 4k de mémoire partagée.
Vous aurez juste à compter de combien d'espace vous utilisez et de garder trace de vos références et de cette façon, la libération de la mémoire est beaucoup plus facile.
OriginalL'auteur puikos
Et vous devriez également utiliser
-1
au lieu de0
que la fd argument de mmap.OriginalL'auteur remus