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.
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. –
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ę, –
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