2012-03-27 11 views
7

Rozważmy następujący program C „pause.c”:W jaki sposób można zmniejszyć zużycie pamięci z minimalną procesu Linux

void main() { pause(); } 

Kompilacja to na x64 Linux 3.0.0-16-generic poleceniem ' gcc -Os pause.c -o pause 'tworzy plik wykonywalny o rozmiarze ~ 8KB. Po uruchomieniu tego pliku wykonywalnego i sprawdzeniu jego dokładnego śladu pamięci za pomocą "pmap -d PID", pokazuje mi to, że pamięć prywatna przydzielona do procesu to 192 KB (jest różna w różnych systemach, zwykle pomiędzy 128 KB a 192 KB).

Badanie procesu za pomocą valgrind i massif nie wykrywa żadnych zdarzeń alokacji pamięci. Byłem sceptyczny, że wynik 192KB był dokładny, ale odkryłem, że od rozpoczęcia 5 wystąpień procesu "pauzy" zużyłem około 1 MB pamięci systemowej.

Nie jestem w stanie wyjaśnić pochodzenia tej pamięci, czy ktoś może się dowiedzieć, dlaczego ta pamięć jest przydzielana i jakie potencjalne działania mogą ją zmniejszyć ?, okrzyki.

+0

Zacznij od sprawdzenia wykonywalny ELF; znajdziesz tam wiele rzeczy (sekcje danych/kodu, debugowanie, komentarze itp.). Pamiętaj również, że twój program jest powiązany z przynajmniej libc; to dość dużo miejsca. –

+0

Ok, podstawowy rozmiar pliku binarnego wynosi 8 KB, a narzędzie pmap uwzględnia obciążenie łączące, dane 192 KB wynikają wyłącznie z samego programu, to przeskakuje do 4032 KB, gdy uwzględniane jest obciążenie łącza, ale jest to pamięć dzielona i nie martw się, –

+2

spróbuj pozbyć się libc: void _start() { \t while (1) {} } i skompiluj z gcc -nostdlib pause.c. Spowoduje to zmniejszenie zużycia pamięci. – strkol

Odpowiedz

10

Zmniejszenie limitu stosu obniży zużycie pamięci:

ulimit -s 8 
+0

setrlimit zrobi to samo programowo –

+1

Nie dokładnie to samo! setrlimit ustawi limit dla bieżącego procesu, ale stos zostanie przydzielony już ... więc proces nadrzędny musi wywołać setrlimit (to właśnie robi ulimit), a następnie odrodzić nowy proces przy użyciu małego, wcześniej przydzielonego stosu. Popraw mnie, jeśli się mylę. – strkol

+0

ah, dobry punkt: D –

Powiązane problemy