2012-03-27 14 views
7

das folgende C-Programms Betrachten ‚pause.c‘:Wie kann ich den Speicherbedarf eines minimalen Prozesses Linux reduzieren

void main() { pause(); } 

Kompilieren dieses auf x64 Linux 3.0.0-16-generic diesen Befehl ' gcc -Os pause.c -o pause 'erzeugt eine ausführbare Datei der Größe ~ 8KB. Wenn ich diese ausführbare Datei ausführe und den genauen Speicherbedarf mit 'pmap -d PID' überprüfe, zeigt es mir, dass der private Speicher, der dem Prozess zugewiesen wird, 192 KB ist (er variiert zwischen verschiedenen Systemen normalerweise zwischen 128 KB und 192 KB).

Untersuchen des Prozesses mit Valgrind und Massif kann keine Speicherzuordnungsereignisse erkennen. Ich war skeptisch, dass die 192 KB-Zahl korrekt war, aber ich fand, dass das Starten von 5 Instanzen des "Pause" -Prozesses ungefähr 1 MB Systemspeicher verbrauchte.

Ich bin nicht in der Lage, den Ursprung dieses Speichers zu erklären, kann jemand einen Einblick geben, warum dieser Speicher zugewiesen wird und irgendwelche möglichen Aktionen, die es reduzieren könnten ?, Prost.

+0

zunächst den ELF-Überprüfung; Sie werden eine Menge Dinge darin finden (Daten/Code-Abschnitte, Debug, Kommentare, etc.). Bedenke auch, dass dein Programm gegen mindestens libc verlinkt ist; das ist ziemlich viel Platz genau dort. –

+0

Ok, die Basisgröße der Binärdatei ist 8KB, und das pmap-Dienstprogramm berücksichtigt den Linking-Overhead, die 192KB-Zahl wird nur vom Programm selbst abgeleitet, dies springt auf 4032 KB, wenn der Linking-Overhead berücksichtigt wird kein Problem –

+2

versuchen, libc loszuwerden: void _start() { \t while (1) {} } und mit gcc-nostdlib pause.c kompilieren. Dies reduziert die Speicherauslastung. – strkol

Antwort

10

die Stapelgrenze Reduzierung wird den Speicherbedarf senken:

ulimit -s 8 
+0

setrlimit wird das gleiche tun, programmatisch –

+1

Nicht genau das gleiche! setrlimit wird das Limit für den aktuellen Prozess setzen, aber der Stack wird bereits zugewiesen ... also muss der Elternprozess sattrlimit aufrufen (das ist was ulimit tut) und dann den neuen Prozess mit einem kleinen vorher zugewiesenen Stack erzeugen. Korrigiere mich, wenn ich falsch liege. – strkol

+0

ah, guter Punkt: D –

Verwandte Themen