2012-03-27 103 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

相關問題