La llamada al sistema sbrk
mueve el "borde" del segmento de datos. Esto significa que mueve un borde de un área en la que un programa puede leer/escribir datos (permitiéndole crecer o reducirse, aunque AFAIK no malloc
realmente le da segmentos de memoria al kernel con ese método). Aparte de eso, también hay mmap
que se utiliza para asignar archivos a la memoria, pero también se usa para asignar memoria (si necesita asignar memoria compartida, mmap
es cómo lo hace).
Tiene dos métodos para obtener más memoria del kernel: sbrk
y mmap
. Hay varias estrategias sobre cómo organizar la memoria que tiene del kernel.
Una forma ingenua es dividirla en zonas, a menudo llamadas "cubos", que están dedicados a ciertos tamaños de estructura. Por ejemplo, una implementación de malloc
podría crear divisiones para estructuras de 16, 64, 256 y 1024 bytes. Si pide malloc
para darle memoria de un tamaño dado, redondea ese número al siguiente tamaño de cubo y luego le da un elemento de ese cubo. Si necesita un área más grande, malloc
podría usar mmap
para asignar directamente con el kernel. Si el contenedor de un determinado tamaño está vacío, malloc
podría usar sbrk
para obtener más espacio para un nuevo contenedor.
Existen varios diseños de malloc
y no existe una manera verdadera de implementar malloc
, ya que necesita hacer un compromiso entre velocidad, sobrecarga y evitar la fragmentación/efectividad del espacio. Por ejemplo, si una cubeta se queda sin elementos, una implementación podría obtener un elemento de una cubeta más grande, dividirlo y agregarlo a la cubeta que se quedó sin elementos. Esto sería bastante eficiente desde el punto de vista del espacio, pero no sería posible con cada diseño. Si acaba de obtener otro cubo a través de sbrk
/mmap
que podría ser más rápido y más fácil, pero no tan eficiente en el uso del espacio. Además, el diseño debe tener en cuenta, por supuesto, que "libre" necesita dejar espacio disponible para malloc
de alguna manera. No solo entregas la memoria sin reutilizarla.
Si está interesado, la OpenSER/Kamailio SIP proxy tiene dos implementaciones malloc
(que necesitan su propio porque hacen un uso intensivo de la memoria compartida y el sistema malloc
no es compatible con memoria compartida). Ver: https://github.com/OpenSIPS/opensips/tree/master/mem
entonces también podría echar un vistazo a la GNU libc malloc
implementation, pero que uno es muy complicado, IIRC.
Usa la fuente, Boda Cydo. http://ftp.gnu.org/gnu/glibc/ – msw
Creo que este enlace responde su pregunta hasta cierto punto http://stackoverflow.com/questions/1119134/how-malloc-and-free-work – Rishabh