Un nœud est défini comme suit:Pourquoi ce programme alloue 8 pages mais ne peut contenir que 2048 nœuds dont la taille est de 8 octets?
struct node{
int value;
struct node *next;
};
En utilisant sizeof(struct node)
j'apprendre qu'un noeud est de 8 octets (en xv6). Donc, j'utilise malloc
pour allouer de l'espace mémoire pour stocker certains nœuds. Une seule page en xv6 est 4096 octets, si j'ai 8 pages, je peux stocker 4096 tels nœuds. Cependant, ce n'est pas ce qui se passe, après que je malloc
2048 de tels nœuds, si un autre malloc
, plus de pages sont allouées pour le processus en cours, pourquoi est-ce?
// Now display how many pages are allocated to the process
// Suppose there is a system call named memcount(), it is given by
// my professor, I wouldn't think there's any problem with that
//
memcount(); // which prints 3, meaning that initially, without
// allocaing anything, 3 pages = 12288 bytes of memory allocated
for(i = 0; i < 2048; ++i){
struct node *nd = (struct node *)malloc(sizeof(struct node));
}
memcount(); // which prints 11, so 8 more pages are allocated
// If we allocated 1 more node
struct node *nd = (struct node *)malloc(sizeof(struct node));
memcount(); // which prints 19, another 8 pages are allocated
C'est là où je suis si confus, ne devrait pas être là beaucoup d'espace laissé dans les 8 premières pages? Puisque la taille d'un seul nœud est de seulement 8 octets, pourquoi y a-t-il plus de pages allouées au processus?
Une certaine quantité de mémoire est allouée furtivement aux structures de contrôle du tas. – DyZ
Généralement, lorsque vous allouez une petite quantité de mémoire, vous pouvez en fait réserver plus que ce que vous avez spécifié (le système peut avoir une taille minimum qu'il alloue ou insister sur une puissance de deux tailles, ou quelque chose de ce genre).Il peut également y avoir un surcoût supplémentaire pour conserver les détails du bloc alloué, qui utilisera un espace en dehors de la partie que vous avez demandée. – Dmitri
@Dmitri, merci. Je comprends que 'malloc (n)' utilise un peu plus de 'n' octets, mais cela devrait être un peu juste? comment ça se passe? J'ai édité le post, je pense que cela l'explique plus clairement –