%20en%20un%20bloque%20siempre%20elimina%20las%20asignaciones%20entre%20su%20memoria%20virtual%20y%20su%20memoria%20f%C3%ADsica%3F.png)
Digamos que queremos asignar un bloque del montón usando malloc
. Cuando se asigna una memoria de gran tamaño, malloc
se realiza una llamada mmap
interna y, para una asignación de tamaño pequeño, malloc
se realiza una llamada brk
interna.
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 malloc
llama brk
internamente.
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()
osbrk()
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:
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?
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
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.)
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.