brk y sbrk son llamadas básicas del sistema de gestión de memoria que se utilizan en Unix y sistemas operativos similares a Unix para controlar la cantidad de memoria asignada al segmento de datos del proceso . [1] Estas funciones se suelen llamar desde una función de biblioteca de gestión de memoria de nivel superior, como malloc . En el sistema Unix original, brk y sbrk eran las únicas formas en que las aplicaciones podían adquirir espacio de datos adicional; versiones posteriores permitieron que esto también se hiciera usando la llamada mmap . [2] [3]
Descripción
Las llamadas brk y sbrk cambian dinámicamente la cantidad de espacio asignado para el segmento de datos del proceso de llamada. El cambio se realiza reiniciando la interrupción del programa del proceso, que determina el espacio máximo que se puede asignar. La interrupción del programa es la dirección de la primera ubicación más allá del final actual de la región de datos. La cantidad de espacio disponible aumenta a medida que aumenta el valor de interrupción. El espacio disponible se inicializa a un valor de cero, a menos que el salto se reduzca y luego se aumente, ya que puede reutilizar las mismas páginas de alguna manera no especificada. El valor de interrupción se puede redondear automáticamente a un tamaño apropiado para la arquitectura de administración de memoria . [4]
sbrk y brk se consideran heredados incluso según los estándares de 1997 ( Especificación única de UNIX v2 o POSIX.1-1998). [5] Se eliminaron en POSIX.1-2001. [6]
Comportamiento y firmas de funciones
#include int brk ( void * end_data_segment ); void * sbrk ( incremento intptr_t );
sbrk se usa para ajustar el valor de interrupción del programa agregando un tamaño posiblemente negativo, mientras que brk se utiliza para establecer el valor de ruptura en el valor de un puntero. Establezca el parámetro de incremento en cero para recuperar el valor actual de la interrupción del programa.
Una vez completado con éxito, el La subrutina brk devuelve un valor de 0 y la La subrutina sbrk devuelve el valor anterior de la interrupción del programa (si se aumenta el espacio disponible, este valor anterior también apunta al inicio de la nueva área). Si alguna de las subrutinas no tiene éxito, se devuelve un valor de -1 y el La variable global errno se establece para indicar el error. [5]
No todos los sistemas similares a Unix consideran el concepto de que el usuario controle el segmento de datos. La implementación de Mac OS X de sbrk es una emulación y tiene una asignación máxima de 4 megabytes. En la primera llamada, se asigna un área exactamente de este tamaño para contener el segmento simulado. Cuando se alcanza este límite, se devuelve −1 y el errno está configurado en ENOMEM . brk siempre errores. [7]
Códigos de error
El error ENOMEM se establece y el espacio asignado permanece sin cambios si uno o más de los siguientes son verdaderos:
- El cambio solicitado asigna más espacio del permitido por un máximo impuesto por el sistema.
- El cambio solicitado establece el valor de interrupción en un valor mayor o igual que la dirección de inicio de cualquier segmento de memoria compartida adjunto .
Ver también
Referencias
- ^ "Conceptos de memoria de proceso" . Fundación de Software Libre . Consultado el 9 de octubre de 2015 .
- ^ "Un nuevo malloc (3) para OpenBSD" (PDF) . Consultado el 13 de junio de 2018 .
- ^ "Gestión de memoria POSIX" . blog.pr4tt.com .
- ^ X / Open CAE Specification, System Interfaces and Headers (PDF) (2 ed.). X / Open Company Ltd., Reino Unido, septiembre de 1994. p. 64 . Consultado el 9 de octubre de 2015 .
- ^ a b "brk, sbrk - cambio de asignación de espacio (LEGACY)" . La especificación Single UNIX ®, versión 2 . 1997 . Consultado el 30 de noviembre de 2019 .
- ^ - Manual del programador de Linux - Llamadas al sistema
- ^ "BRK.c" .