2012-03-27 16 views
7

Si consideri il seguente programma C, 'pause.c':Come posso ridurre il footprint di memoria di un processo Linux minimo

void main() { pause(); } 

Compilazione questo su x64 Linux 3.0.0-16-generico utilizzando il comando ' gcc -Os pause.c -o pause 'produce un eseguibile di dimensioni ~ 8 KB. Quando eseguo questo eseguibile ed esamino il suo preciso footprint di memoria usando 'pmap -d PID', mi mostra che la memoria privata allocata al processo è 192KB (varia tra i diversi sistemi di solito, tra 128KB e 192KB).

Esaminando il processo utilizzando valgrind e il gruppo non viene rilevato alcun evento di allocazione della memoria. Ero scettico sul fatto che la cifra di 192KB fosse accurata, ma ho scoperto che l'avvio di 5 istanze del processo di "pausa" comportava circa 1 MB di memoria di sistema.

Non riesco a spiegare l'origine di questa memoria, qualcuno può fornire alcune informazioni sul motivo per cui viene assegnata questa memoria e su eventuali azioni potenziali che potrebbero ridurlo ?, applausi.

+0

Iniziare controllando l'eseguibile ELF; troverai molte cose lì dentro (sezioni di dati/codice, debug, commenti, ecc.). Ricorda inoltre che il tuo programma è collegato almeno con libc; c'è abbastanza spazio lì. –

+0

Ok, la dimensione base del file binario è 8KB e l'utilità pmap prende in considerazione l'overhead di collegamento, la cifra di 192KB è derivata esclusivamente dal programma stesso, salta a 4032 KB quando viene considerato l'overhead del collegamento, ma questa è memoria condivisa e non è una preoccupazione –

+2

provare a sbarazzarsi di libc: void _start() { \t while (1) {} } e compilare con gcc -nostdlib pause.c. Ciò ridurrà l'utilizzo della memoria. – strkol

risposta

10

riduzione del limite pila abbasserà l'occupazione di memoria:

ulimit -s 8 
+0

setrlimit farà la stessa cosa in modo programmatico –

+1

Non esattamente la stessa cosa! setrlimit imposterà il limite per il processo corrente, ma lo stack sarà già allocato ... quindi il processo genitore deve chiamare setrlimit (questo è ciò che ulimit fa) e quindi generare il nuovo processo con un piccolo stack preallocato. Correggimi se sbaglio. – strkol

+0

ah, buon punto: D –

Problemi correlati