我使用链表编写了一个 C 程序来完全填满 ram,以查看我使用的操作系统如何处理它。
程序和资源管理器截图: http://i.imgur.com/s6OQRBG.png
我在 virtualbox 中运行 kali linux,而操作系统只使用了 700 MB,所以可用空间接近 3 gigs...但是在我的程序中只分配了 1420MB 后内存就满了。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct node
{
char val;
struct node *next;
} node_t; // 16 bytes according to sizeof()
node_t *create_node(node_t *current, char newval)
{
node_t *head = malloc(sizeof(node_t));
head->val = newval;
head->next = current;
return head;
}
int main(void)
{
node_t *head = NULL;
for ( int i = 0; i < 1099511627776; i++ ) //arbitrarily large number
{
for ( int j = 0; j < 65536; j++ ) //64*1024
{
head = create_node(head, 'a');
}
usleep(11111);
printf("%dMB\n", i+1);
}
return 0;
}
64 个节点应该是一个千字节 (16*64 = 1024) 而 1024 KB 应该是一个 MB... 那么为什么我的 ram 在分配了约 1400MB 的内存后就被填满了?
最佳答案
您很有可能正在碎片化内存。
考虑到一个内存页明显大于 16 字节,并且您正在分配 16 字节 x 16 字节,您最终可能会得到 2048 或 4096 字节的内存页,而只使用了 16 字节(或更多,但永远不会是完整的)页)。
如果您想要更好的内存基准,请在连续空间中分配字节数组(还要确保通过写入来提交内存)。
关于c - 仅分配 ~1400MB 后空间不足,而之前的可用空间明显更大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36220655/