2011-06-13 6 views
6

código relacionadas:¿Entonces malloc no invoca ningún syscall?

write(-1, "test", sizeof("test")); 
    void * p = malloc(1024); 
    void * p2 = malloc(510); 
    write(-1, "hi", sizeof("hi")); 

relacionados con la producción strace:

write(4294967295, "test\0", 5)   = -1 EBADF (Bad file descriptor) 
brk(0)         = 0x601000 
brk(0x622000)       = 0x622000 
write(4294967295, "hi\0", 3)   = -1 EBADF (Bad file descriptor) 

Estoy sorprendido dicha operación bajo nivel no implica syscall?

+2

No entiendo lo que estás pidiendo. La llamada 'malloc' invoca el' brk' syscall. – Gabe

+0

A través de la prueba encontré que 'brk' no está generado por' malloc', porque si aumento el número de 'malloc',' brk' no aumenta. – cpuer

+0

¿Está diciendo que si elimina las llamadas 'malloc', entonces las llamadas' brk' desaparecerán de la traza? – Gabe

Respuesta

3

¿Qué crees que es brk? malloc está invocando un syscall en este ejemplo, el syscall simplemente no es "malloc".

3

malloc() llama a la función brk() del sistema (en Linux/Unix) - pero solo lo llama si el montón local está agotado. Es decir. la mayoría de las implementaciones de malloc administran un montón de memoria obtenido a través de brk(), y si es demasiado pequeño o demasiado fragmentado, solicitan más a través de brk().

19

No todas las llamadas a malloc invoca un syscall. En mi escritorio linux, malloc asigna un espacio en bloques de 128 KB y luego distribuye el espacio. Entonces veré un syscall cada 100-200 malloc llamadas. En freebsd, malloc asigna bloques de 2MB. En su máquina, los números probablemente diferirán.

Si usted quiere ver en cada llamada al sistema malloc asignar grandes cantidades de memoria (malloc (10 * 1024 * 1024 * 1024))