2012-03-27 28 views
7

Considere el siguiente programa C, 'pause.c':¿Cómo puedo reducir el consumo de memoria de un proceso Linux mínimo

void main() { pause(); } 

Compilación esto en x64 Linux 3.0.0-16-genérico utilizando este comando ' gcc -Os pause.c -o pausa 'produce un ejecutable de tamaño ~ 8KB. Cuando ejecuto este ejecutable y examino su huella de memoria precisa usando 'pmap -d PID', me muestra que la memoria privada asignada al proceso es 192KB (varía entre los diferentes sistemas, entre 128KB y 192KB).

El examen del proceso utilizando valgrind y macizo no detecta ningún evento de asignación de memoria. Estaba escéptico de que la cifra de 192 KB fuera precisa, pero descubrí que al comenzar 5 instancias del proceso de 'pausa' consumía aproximadamente 1 MB de memoria del sistema.

No puedo explicar el origen de esta memoria, ¿alguien puede darnos una idea de por qué se está asignando esta memoria y las posibles acciones que podrían reducirla ?, saludos.

+0

Empezar comprobando el ejecutable ELF; encontrará muchas cosas allí (secciones de datos/códigos, depuración, comentarios, etc.). También tenga en cuenta que su programa está vinculado al menos contra libc; eso es bastante espacio justo allí. –

+0

Ok, el tamaño de base del binario es 8KB, y la utilidad pmap tiene en cuenta el overhead de enlace, la cifra 192KB se deriva únicamente del programa en sí, esto salta a 4032KB cuando se considera la sobrecarga de enlace, pero esto es memoria compartida y no es una preocupación –

+2

intente deshacerse de libc: void _start() { \t while (1) {} } y compilar con gcc -nostdlib pause.c. Esto reducirá el uso de memoria. – strkol

Respuesta

10

La reducción del límite de la pila que reducirá el consumo de memoria:

ulimit -s 8 
+0

setrlimit hará lo mismo programáticamente –

+1

¡No es exactamente lo mismo! setrlimit establecerá el límite para el proceso actual, pero la pila ya se asignará ... por lo que el proceso padre debe llamar a setrlimit (eso es lo que hace ulimit) y luego generar el nuevo proceso con una pequeña pila preasignada. Corrígeme si estoy equivocado. – strkol

+0

ah, buen punto: D –

Cuestiones relacionadas