【发布时间】:2016-03-25 13:14:25
【问题描述】:
我编写了一个 C 程序,使用链表完全填满 ram,以查看我使用的操作系统如何处理它。
程序和资源管理器的屏幕截图: http://i.imgur.com/s6OQRBG.png
我在 virtualbox 中运行 kali linux,操作系统仅使用 700-ish 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... 那么为什么我的内存在分配了大约 1400MB 之后就被填满了呢?
【问题讨论】:
-
而 malloc 保留了分配更多的灵活性,所以不要指望在分配小块的次数过多时内存会被完全使用。
-
@user3528438 已修复,必须从 virtualbox 手动复制代码,因为我无法共享剪贴板或拖放工作
-
node_t; // 16 bytes according to sizeof()malloc() 开销可能在同一范围内,有效地使您的内存消耗加倍。 -->> 避免许多*小的分配。 -
哇为什么会有这么大的开销?
-
@joop 每次分配 16 字节开销?!?那将是一个非常糟糕的分配器。我知道使用可用空间来存储簿记信息(dlmalloc)的实现。虽然可能与强化实施有关?
标签: c linux memory virtualbox