2010-07-09 13 views
13

Cuando hablo sobre la memoria de un proceso, escuché cosas como memoria de código y memoria de datos.¿Cómo se maneja la memoria del código?

Y para la memoria de datos, hay 2 mecanismos principales de administración, pila y montón.

Me pregunto cómo es la memoria de código administrado? ¿Y quién lo maneja?

Disculpe si mi declaración no es tan clara.

Gracias.

Respuesta

17

Recomiendo http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory (y los demás artículos relacionados con la memoria) si está interesado en obtener más información sobre los detalles de la gestión de memoria del proceso.

memoria de código = segmento de texto

Aviso cómo el espacio de direcciones es de 4 GB. Cuando el kernel crea un proceso, le da memoria virtual. A continuación se muestra un ejemplo de un sistema operativo de 32 bits. El kernel gestiona qué direcciones se asignan a la RAM real a través del procesador MMU. Entonces, el kernel y la MMU administran la memoria de código, del mismo modo que administran todo el espacio de direcciones de un proceso.

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

enlace muy bueno ... – wrapperm

+0

I segundo wrapperm. :) – smwikipedia

+2

El diseño generalmente se establece (y administra) por el vinculador en lugar del kernel.El kernel simplemente lee la información en la imagen ejecutable y configura el mapa de memoria en consecuencia. El enlazador dinámico se correlacionará si el ejecutable así lo especifica (lo cual es válido para ejecutables dinámicamente vinculados) y maneja muchas cosas. Puede considerar al vinculador como parte del sistema operativo, pero puede crear un enlazador personalizado que haga casi lo que desee, –

2

Es administrado por el sistema operativo. Cuando se ejecuta un programa, su código se carga desde un archivo ejecutable a alguna dirección de memoria. Dependiendo de la naturaleza del programa, algunos cambios se aplican a las secciones de códigos, p. saltos a las bibliotecas vinculadas dinámicamente se resuelven.

Según lo propuesto por Space_C0wb0y, consulte en.wikipedia.org/wiki/Dynamic_linker para obtener detalles sobre lo que está sucediendo.

+1

Revise este artículo de wikipedia acerca de la carga dinámica para obtener información sobre lo que está sucediendo: http://en.wikipedia.org/wiki/Dynamic_linker –

+0

Gracias Space_C0wb0y, ese enlace es útil. – smwikipedia

0

El sistema operativo proporciona llama así llamadas al sistema para asignar dinámicamente la memoria (malloc, libre, etc.), sino que también proporciona el mecanismo para cargar y ejecutar su programa.

Cuando el programa carga el programa, el segmento de texto (memoria de códigos) está configurado y la memoria estáticamente asignada en su programa está disponible de inmediato. A medida que su código llama a funciones, las variables (estáticamente asignadas) en sus funciones se asignan en la pila y su memoria asignada dinámicamente (usando malloc() por ejemplo) se asigna en el montón. Durante el tiempo que su programa se ejecute, es su responsabilidad (la del programador) administrar la memoria (la falta de hacerlo dará lugar a fugas de memoria y eventualmente hará que un programa de ejecución prolongada se quede sin memoria y se bloqueará, o en extremo los casos, dependiendo del sistema operativo, llevan consigo todo el sistema operativo).

Ver también este artículo: http://www.maxi-pedia.com/what+is+heap+and+stack

+0

El kernel no está administrado por el kernel en la mayoría de los sistemas operativos. Normalmente es un componente puramente de modo de usuario que reside en algún tipo de biblioteca de tiempo de ejecución (por ejemplo, ntdll, libc) que luego realiza llamadas al sistema a funciones de manejo de página de nivel inferior (por ejemplo, NtAllocateVirtualMemory). – wj32

4

La memoria de código no necesita la gestión, ya que no cambia. Cuando se carga un archivo ejecutable en el espacio de direcciones, el código solo se lee desde el archivo ejecutable en la memoria. De hecho, en los sistemas operativos modernos, el segmento de código es solo una memoria mapeada al archivo ejecutable.

+1

Bueno, bueno ... depende del sistema operativo. Según recuerdo del libro de A. Silberschatz sobre sistemas operativos, algunas arquitecturas pueden mover el código, pero debe ser transparente para el programador. También cargar/descargar bibliotecas dinámicas implica un poco de administración de la memoria del código. – doc

+0

@doc: cierto, pero varía entre el sistema operativo y la arquitectura. Lo que dije antes se basa principalmente en hurgar con el formato de archivo ejecutable OS X. – JeremyP

Cuestiones relacionadas