¿Qué sucede en el kernel durante malloc?

4 minutos de lectura

¿Que sucede en el kernel durante malloc
liv2hak

Me hicieron esta pregunta durante una entrevista. Lo que querían saber era cuando el usuario llama a malloc(4) para asignar 4 bytes de memoria, ¿cómo responde el sistema operativo (Linux)? ¿Qué subsistema responde a esta llamada al sistema?

Le dije que malloc() será atendido por el subsistema de administración de memoria. La implementación de malloc() revisará la lista de memoria libre (memoria física), la llamaremos lista libre y encontrará un fragmento apropiado que sea mayor o igual a 4 bytes. Una vez que encuentre dicho fragmento, se eliminará de la lista libre y se agregará a una lista usada. Luego, esa memoria física se asignará a la estructura vma del montón de procesos. No parecía estar muy satisfecho con esta respuesta. ¿Cómo encaja el sistema de amigos en esto? Cualquier ayuda sería muy apreciada.

  • entonces está bastante enojado. malloc() se implementa en modo usuario.

    – Chris Becke

    19 de abril de 2011 a las 12:10

  • @Chris: Mayormente. malloc podría terminar llamando a sbrk.

    –Tom Anderson

    19 de abril de 2011 a las 12:28

  • @Chris: No necesariamente. La respuesta dada aquí implica que malloc() asigna de la memoria física que es incorrecta.

    – JeremyP

    19 de abril de 2011 a las 12:29


  • Además, ‘sistema operativo’ no es lo mismo que ‘kernel’; Creo que, cuando se habla de Unix, es justo interpretar ‘sistema operativo’ en el sentido de ‘núcleo, cargador de arranque, libc y programas fundamentales de modo de usuario como init, getty, inicio de sesión y amigos’. Dependiendo exactamente de cómo el entrevistador formuló su pregunta, hablar sobre lo que hace el asignador en modo de usuario podría ser una respuesta justa.

    –Tom Anderson

    19 de abril de 2011 a las 12:31

  • Supongo que no está satisfecho con su mezcla entre la llamada de usuario malloc y la función del núcleo malloc. Lo que describiste debería ser la funcionalidad del kernel malloc.

    – CCNA

    2 de febrero de 2016 a las 17:39

1646755989 974 ¿Que sucede en el kernel durante malloc
nos

Cuando las aplicaciones del espacio del usuario llaman malloc(), esa llamada no está implementada en el kernel. En cambio, es una llamada de biblioteca (glibc implementada o similar).

La versión corta es que el malloc implementación en glibc obtiene memoria del brk()/sbrk() llamada al sistema o memoria anónima a través de mmap(). Esto le da a glibc una gran porción de memoria contigua (con respecto a las direcciones de memoria virtual), que el malloc implementación más rebanadas y dados en trozos más pequeños y entrega a su aplicación.

Aquíes un pequeño malloc implementación que le dará la idea, junto con muchos, muchos enlaces.

Tenga en cuenta que a nada le importa la memoria física todavía; eso lo maneja el sistema de memoria virtual del kernel cuando el segmento de datos del proceso se modifica a través de brk()/sbrk() o mmap()y cuando se hace referencia a la memoria (mediante una lectura o escritura en la memoria).

Para resumir:

  1. malloc() buscará en sus partes de memoria administradas para ver si hay una parte de memoria sin usar que satisfaga los requisitos de asignación.
  2. Fallando en eso, malloc() intentará ampliar el segmento de datos de proceso (a través de sbrk()/brk() o en algunos casos mmap()). sbrk() termina en el núcleo.
  3. los brk()/sbrk() llamadas en el núcleo ajustan algunos de los desplazamientos en el struct mm_struct del proceso, por lo que el segmento de datos del proceso será más grande. Al principio, no habrá memoria física asignada a las direcciones virtuales adicionales que proporcionó la extensión del segmento de datos.
  4. Cuando esa memoria no mapeada se toca por primera vez (probablemente una lectura/escritura por parte del malloc implementación) un controlador de fallas se activará y atrapará al kernel, donde el kernel asignará memoria física a la memoria no asignada.

  • ¿Podría explicar cómo sucede el Punto 4? Todo lo que quiero saber es cómo se asigna finalmente la memoria física y qué parte del código del kernel hace eso. Gracias.

    – Arjun Bora

    7 de marzo de 2016 a las 0:28

  • @ArjunBora No, ese es un tema bastante extenso. Por favor, haga una pregunta por separado en su lugar.

    – nos

    7 marzo 2016 a las 8:00


¿Que sucede en el kernel durante malloc
jweyrich

malloc no tratar directamente con la memoria física. Se trata de memoria virtual paginada – aunque no estoy seguro de si es cierto para todas las arquitecturas que existen.

Cuando su programa intenta asignar memoria y la lista libre no contiene un fragmento de tamaño igual o mayor que el tamaño solicitado, se asigna una página completamente nueva. El tamaño de la página depende de la arquitectura (4096 bytes en x86). La asignación de páginas es algo que solo el kernel puede realizar, por lo tanto, un malloc llamada puede causar una llamada al sistema. Luego, la nueva dirección se agrega a la lista libre y malloc manipula la lista libre de acuerdo con su implementación (consulte glibc, por ejemplo).

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad