2009-10-27 4 views
1

Je vais avoir quelques problèmes mettre en œuvre ma propre mémoire dynamique allocateur en utilisant une liste Implicite pour suivre les blocs libres dans c. **** Plus précisément, je vais avoir des problèmes avec la mise en œuvre realloc et changer le code de trouver ajustement/premier ajustement à la prochaine forme. Le meilleur ajustement serait idéal mais laisse juste dire prochain approprié pour maintenant. J'ai tout autre chose en bas, ses seulement ces deux articles en particulier ...Des problèmes d'écriture ma propre malloc, libre, et realloc

plus d'info ...

Je suis en train de mettre en œuvre ma propre version d'un allocateur de mémoire dynamique avec mes propres versions de malloc, libre, et realloc ... Il existe quatre méthodes pour garder la trace des blocs libres dans un allocateur de mémoire dynamique, le premier de ceux-ci que j'ai ici est une liste implicite, qui utilise un en-tête . Pour trouver un bloc libre dans une liste Implicite il y a plusieurs politiques de placement qui peut être promulgués dans une liste implicite. Le premier s'appelle first fit ou find fit qui se trouve dans le code ci-dessous ... il recherche la liste depuis le début, et choisit le premier bloc libre qui lui convient. La méthode suivante s'appelle next fit que j'ai du mal à implémenter, et cette méthode est similaire à first fit, mais au lieu de commencer chaque recherche au début de la liste, elle démarre chaque recherche où la recherche précédente s'est arrêtée. Enfin il y a le meilleur ajustement ... ce serait la méthode idéale pour moi mais je sais que c'est plutôt compliqué et assez difficile, donc je vais prendre juste la prochaine, mais s'il y a quelqu'un qui sait comment mettre en place le meilleur ajustement dans une liste implicite S'IL VOUS PLAÎT, n'hésitez pas à le poster. Le meilleur ajustement porte sur tous les blocs libres et choisit le bloc libre avec la plus petite taille qui correspond à ... Je sais que pour un meilleur ajustement, il est possible d'éliminer les pieds de page dans les blocs alloués ... la plupart du temps parce qu'ils ne sont pas vraiment nécessaires ... Je suis tout simplement pas exactement comment faire ...

Je comprends beaucoup de code, mais je voulais juste mettre tout à la fois si rien ne se manquer.

Je reste un espace pour realloc qui retourne NULL et est quelque part au milieu du code et find_ s'adapter que je veux changer la méthode de la politique de placement next_fit est vers le bas ...

Toute aide serait grandement apprécié ... Merci.

Le code est dans ce site ... désolé ... J'ai eu beaucoup de problèmes affichant le code ici ... encore plus, car il est si grand ... Je viens d'utiliser google il semble donc plus authentique ...

DMA CODE

J'ai marqué les sections clairement dans le code sur le site donc il ne devrait avoir aucun mal à trouver le realloc et trouver des méthodes d'ajustement ...

+2

C'est soit devoirs ou vous ne devriez pas être * * écrire votre propre malloc :-) Vous correspondez probablement jamais les performances de ceux qui sont déjà disponibles. Lequel est-ce? – paxdiablo

+0

hah ... pas certainement pas son devoir ... J'ai fait avec l'école pendant un certain temps ... mais looong vous remercie de penser qu'il était ... Je me sens beaucoup plus jeune maintenant :) – jingojango

+1

@ paxdiablo: Vous Soyez surpris par le nombre de personnes qui font des choses similaires par curiosité, pour l'auto-éducation, ou comme un passe-temps. J'écris une bibliothèque C. Il y en a beaucoup, mais celui-ci est à moi. ;-) – DevSolar

Répondre

1

une façon naïve résoudre realloc serait d'avoir realloc vous appelez fonction malloc et juste copier les données, mais je suppose que vous cherchez une solution plus sophistiquée?

+0

Il n'y a rien à faire de "plus sophistiqué", sauf de vérifier si le nœud de mémoire actuel est juste assez grand pour satisfaire la requête. Vous pouvez également choisir de ne pas libérer le nœud actuel si realloc() demande une réduction de taille (échange de mémoire perdue pour l'opération de copie sauvegardée). – DevSolar

+0

Vous pouvez également toujours étendre le tas chaque fois que le bloc alloué le plus à droite est réaffecté à une taille plus grande. Vous allez payer (un peu) pour l'utilisation de l'espace, mais votre débit augmentera. –

1

Mon own code est seulement un ATM d'implémentation stop-gap, pas très efficace par rapport aux autres solutions (dlmalloc() et al.).Il s'agit d'un algorithme de premier ajustement parfait, mais il devrait être trivial d'étendre la partie «se souvenir du premier ajustement dans le cas où vous n'avez pas d'ajustement exact» aux lignes 63 à 71 pour gérer au mieux -fit:

Vérifiez la taille du nœud actuel, et si elle est plus petite que celle mémorisée jusqu'à présent, mais toujours assez grande pour satisfaire la demande, souvenez-vous du nœud actuel au lieu de celui mémorisé jusqu'à présent.

Le code est sous licence publique-domaine-alike, à savoir que vous pouvez l'utiliser comme bon vous semble.

+0

Merci, je vais être sûr de le regarder. :) – jingojango

1

meilleur ajustement est pas très bon pour beaucoup de buts, mais si vous le voulez vraiment, il est assez facile à mettre en œuvre. Lorsque vous ajoutez des blocs à votre liste gratuite, insérez-les dans l'ordre, triés par taille. Ensuite, lorsque vous essayez d'allouer un bloc, une recherche de premier ajustement donne également le meilleur ajustement.

0

Si vous n'êtes pas à faire des devoirs, pourquoi ne vous utilisez valgrind pour déboguer des problèmes de mémoire? Ou si vous avez besoin d'une version plus spéciale de malloc, pourquoi ne pas commencer par Dave Hanson's debugging version of malloc?

Si vous faites des devoirs, pourquoi ne vous nous avez dit?

+0

lol ... est-ce que beaucoup de questions se posent sur le site web? ... désolé mais je suis sorti de l'école depuis un moment ... vous êtes en fait la deuxième personne à me faire rajeunir ... Je vous remercie. – jingojango