memory - procesos - ¿Por qué la memoria se divide en pila y montón?
procesos de la memoria (3)
La memoria es la misma para ambos, pero la pila y el montón son 2 estructuras de datos diferentes que son útiles para diferentes propósitos.
Stack es una abstracción muy primitiva que necesita cualquier microprocesador para ejecutar instrucciones en un par de operandos (generalmente registros de procesador o direcciones de memoria).
El montón es un área de memoria de asignación general donde generalmente se desea almacenar datos que no están vinculados a la pila, es decir, su tiempo de vida es más largo que si se almacenan en la pila, o dicho de otra manera, los datos van a ser accesados por diferentes porciones de código.
Posible duplicado:
Qué y dónde están la pila y el montón
Tengo un par de preguntas sobre la pila y el montón.
Lo básico es saber que la pila es más rápida que el montón, pero es limitada. (Corrígeme si estoy equivocado).
Sin embargo, siempre me he preguntado cómo funcionan la pila y el montón exactamente. RAM es solo un pedazo de memoria, no está dividido en ''pila'' y ''montón'' (¿o no?). Si es así, ¿por qué dividimos la memoria en pila y montón en primer lugar?
Los sistemas operativos podrían simplemente permitirnos asignar todo en la pila -> todo va más rápido -> mundo feliz?
Estoy bastante seguro de que ese no es el caso. ¿¡Pero por qué!? ¿Alguien puede darme una respuesta en profundidad?
Lo siento si esta publicación es un duplicado de alguna publicación hecha por alguna persona, hay tantas relacionadas con la pila y el montón, no pude encontrar la pregunta exacta que tenía. Si usted sabe uno, adelante y vincule.
No solo puede usar una pila, ya que una pila requiere una orden de asignación y desasignación de último ingreso-entrada-primero (es decir, solo puede desasignar los datos asignados más nuevos, en una pila no puede desasignar algunos datos antiguos y mantener algunos más nuevos).
En realidad, puedes deshacerte de la pila (solo manteniendo el montón). Consulte el documento de Appel La recolección de basura puede ser más rápida que la asignación de pila y su compilación con el libro de continuación .
Y heap no tiene un significado bien definido (que no sea "memoria asignada dinámicamente que no está en la pila"). En realidad, en los sistemas Linux, la asignación de una gran cantidad de memoria mediante la llamada al sistema mmap es bastante rápida (pero las implementaciones malloc
intentan evitar mmap
y prefieren reutilizar free
memoria d- free
). El problema es la asignación de zonas de memoria pequeña.
Y lea más sobre las técnicas de recolección de basura . En C o C ++, puede usar GC de Boehm
Una pila es a menudo útil, especialmente para llamadas a funciones recursivas. Es tan útil (por ejemplo, en C) que los procesadores de hoy en día generalmente tienen un registro de puntero de pila dedicado (utilizado por las instrucciones de la máquina CALL & RET para llamar y devolver). Pero éste no siempre fue el caso; en algunos procesadores (por ejemplo, IBM360), el puntero de la pila es un registro convencional, no uno codificado.
Ver también this y otras respuestas (y otras) sobre el espacio de direcciones virtuales .
Pila: la pila se utiliza como una especie de almohadilla temporal para usar en el bloque de código que se está ejecutando actualmente, y en cualquier bloque llamado actual, y en cualquier bloque que se llame así, y así sucesivamente. Cuando sale el bloque actual, se olvidan las variables locales que estaba usando. Como su nombre indica, la pila se usa de la última en entrar, primero en salir.
Uno de los usos más importantes de la pila es realizar un seguimiento de la cadena de llamadas actual. Cuando una función llama a otra, la persona que llama empuja la dirección de la siguiente instrucción (la dirección de retorno) a la pila. A medida que cada función sale, aparece la dirección de retorno de la persona que llama fuera de la pila y continúa ejecutando el código comenzando en esa dirección. También se usa para comunicar parámetros de funciones y valores de retorno entre el que llama y el que recibe la llamada.
Heap: El montón es diferente, no tiene un orden particular. Si desea asignar memoria en un bloque de código y hacer que esa memoria permanezca más allá del final del bloque, la asigna al montón. Por supuesto, también necesitará almacenar un puntero / referencia en algún lugar para que otro código pueda encontrar esa memoria; la mayoría de los idiomas proporcionan alojamiento que.
Velocidad: las diferencias de velocidad no se deben a ninguna propiedad de la memoria en sí misma, como dices en tu pregunta, tanto la pila como el montón suelen habitar en la misma memoria física. Asignar espacio en la pila es rápido debido a la naturaleza LIFO de las pilas: si empujas algo sobre la pila, solo hay un lugar donde puede terminar. Por el contrario, la asignación de un bloque en el montón requiere encontrar una región libre contigua lo suficientemente grande en la memoria. Una asignación de pila puede ser tan rápida como una sola instrucción; una asignación de montón requiere una llamada a una función de asignación de memoria como malloc()
.
Static v. Dynamic: la asignación de memoria en el montón es dinámica: la asignación de un bloque y el tamaño del bloque se pueden determinar de acuerdo con la entrada que el programa recibe mientras se está ejecutando. Las regiones de memoria asignadas en el montón pueden incluso cambiarse de tamaño si es necesario. También es posible asignar dinámicamente memoria en la pila (consulte la función de biblioteca estándar C alloca()
), pero esa memoria se perderá tan pronto como salga la función actual. Las asignaciones de pila generalmente son estáticas: el compilador determina cuánto espacio se necesita para los parámetros (sin registro), los datos de retorno y las variables locales, y genera código para reservar el espacio necesario en la pila cuando se llama a la función.
Ejemplo: imagine que está creando un procesador de textos. No puede saber con anticipación qué tan grande será el documento, ni cuántos documentos se usarán al mismo tiempo. Al mismo tiempo, desea que los documentos del usuario permanezcan en la memoria siempre que el usuario quiera mantenerlos abiertos. Si intenta asignar memoria para los documentos en la pila, le resultará difícil tener más de uno abierto a la vez, y deberá crear una sola función que cree, edite, guarde y cierre el documento. Asignar el espacio en el montón le permite crear tantos documentos como desee, cada uno de los cuales tiene el tamaño adecuado para los datos que contiene, y para evitar vincular el tiempo de vida de los documentos con el tiempo de vida de una función en particular.
Resumen: En pocas palabras, la pila contiene los valores de las variables (a veces los registros se usan en su lugar), mientras que el montón se utiliza para asignar memoria que se utilizará más allá de la duración del bloque actual.