La mémoire n'est-elle pas complètement aléatoire en lecture et en écriture ? Il s'agit d'un support physique différent du disque dur mécanique. Alors pourquoi cela affecte-t-il les performances s'il y a des fragments de mémoire dans la mémoire ? À quoi fait exactement référence cette fragmentation de la mémoire ?
L'allocateur de mémoire s'applique généralement au système d'exploitation pour une grande section de mémoire à l'avance, puis la marque comme non allouée à chaque fois
malloc()
时标记一小段为已分配,free()
cette petite section est allouée.L'ordre de malloc/free est généralement arbitraire, donc après plusieurs malloc/frees, la mémoire allouée et non allouée alternera, comme
分配1 -- 未分配1 -- 分配2 -- 未分配2
, c'est-à-dire que la mémoire non allouée est "fragmentée" une par une.Inconvénients de la fragmentation de la mémoire :
Occupation de mémoire supplémentaire : même si la quantité totale de mémoire non allouée est suffisante, la mémoire continue peut toujours ne pas être séparée. Dans ce cas, vous devez en demander davantage auprès du système d'exploitation
Affecte le cache : Le cache est basé sur les pages, et la partie non allouée d'une page occupe également le cache
Le meilleur moyen est de ne pas utiliser le tas de processus par défaut du système. Au lieu de cela, demandez vous-même un nouveau tas de mémoire. Les données d'un type sont placées dans un tas. Cela convient aux petits éléments de données fréquemment demandés et publiés.
Vous pouvez également allouer vous-même d'abord une grande quantité de données, puis utiliser votre propre pool de mémoire pour la gérer.
Pour le premier, le gestionnaire de fichiers de Windows, Explore, est utile. Par exemple, la structure de l'arborescence des répertoires parcourus est placée dans un tas séparé. HeapFree libère l'intégralité du tas en une seule fois, sans qu'il soit nécessaire de libérer les nœuds feuilles encore et encore.
Deuxièmement, par exemple, libjpeg lui-même dispose d'un pool de mémoire dédié.
Vous pouvez en apprendre davantage sur l'algorithme de copain
Il y a aussi ce PDF
Si vous ne pouvez pas l'ouvrir, passez par-dessus le mur
Je veux connaître le code source de
malloc
实现就去看看dlmalloc
, ce n'est pas compliqué