programacion pilas pila operaciones estructura estatica datos con colas codigo aplicaciones stack kernel heap

stack - operaciones - pilas estructura de datos java



Programa de pila y montón, ¿cómo funcionan? (5)

Sé que cada proceso en ejecución tiene páginas asociadas con él en la memoria virtual y pocos de ellos se cargarán en la memoria principal según sea necesario. También sé que el programa tendrá una pila y también un montón para asignar memoria dinámica. Aquí están mis preguntas.

  1. ¿Es la pila también parte de alguna página en la memoria principal?
  2. ¿Qué sucede cuando el programa pasa al estado de espera? ¿Dónde se almacenan el puntero de la pila, el contador del programa y otra información?
  3. ¿Por qué la pila crece y el montón crece?
  4. ¿Puede el caché L1, L2 contener solo una parte de la memoria contigua, o puede tener alguna parte de la pila y el montón?

¿Puedes recomendar algún buen libro que cubra estas cosas?


  1. Sí, la pila normalmente se almacena en las direcciones "bajas" de la memoria y se llena hacia arriba hasta su límite superior. El montón normalmente se almacena en la "parte superior" del espacio de direcciones y crece hacia la pila.

  2. El O / S almacena un "contexto" por proceso en ejecución. La operación de guardar y restaurar el estado del proceso se denomina "cambio de contexto".

  3. Sólo una convención de AFAIK. La pila realmente no "crece" tiene una asignación fija.

  4. Los cachés simplemente contienen instantáneas de partes de RAM que se han utilizado (ya sea recientemente o cerca). En cualquier momento, pueden tener memoria de cualquier parte del espacio de direcciones en ellos. Lo que aparece donde depende en gran medida de los parámetros estructurales de la memoria caché (longitud de bloque, asociatividad, tamaño total, etc.).

Sugeriría Arquitectura de Computadora: un Enfoque Cuantitativo como una buena referencia sobre el hardware subyacente y cualquier libro sobre Sistemas Operativos sobre cómo se "administra" el hardware.


Cuando uno usa un sistema operativo en modo protegido (como Windows o Linux), cada proceso tiene un montón de páginas de memoria disponibles para el proceso dado. Si se requiere más memoria, se puede paginar más.

Normalmente, el proceso divide la memoria que se le asigna en dos partes. Uno es el montón y el otro es la pila. La parte inferior de la pila está designada por el puntero de pila r13 en el brazo y especialmente en x86. Cuando se crea una variable en la pila, el puntero de la pila se mueve para permitir el espacio adicional necesario. Esto se hace mediante la instrucción PUSH del ensamblador. De manera similar, cuando una variable está fuera del alcance, se elimina de la pila.

Normalmente, PUSH hace que el puntero de pila disminuya, dejando el valor por encima del valor de los punteros de pila "en la pila".

La otra parte de la memoria se puede utilizar para un montón. Esto entonces está disponible para la asignación con el uso de malloc o nuevo. Cada subproceso debe tener su propia pila, pero puede compartir el montón con otros subprocesos en el proceso.

Cuando el kernel reprograma un hilo, almacena el registro de pila y cambia el registro de pila a la nueva pila. si puede o no necesitar almacenar el contador del programa según la forma en que lo hace la programación.

El caché no tiene nada que ver con la pila o el montón. Está administrado por el procesador y proporciona una manera de garantizar que los datos que necesita la CPU estén a la mano para que no tenga que esperar a que el bus los busque. Depende totalmente de la CPU garantizar que el contenido de la memoria principal sea el mismo que el almacenado en la memoria caché. La única vez que uno realmente necesita preocuparse por el caché es cuando se usa DMA. El uno tendrá que vaciar o sincronizar manualmente la memoria caché para asegurarse de que la CPU no confía en la memoria caché y en realidad obtiene datos de la memoria principal.


Deberías revisar las slides mi profesor, de mi clase de arquitectura. Unidad 6. Realmente me ayudó a comprender, todo lo que me pidió y otros respondieron, y MÁS, si desea un conocimiento más profundo.


Este es mi entendimiento de esas preguntas:

  1. ¿Es la pila también parte de alguna página en la memoria principal?

    Sí, la pila generalmente también se almacena en el espacio de direcciones del proceso.

  2. ¿Qué sucede cuando el programa se mueve al estado de espera, dónde se almacenan el puntero de la pila, el contador del programa y otra información?

    Cuando el sistema operativo lleva el proceso de activo a en espera, almacena todos los registros (que incluyen el puntero de la pila y el contador del programa) en la tabla de procesos del kernel. Luego, cuando se vuelve a activar, el sistema operativo copia toda la información en su lugar.

  3. ¿Por qué la pila crece y el montón crece?

    Esto se debe a que, por lo general, tienen que compartir el mismo espacio de direcciones y, por comodidad, cada uno comienza en un extremo del espacio de direcciones. Luego crecen uno hacia el otro, dando como resultado un comportamiento de crecimiento hacia abajo.

  4. ¿Puede el caché L1, L2 contener solo una parte de la memoria contigua o puede tener parte de la pila y el montón?

    Las memorias caché de la CPU almacenarán los fragmentos de memoria usados ​​recientemente. Debido a que tanto la pila como el montón se almacenan en la memoria principal, los cachés pueden contener partes de ambos.


3. ¿Por qué la pila crece y el montón crece?

Tenga en cuenta que en algunos sistemas (algunos sistemas HP, por ejemplo), la pila crece en lugar de disminuir. Y en otros sistemas (p. Ej., IBM / 390) no existe una pila de hardware real, sino un conjunto de páginas que se asignan dinámicamente desde la memoria del espacio del usuario.

El montón puede, en general, crecer en cualquier dirección, ya que puede contener muchos orificios de asignación y desasignación, por lo que es mejor pensar en él como una colección de páginas sueltas que en una estructura de tipo LIFO-stack. Dicho esto, la mayoría de las implementaciones de pilas amplían su uso del espacio dentro de un rango de direcciones predeterminado, creciendo y reduciéndolo según sea necesario.