怎么解释这个问题的由来呢?
是酱紫的。我python调用了一个c写的库,里面fork并且execvp,结果ptrace检测出来子进程占用的内存感人--
大概2128KB。然后,我写了这么段代码:
#include <stdio.h>
#define MAX (1<<20)
int main()
{
int a[MAX], i;
for (i=0;i<MAX;++i)
a[i] = i - 1;
return 0;
}
已知的是int在我的机器上是32位即最大值2^31-1(2147483647),静态编译。那么可猜想内存占用是4096KB以上,结果也是,得到了4904KB。但是如果进程小于2128KB占用,得到的永远是2128KB。
所以一个猜想,是否是execvp重用了当前进城的内存空间了呢?(十分有这个可能吧!毕静Linux也不傻--)
深入追寻了execvp:
execvp -> execve -> do_execve -> do_execve_common -> exec_binprm -> search_binary_handler -> load_elf_binary -> start_thread
所以我猜测,这里的部分是独立分配的内存空间来load整个elf文件,并修改寄存器指针,然后内核并没有直接回收掉原来的进程占用的内存而是直接作为栈区指派给新的进程0.0(如果站在算法角度的话我也会这么干,这叫内存迭代--)
当然这只是猜测--不过基本印证了我的猜测--有谁来给我指点迷津啊--