free后malloc时没有系统调用

free后malloc时没有系统调用

当我玩了一下内核审计系统时,我编写了一个小 C 程序:

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

int main(int argc, char** argv){
        void *t;
        while(1){
                t = malloc(1);
                free(t);

        }
        return 0;
}

并应用以下过滤器进行审核:

-a always,exit -F arch=b32 -S open,openat -F exit=-EACCES -F key=access
-a always,exit -F arch=b64 -S open,openat -F exit=-EACCES -F key=access
-a always,exit -F arch=b32 -S brk
-a always,exit -F arch=b64 -S brk

编译并运行后,我注意到sys_brk审计日志中没有显示这一点。此外,它也没有出现在 中strace,即使malloc被调用(用 ltrace 检查)。最后,我删除了免费服务,并sys_brk开始显示来电。

是什么导致了这种行为? glibc 是否对malloc和函数进行某种优化free以防止无用的系统调用?

TL;DR:free后面跟着的malloc不会调用内核。为什么?

答案1

您的程序从初始堆开始,并且您的一个字节分配适合该堆。当您立即释放分配的内存时,堆永远不需要增长,因此您永远不会看到相应的系统调用。

内核中进程内存测量更新的速度/频率如何?进行类似的实验。

相关内容