tabla sistemas segmentacion paginas paginacion operativos memoria marcos gestion asignacion administracion linux memory process operating-system linux-kernel

linux - sistemas - Rango de direcciones virtuales de un proceso



segmentacion en linux (3)

En resumen: ¿el espacio de direcciones virtuales de un proceso es contiguo?

Necesito saber algo sobre la dirección virtual asignada a un proceso por el kernel. Por favor corrígeme si me equivoco a medida que procedo.

En la creación del proceso, el kernel asignó memoria virtual al proceso y almacena los inicios y los extremos de las direcciones virtuales de los diferentes segmentos del proceso en el mm_struct en task_struct .

Ahora diga que el proceso se ha agotado y que necesita aumentar el tamaño del montón. Llama a brk() .

Si el rango de direcciones virtuales es contiguo, ¿el trozo recientemente asignado de almacenamiento está fuera del rango asignado originalmente para este proceso? O se asigna de una manera que el nuevo fragmento es adyacente al original. Qué pasa si no hay espacio para eso (porque el segmento mapeado de memoria está allí). ¿cómo se hace un seguimiento de esto? Si el rango de direcciones virtuales no es contiguo, ¿cómo vm_struct un seguimiento de los diferentes fragmentos de los rangos de direcciones para el montón (o cualquier otro segmento)?

¿Puedes aclarar mi concepto sobre eso?


El espacio de direcciones virtuales no es contiguo. Vea la salida de cat /proc/<pid>/mem .

Al iniciar un proceso, el kernel asigna varias asignaciones para el enlazador dinámico y para el proceso mismo. Después, el vinculador dinámico asigna más asignaciones a través de mmap() , y el proceso puede asignar más asignaciones a través de mmap() y extender el brk() dinámico a través de brk() . malloc() en dlmalloc y derivados utiliza brk() para asignaciones más cortas que un umbral y mmap() para asignaciones mayores o iguales a ese umbral (alrededor de 128 K IIRC).

En cualquier caso, cuando se llama a mmap() , el núcleo generalmente asigna la memoria lejos del montón, por lo que generalmente hay suficiente espacio para extender el montón. Si no queda espacio virtual para extender el montón, brk() fallará.


gracias .. después de pasar por las dichas literaturas según mi entendimiento,

el espacio de direcciones virtuales no es contiguo a lo largo del proceso, ni tampoco a lo largo de un segmento de memoria determinado. y los diferentes fragmentos de rangos de direcciones virtuales se gestionan en el kernel utilizando un árbol AVL de vm_area_struct ( áreas de memoria virtual ). por lo tanto, fácilmente agregar y eliminar fragmentos de áreas de memoria virtual a la task_struct del proceso. ref: Memoria virtual . pero las áreas de memoria virtual en sí son contiguas.

es decir, en efecto, task_struct contiene un puntero a mm_struct que contiene un puntero a las cabezas de los árboles AVL (un árbol por cada región de memoria). los nodos del árbol no son más que vm_area_struct s, que tiene punteros de inicio y fin para marcar el inicio y el final de las áreas de memoria virtual

muchas gracias


No, el espacio de direcciones virtuales de un proceso no es necesariamente contiguo. En los viejos tiempos, un proceso obtenía memoria a través de brk , lo que de hecho forzaba al montón de procesos a ser una zona contigua de memoria. Hoy en día, la asignación de memoria se realiza a través de mmap , que puede manipular la memoria virtual del proceso página por página.

Si tiene curiosidad sobre el lado kernel de las cosas, le recomiendo dos referencias:

Si desea explorar su sistema, puede ver la asignación de memoria de cada proceso en /proc/$pid/maps . Consulte ¿Cómo leo de / proc / $ pid / mem en Linux? para más información.