Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

550
Vistas
Diferencia entre las funciones brk() , sbrk() y realloc()

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.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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í:

  1. La estructura de datos básica para nuestro malloc primitivo es una lista enlazada.
  2. Cada elemento de la lista en la lista contiene:
    1. El tamaño del bloque
    2. Un puntero al siguiente elemento.
    3. Una bandera si el bloque está en uso
    4. Una bandera si es el último elemento
    5. Una matriz de bytes con el tamaño dado
  3. En cada llamada, malloc revisa la lista y verifica cada bloque
    1. Si el bloque está marcado como "no en uso"
    2. Si el campo de tamaño del elemento de la lista es como máximo tan grande como el tamaño necesario
  4. Si malloc encuentra un bloque de este tipo, hará lo siguiente:
    1. Marcar el elemento de la lista como usado
    2. Ajustar el campo de tamaño en el elemento de la lista
    3. Si hay suficiente espacio, agregue un elemento de lista después del elemento, apuntando al siguiente elemento en la lista (si corresponde)
    4. Devuelve un puntero a la matriz de bytes del elemento de la lista que encontró
  5. Si malloc no encuentra dicho elemento de la lista, lo hará
    1. Llame a brk para aumentar la memoria utilizable que obtuvimos del kernel
    2. Agregue un nuevo elemento al final de la lista, establezca el tamaño al tamaño deseado
    3. Marque este elemento como en uso Y como el último elemento
    4. Devuelve un puntero a la matriz de bytes de la entrada de la lista recién creada

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) .

over 4 years ago · Santiago Trujillo Denunciar

0

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).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda