Saltar al contenido

¿Malloc() usa brk() o mmap()?

Nuestro equipo de trabajo ha estado por horas buscando la respuesta a tu pregunta, te compartimos la soluciones y nuestro objetivo es servirte de mucha apoyo.

Si cambiamos el programa para ver dónde está el mallocla memoria es:

#include 
#include 
#include 

void program_break_test() 
  printf("%10pn", sbrk(0));

  char *bl = malloc(1024 * 1024);
  printf("%10pn", sbrk(0));
  printf("malloc'd at: %10pn", bl);

  free(bl);
  printf("%10pn", sbrk(0));



int main(int argc, char **argv) 
  program_break_test();
  return 0;

Es quizás un poco más claro que sbrk no cambiaría El recuerdo que nos da malloc está siendo mapeado en una ubicación muy diferente.

También podrías usar strace en Linux para ver qué llamadas al sistema se realizan y descubrir que malloc esta usando mmap para realizar la asignación.

malloc no se limita a usar sbrk para asignar memoria. Podría, por ejemplo, utilizar mmap mapear un gran MAP_ANONYMOUS bloque de memoria; normalmente mmap asignará una dirección virtual bien alejada del segmento de datos.

También hay otras posibilidades. En particular, malloc, al ser una parte central de la biblioteca estándar, no se limita a las funciones de la biblioteca estándar; puede hacer uso de interfaces específicas del sistema operativo.

Si utiliza malloc en su código, llamará brk() al principio, asignó 0x21000 bytes del montón, esa es la dirección que imprimió, por lo que la Pregunta 1: la siguiente mallocLos requisitos de s se pueden cumplir desde el espacio preasignado, por lo que estos mallocs en realidad no llamaron brkes una optimización en malloc. Si la próxima vez que desea malloc el tamaño más allá de ese límite, un nuevo brk será llamado (si no es más grande que el mmap límite).

Si sostienes algún titubeo y forma de progresar nuestro post eres capaz de escribir un comentario y con mucho gusto lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *