2010-02-16 5 views
2

Est-ce que quelqu'un peut me diriger vers une source ou décrire comment fonctionne l'algorithme pour le segment à faible fragmentation?Empêcher la fragmentation de la mémoire

+1

Il semble que la plupart des gens lisent la question comme «Comment créer et allocateur qui a une fragmentation minimale? Mais je pense que l'auteur veut dire: "Quel algorithme utilise Windows Heap Low-Fragmentation Heap?" La réponse à cette question ne se présente pas avec une simple recherche. –

Répondre

1

Décidez d'abord quels «multiples» vous voulez utiliser pour les blocs de mémoire alloués. J'utilise généralement 8 octets. Au démarrage de l'application, créez un vecteur où chaque élément du vecteur pointe vers un «pool» de segments de mémoire. Le premier index dans le vecteur sera pour des allocations de mémoire de 8 octets ou moins. Le deuxième index dans le vecteur sera pour les allocations de mémoire de 9-16 octets, et ainsi de suite.

Dans chaque pool, allouez de la mémoire en plus gros morceaux. Par exemple. dans le pool pour les allocations de 8 octets (ou moins), n'allouez pas 8 octets, mais allouez N fois 8 octets. Dans le pool, rappelez-vous quelles parties sont réellement allouées dans l'application et quelles parties attendent juste d'être allouées. Lorsque vous libérez de la mémoire, ne la libérez pas immédiatement, mais gardez quelques morceaux prêts pour l'allocation suivante de cette taille. Seulement si vous avez beaucoup de morceaux libres subséquents, retournez la mémoire libre au système d'exploitation.

C'est l'idée de base. Le reste est en train d'implémenter les pools (généralement des listes chaînées de morceaux).

La partie difficile est l'intégration de l'implémentation de tas dans l'application.

  • Si vous utilisez toujours utiliser # malloc/gratuit, définissent ce à redéfinir malloc et sans
  • Si vous utilisez nouveau/supprimer, définir des opérateurs nouveaux et supprimer mondiale

Jetez aussi un coup d'œil à How to solve Memory Fragmentation, et mon commentaire à Memory management in memory intensive application

1

De MSDN:

Le LFH n'est pas un tas séparé. Au lieu de cela, c'est une politique que les applications peuvent activer pour leurs tas. Lorsque le LFH est activé, le système alloue de la mémoire dans certaines tailles prédéterminées. Lorsqu'une application demande une allocation de mémoire à partir d'un segment dont la fonction LFH est activée, le système alloue le plus petit bloc de mémoire suffisamment important pour contenir la taille demandée.

Cette stratégie est utilisée par de nombreux gestionnaires de mémoire, bien que les détails puissent varier.

Questions connexes