ノードが定義されている:なぜこのプログラムは8ページを割り当てますが、サイズが8バイトの2048ノードに収まるだけですか?次のように
struct node{
int value;
struct node *next;
};
sizeof(struct node)
を使用することにより、私は、ノードが(xv6に)8バイトであることを知ります。だから私はmalloc
いくつかのノードを格納するためにいくつかのメモリ空間を割り当てて使用します。 xv6の単一ページは4096バイトです.8ページあれば、4096個のノードを格納できます。しかし、それは起こっていません。 2048のようなノードの場合、別の場合は、現在のプロセスに割り当てられたページが増えています。それはなぜですか?
// 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
私はとても混乱しています。最初の8ページには多くのスペースが残っていませんか?単一ノードのサイズはわずか8バイトなので、プロセスに割り当てられるページが増えているのはなぜですか?
'malloc(X)'は、 'X'バイト以上のメモリを使います。いくつかのメモリはヒープ制御構造のために秘密に割り当てられています。 – DyZ
一般的に、少量のメモリを割り当てると、指定した以上の容量を実際に予約することができます(システムは割り当てられる最小サイズを持つか、2つの割り当てサイズのいずれか、またはその他のものを要求します)。また、割り当てられたブロックの詳細を保持するために追加のオーバーヘッドが存在する可能性があります。割り当てられたブロックの外側にスペースを使用します。 – Dmitri
@ドミトリ、ありがとう。私は 'malloc(n)'が 'n'バイトよりも少し多く使うことを理解していますが、それはちょっと正しいでしょうか?どうしてそんなことが起こるの?私はポストを編集した、私はそれがより明確に説明すると思う。 –