Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux malloc的意外行为 #包括 #包括 #包括 #包括 #定义块大小1024*1024 //#定义块大小4096 int main(int argc,char*argv[]) { void*myblock=NULL; 整数计数=0; 而(1) { myblock=malloc(BLOCKSIZE); 如果(!myblock){ 放置(“错误”);中断; } memset(myblock,1,BLOCKSIZE); 计数++; } printf(“当前分配的%d\n”,计数); printf(“结束”); 出口(0); }_Linux_Null_Malloc - Fatal编程技术网

linux malloc的意外行为 #包括 #包括 #包括 #包括 #定义块大小1024*1024 //#定义块大小4096 int main(int argc,char*argv[]) { void*myblock=NULL; 整数计数=0; 而(1) { myblock=malloc(BLOCKSIZE); 如果(!myblock){ 放置(“错误”);中断; } memset(myblock,1,BLOCKSIZE); 计数++; } printf(“当前分配的%d\n”,计数); printf(“结束”); 出口(0); }

linux malloc的意外行为 #包括 #包括 #包括 #包括 #定义块大小1024*1024 //#定义块大小4096 int main(int argc,char*argv[]) { void*myblock=NULL; 整数计数=0; 而(1) { myblock=malloc(BLOCKSIZE); 如果(!myblock){ 放置(“错误”);中断; } memset(myblock,1,BLOCKSIZE); 计数++; } printf(“当前分配的%d\n”,计数); printf(“结束”); 出口(0); },linux,null,malloc,Linux,Null,Malloc,当BLOCKSIZE为1024*1024时。一切都好。Malloc返回NULL,循环被中断。程序打印文本并退出。 当BLOCKSIZE为4096时 Malloc从不返回空程序崩溃。=>内存不足,被内核杀死。 为什么? 它漆黑一片,你很可能会被一个杀人凶手吃掉 Linux有一个称为A的东西,当它发现内存分配非常繁重时,它会随意终止进程。选择要终止哪个进程是基于每个进程的某些属性(例如分配大量内存的进程是主要候选进程) 它做到了这一点,部分原因是它的乐观内存分配策略(无论设备上是否有足够的后备内存,

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

它漆黑一片,你很可能会被一个杀人凶手吃掉

Linux有一个称为A的东西,当它发现内存分配非常繁重时,它会随意终止进程。选择要终止哪个进程是基于每个进程的某些属性(例如分配大量内存的进程是主要候选进程)

它做到了这一点,部分原因是它的乐观内存分配策略(无论设备上是否有足够的后备内存,它通常都会为您提供地址空间,称为Overmit)

在这种情况下,当一次分配1M时,很可能在OOM杀手找到你之前分配失败。对于4K,在分配例程确定您已经受够之前,您就被发现了

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


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

malloc仅在无法分配内存时返回NULL。当你降低块大小时,你可以分配所有的块,因为你从来没有释放过它们,你会得到一个OOM错误。程序员:分配内存。Linux:什么,赤手空拳?
#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);
}