2010-10-14 3 views
5

J'ai besoin d'aide pour réfléchir à une tâche.Mémoire et pointeurs

Ma tâche est de créer une zone de mémoire

void *memory = malloc(320); 

puis utiliser des pointeurs pour stocker des textes dans ce lieu de stockage: Nous voulons diviser cette zone en blocs de données de 32 octets, semons, nous pouvons stocker: 320/32 = 10 blocs de données a 32 octets. Dans un bloc de données, je peux stocker (1 caractère ASCSII = 1 octet) 32 caractères.

J'ai un bitmap qui est 10 long où chaque bit indique si le bloc de données est utilisé (1) ou non (0).

Mais que se passe-t-il si je veux stocker un texte de 60 caractères? Ensuite j'ai besoin de 2 blocs de données (2 x 32 octets). Le bitmap montre que les blocs de données 2 et 6 sont libres, 1 et 6 n'est pas côte à côte. Comment puis-je atteindre cet objectif?

struct data { 
    char * text; 
}; 

typedef struct data d; 

d->text = ??? 
+8

S'il n'y a pas deux blocs libres adjacents, vous ne pouvez pas satisfaire la requête d'une chaîne de 60 octets. Vous venez de découvrir la "fragmentation de la mémoire": http://en.wikipedia.org/wiki/Memory_fragmentation –

+0

Ainsi, vos seules options seraient de défragmenter (ce qui oblige les gens à ne pas conserver les pointeurs), ou d'allouer plus de mémoire. – EboMike

+1

ou pour créer des chaînes – pm100

Répondre

4

Ceci est appelé fragmentation de mémoire et constitue un problème sérieux. Vous devez signaler un manque de mémoire, même s'il y a techniquement assez pour supporter le blocage.

Les langages managés comme C# qui n'autorisent pas les pointeurs (dans le cas normal - ne fixez pas dessus) ont la liberté de réorganiser la mémoire sous-jacente et de résoudre ce problème (même si ce n'est pas gratuit) .

Pour résoudre le problème dans C:
Vous ne pouvez pas faire grand chose car ces pointeurs dans la mémoire vous empêchent de tout remanier. Quelqu'un d'autre a mentionné le système de jumelage et il y en a d'autres mais peu sont simples. Beaucoup sont basés sur le fait d'avoir des 'gros morceaux' prédéfinis et de 'petits morceaux' et permettant seulement de petites requêtes de petits morceaux etc ... mais c'est tout pour arrêter d'arriver au problème en premier lieu, une fois que vous êtes là, vous niez demande de mémoire ou développer le pool.

+0

Ok. Mais est-ce le cas de le faire en C avec des pointeurs? C'est une tâche que je dois comprendre. – user265767

0

Comme mentionné dans d'autres commentaires et réponses, il s'agit d'un problème de fragmentation. Vous pouvez soit défragmenter le code (qui imposera beaucoup d'exigences et de limitations sur la façon dont les systèmes sont autorisés à accéder à la mémoire), soit allouer de la mémoire.

Il existe des techniques pour minimiser la fragmentation. L'une des plus populaires est l'allocation de la mémoire de buddy:

0

Vous devez ajouter une sorte de couche de gestionnaire de mémoire qui garde la trace des emplacements occupés par une entrée particulière (dans ce cas, une chaîne) et dans quel ordre les emplacements sont utilisés - Votre champ de bits ne serait pas suffisant.

0

Votre structure de données de chaîne doit être exactement comme votre gestionnaire de blocs, sauf qu'elle doit suivre les blocs "locaux" plutôt que tous les blocs dans le pool de mémoire.

0

Quelques réflexions sur le haut de ma tête:

  • Ajouter à votre architecture de stockage en ayant toutes les demandes à votre stockage passer par un contrôleur/gestionnaire qui abstracts l'accès au stockage (pourrait être le même celui qui gère le bitmap). Cela vous permettra de défragmenter votre stockage tout en ne vous souciant pas des autres parties de l'application ayant des pointeurs au mauvais endroit après la défragmentation.

  • Vous pouvez réécrire la spécification de votre système de stockage afin qu'un octet spécifique de chaque bloc soit utilisé pour stocker un numéro identifiant le bloc "suivant" (ayant ainsi seulement 31 octets de stockage effectif par bloc).

+0

Ou chaque bloc est char a [32], le message struct contient un tableau qui pointe sur data_blocks, puis je peux diviser une chaîne en blocs et ajouter le numéro de bloc au tableau? – user265767

0

Vous pouvez utiliser un octet de chacun des 10 espaces de 32 octets et utiliser cet octet comme index pour la suite de la chaîne. Ce serait en fait une liste liée, et vous pourriez en faire une liste doublement liée en ayant les index avant et arrière.