Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

561
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!