2012-03-27 57 views
7

考虑下面的C程序的内存占用,“pause.c”:使用此命令“在x64的Linux 3.0.0-16泛型我怎样才能减少一个最小的Linux进程

void main() { pause(); } 

这个编译gcc -Os pause.c -o pause'产生大小为〜8KB的可执行文件。当我运行此可执行文件并使用'pmap -d PID'检查其精确的内存占用情况时,它显示分配给进程的私有内存为192KB(它通常在128KB和192KB之间不同,通常在不同的系统上有所不同)。

使用valgrind和massif检查进程无法检测到任何内存分配事件。我对192KB数字是否准确持怀疑态度,但我发现启动5次“暂停”进程确实消耗了大约1MB的系统内存。

我无法解释这个记忆的起源,任何人都可以提供一些关于这个记忆被分配的原因以及任何可能减少它的潜在行为,欢呼声。

+0

开始通过检查ELF可执行;你会发现很多东西(数据/代码段,调试,注释等)。另外请记住,您的程序至少与libc链接;那里有相当多的空间。 – 2012-03-27 10:29:14

+0

好吧,二进制文件的基本大小是8KB,pmap实用程序将连接开销考虑在内,192KB的数字完全来自程序本身,当考虑到链接开销时,它会跳到4032KB,但这是共享内存,不关心 – 2012-03-27 10:34:13

+2

尝试摆脱libc:void _start(){ \t while(1){} }并使用gcc -nostdlib pause.c进行编译。这将减少内存使用量。 – strkol 2012-03-27 10:56:40

回答

10

减小栈限制会降低存储器占用:

ulimit -s 8 
+0

setrlimit将通过编程方式做同样的事情 – 2012-03-27 13:01:45

+1

不完全相同! setrlimit将为当前进程设置限制,但堆栈将被分配......所以父进程必须调用setrlimit(这就是ulimit的作用),然后用小的预分配堆栈产生新进程。如我错了请纠正我。 – strkol 2012-03-27 13:31:58

+0

啊,好点:D – 2012-03-27 13:50:26