gpt4 book ai didi

linux - linux malloc 的意外行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:03 24 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<pthread.h>

#define BLOCKSIZE 1024*1024
// #define BLOCKSIZE 4096
int main (int argc, char *argv[])
{
void *myblock = NULL;
int count = 0;
while (1)
{
myblock = malloc(BLOCKSIZE);
if (!myblock){
puts("error"); break;
}
memset(myblock,1, BLOCKSIZE);
count++;
}
printf("Currently allocated %d \n",count);
printf("end");
exit(0);
}

当 BLOCKSIZE 为 1024*1024 时。一切正常。 Malloc 返回 NULL,循环中断。程序打印文本并退出。
当 BLOCKSIZE 为 4096 时Malloc 从不返回 NULL 程序崩溃。 => 内存不足,被内核杀死。为什么?

最佳答案

It's pitch black, you are likely to be eaten by an OOM killer.

Linux 有一个叫做 OOM killer 的东西当它发现内存分配非常繁重时,它会徘徊在终止进程的地方。选择要杀死的进程是基于每个进程的某些属性(例如分配大量内存的进程是主要候选进程)。

它之所以这样做,部分原因在于其乐观的内存分配策略(无论设备上是否有足够的后备内存,它通常都会为您提供地址空间,这称为过量使用)。

在这种情况下,一次分配 1M 时,很可能在 OOM killer 找到您之前分配失败。使用 4K,您会在分配例程决定您已经受够之前被发现。

如果您愿意,您可以将 OOM killer 配置为让您独处,方法是将调整值 -17 写入 procfs< 中的 oom_adj 条目。除非您知道自己在做什么,否则这是不可取的,因为它会使其他(可能更重要的)流程处于危险之中。从 -16+15 的其他值会调整您的流程被选中的可能性。

您也可以通过将 vm.overcommit_memory=2 写入 /etc/sysctl.conf 来完全关闭过度使用,但这同样会在您的环境中出现问题。

关于linux - linux malloc 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com