¿El uso de free() en un bloque siempre elimina las asignaciones entre su memoria virtual y su memoria física?

¿El uso de free() en un bloque siempre elimina las asignaciones entre su memoria virtual y su memoria física?

Digamos que queremos asignar un bloque del montón usando malloc. Cuando se asigna una memoria de gran tamaño, mallocse realiza una llamada mmapinterna y, para una asignación de tamaño pequeño, mallocse realiza una llamada brkinterna.

Tenga en cuenta que el montón es continuo cuando se usa sbrk()obrk()

Digamos que mi asignación es de tamaño relativamente mediano y mallocllama brkinternamente.

digamos que llamomalloc(small); malloc(medium); free(medium)

según este artículoLa historia del confuso conjunto de formas de bajo nivel de Unix para asignar memoria

Si liberó() los elementos correctos para crear un bloque de espacio no utilizado en la parte superior de la pausa, malloc() y compañía podrían eventualmente llamar brk()o sbrk()reducir la pausa del programa y devolver la memoria al sistema operativo.

Dado que el bloque medio libre es el último (el bloque pequeño asignado es el penúltimo), la memoria se devolverá al sistema operativo.

A continuación se muestran mis preguntas:

  1. Según tengo entendido, la afirmación "la memoria se devolverá al sistema operativo" es: las asignaciones del bloque libre entre la memoria virtual y la memoria física se eliminan, otros procesos pueden usar la memoria física que originalmente estaba ocupada por este bloque libre. ¿Es correcto mi entendimiento?

  2. esta vez llamo malloc(medium); malloc(small); free(medium) Dado que al final todavía hay un bloque asignado, ¿todavía existe el mapeo del bloque libre entre la memoria virtual y la memoria física? ¿Pueden otros procesos utilizar la memoria física de este bloque libre?

Respuesta1

  1. Existen otros mecanismos mediante los cuales la memoria física se puede reutilizar para otros fines, en particular el intercambio en este caso: si la presión de la memoria es lo suficientemente alta, la memoria física de un proceso se puede intercambiar para dejar espacio para otra cosa.

    Hoy en día, el principal beneficio de devolver memoria al sistema operativo es que el sistema operativo luegosabeque la memoria no se volverá a utilizar y, por lo tanto, puede descartar la memoria física correspondiente sin ninguna ceremonia adicional. (Vermi respuesta a la pregunta SO relacionadapara detalles.)

  2. Las asignaciones entre la memoria virtual y la memoria física son algo fluidas; consulte el punto anterior sobre el intercambio. En su escenario, el espacio de direcciones virtuales asignado al proceso no puede cambiar, porque la interrupción del programa no se puede reducir y el núcleo debe asumir que cualquier memoria física asignada a él es "valiosa" y contiene datos importantes. Pero eso no significa que el núcleo no pueda reutilizar la memoria física; sólo significa que debe garantizar, al hacerlo, que los datos almacenados allí no se pierdan.

información relacionada