c - 仅分配 ~1400MB 后空间不足,而之前的可用空间明显更大

标签 c linux memory virtualbox

我使用链表编写了一个 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/

相关文章:

c - 函数 strlen 中的警告 - 在 C 中

memory - CLR Profiler - 附加到现有进程

C将int数组指针作为参数传递给函数

c - C 中的浮点异常(核心转储)

linux - 如何在 shell 脚本中使用 ssh 在远程服务器上运行 sed(包括变量)

linux - 使用公钥关闭连接

linux - 寻找示例嵌入式 Linux HID 设备代码

c - 如何跟踪泄漏了多少内存?

c# - 空指针使用多少内存?

c - 在 C 头文件中声明的结构 - gcc malloc 错误