노드가 정의된다이 프로그램은 8 페이지를 할당하지만 크기가 8 바이트 인 2048 개의 노드에만 맞을 수있는 이유는 무엇입니까? 다음
struct node{
int value;
struct node *next;
};
sizeof(struct node)
를 사용하여 I는 노드 (xv6 년) 8 바이트 것을 배운다. 그래서 일부 노드를 저장하기 위해 메모리 공간을 할당하기 위해 malloc
을 사용합니다. xv6의 단일 페이지는 4096 바이트이고, 8 페이지가 있으면 4096 개의 노드를 저장할 수 있습니다. 그러나, 내가 무슨 그런 노드가, 내가 malloc
또 하나, 더 많은 페이지가 현재 프로세스에 할당되어 있다면, 그게 무슨 일이 일어나고 있지?
// 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
일반적으로 소량의 메모리를 할당하면 실제로 지정한 용량보다 많은 용량을 예약 할 수 있습니다 (시스템이 할당 할 최소 크기 또는 할당 크기가 두 배가되는 등의 문제가있을 수 있음).또한 할당 된 블록의 세부 정보를 유지하기 위해 추가 오버 헤드가있을 수 있으며 요청한 부분 외부의 공간을 사용합니다. – Dmitri
@ 드미트리, 감사합니다. 나는'malloc (n)'이'n' 바이트보다 조금 더 많은 것을 사용한다는 것을 이해한다. 그러나 그것은 약간 옳을 것이다. 어떻게 된거야? 나는 포스트를 편집했는데, 그것이 더 명확하게 설명한다고 생각한다. –