Como sé, las funciones brk() , sbrk() se usan para reasignar la memoria. Pero, ¿en qué se diferencian de la función realloc()? Dame los ejemplos de codificación.
brk
y sbrk
son llamadas al sistema (implementadas en el kernel) mientras que malloc
, free
, realloc
son funciones de biblioteca en el espacio del usuario. Por lo tanto, las funciones malloc
, etc. usan brk
y sbrk
internamente, pero brindan una funcionalidad adicional (consulte man(2) para obtener más detalles sobre brk
y man(3) para obtener más detalles sobre malloc
).
brk
solo le dice al kernel cuánta memoria quiere usar su programa, dándole al kernel un puntero a la ubicación de memoria virtual más grande que su programa puede usar. Pero solo tienes exactamente una gran parte de la memoria.
malloc
te ayuda a subdividir este enorme bloque de memoria en partes más pequeñas.
El código de ejemplo no tiene mucho sentido aquí, porque brk
y malloc
funcionan en diferentes niveles. Pero podría pensar cómo implementaría una versión muy simple (y no segura para subprocesos) de malloc
y free
y dónde usaría brk
allí:
brk
para aumentar la memoria utilizable que obtuvimos del kernel Y como comentó @BasileStarynkevitch en su comentario, como alternativa a brk
, también podría usar mmap
(con fd=-1
y flags=MAP_PRIVATE|MAP_ANONYMOUS
) para reservar un solo bloque de memoria respaldado por el archivo de intercambio. Para obtener detalles sobre mmap, consulte man(2) .
A nivel del sistema operativo (al menos en el modelo Unix), su programa tiene una gran región de memoria para el texto del programa, datos inicializados y no inicializados, y el "montón", para datos asignados dinámicamente. (La pila está separada). Puede ajustar el tamaño de esa región usando brk
y sbrk
, pero no puede reorganizarla y siempre es contigua. La gran mayoría de los programas que realizan asignación de memoria dinámica requieren algo más flexible.
malloc
, free
y realloc
son funciones de la biblioteca C que le brindan algo más flexible. Debajo, obtienen memoria del sistema operativo llamando a brk
y/o sbrk
, pero luego realizan un procesamiento adicional para permitirle asignar (a) cualquier cantidad de fragmentos de (b) diferentes tamaños y que puede (c) devolver individualmente al piscina cuando haya terminado con ellos y de paso (d) cambiar el tamaño.
Pero cuando devuelve la memoria al grupo con free
, generalmente vuelve al grupo del que se extraerán las llamadas futuras a malloc
por parte de su programa; la memoria generalmente no se devuelve al sistema operativo.
(Lo siento por no proporcionar ningún código de ejemplo; no tengo tiempo para eso en este momento).