2012-07-24 31 views
6

Estoy muy confundido con estas preguntas.¿Memoria virtual?

  1. En un procesador de 32 bits, cada proceso tiene 4 GB de memoria virtual. Pero, si cada proceso tiene 4gb de espacio, será una gran cantidad si se está ejecutando el proceso 100 - esto es mayor que el área de intercambio. Puede alguien por favor explicar esto; Estoy muy confundido.

  2. ¿Cómo asigna el sistema operativo la memoria a un proceso? Supongamos que un proceso tiene a = malloc(2). ¿Quién asignará esta memoria al proceso? ¿El sistema operativo dará estos 2 Bytes de memoria al proceso?
    (Accedemos al a [2] genera el error de segmentación).

  3. Dónde quedan las diferentes partes del proceso (Código, Datos, Pila, Heap) en la memoria principal o en la memoria secundaria.

Por favor, dame un buen enlace para que yo también puedo entender la memoria virtual y toda su mecanismo como los enlaces que he encontrado no se explica totalmente la memoria virtual.

+0

Como nadie notó esto anteriormente, se debe señalar que si asigna una matriz de 2 bytes, un [2] no será parte de esa matriz, solo serán [0] y [1]. –

+0

¿Malloc dará segmentación cada vez? ya que malloc asignará el espacio desde el montón y luego el tamaño del montón será normalmente muy grande, ¿por qué no podemos acceder al a [2]? debería dar algún valor aleatorio. la segmentación significa que no podemos acceder a eso. Corrígeme si estoy equivocado – RATHI

+0

Realmente depende de tu máquina y compilador. Pero, en resumidas cuentas, si no ha asignado la memoria para su programa, no debe acceder ni modificarla. –

Respuesta

3
  1. ¿A quién le importa si la memoria virtual es mayor o menor que el área de intercambio? ¿Qué diferencia hace eso? (Si, por ejemplo, asigna un archivo de 2GB de solo lectura, usa 2GB de memoria virtual, pero no tiene espacio de intercambio y solo se necesitan cantidades triviales de memoria física).

  2. El sistema operativo simplemente amplía la memoria virtual del proceso espacio. Solo está cambiando una entrada contable. La memoria física no es necesaria hasta que se intente modificar el contenido del espacio de direcciones. (En realidad, es probable que el proceso lo haga por sí solo, pidiendo al sistema operativo que amplíe su espacio de memoria virtual cuando necesite trozos más grandes).

  3. Permanecen en la memoria física (suponiendo que fallaron al principio) hasta que el sistema elige moverlos a otro lugar o descartarlos. Si se trasladan a otra parte o se descartan, se vuelven a ubicar o se vuelven a crear cuando se accede a ellos a través de fallas de página. (El sistema operativo gestiona la memoria física como un recurso precioso, otorgándole modo que considere mejor.)

Por cierto, en la mayoría de los sistemas operativos de 32 bits, el sistema operativo en sí tiene 1 GB o 2 GB de ese espacio de memoria virtual, dejando solo 2 GB o 3 GB realmente utilizables por el proceso. En sistemas operativos de 64 bits, el sistema operativo no ocupa nada de ese espacio, por lo que los 4 GB completos están disponibles para procesos de 32 bits.

+0

de acuerdo con el comentario n. ° 2, malloc() no reservará la memoria en la RAM, solo agrega la entrada. cuando accedemos a esa memoria asignada solo se reserva RAM ??? – Jeyaram

+0

@rjayavrp: cuando accede a la memoria, se asigna RAM. No está reservado ya que el sistema operativo lo retirará si tiene un uso más importante para él. –

+0

malloc está implementado en libc y llama a syscall sbrk(). Si sbrk requiere otra página para entretener la solicitud solo entonces el sistema operativo está involucrado, de lo contrario, el malloc se completa en modo de usuario ... ¿Estoy aquí? – theadnangondal

0

Primero: 32 bits significa 32 bits. no hay más bits para abordar más espacio de memoria. Los sistemas multiprocesador no son una invención nueva. Con 32 bit, solo puedes abordar el espacio de 4gigs. hay algunas soluciones como PAE http://en.wikipedia.org/wiki/Physical_Address_Extension.

Segundo y tercero ... No estoy muy seguro de cómo funciona hoy. Pero eche un vistazo a http://en.wikipedia.org/wiki/Virtual_memory

+0

PAE es una solución alternativa para acceder a más de 4 GB de memoria * física *. Esta pregunta se trata de límites de memoria * virtual *. –

+0

Oh ... Tienes razón. – Mirko

0

Un malentendido grave de usted es la diferenciación entre la memoria virtual y la memoria. Desde un POV de proceso, no hay diferencia, el proceso solo accede a la memoria y es el sistema operativo el que se encarga de intercambiar porciones de datos entre la memoria física (RAM) y la virtual.

1) Que el espacio de dirección de un proceso puede alcanzar hasta 4GB no significa que cada proceso tenga 4GB asignados. El sistema operativo les asigna memoria según sea necesario.

2) El sistema operativo proporciona memoria (* 1) en bloques. Cuando realiza un malloc, la función malloc que gestiona internamente la memoria del programa obtiene el espacio necesario dentro de la memoria de proceso y devuelve el puntero (tal vez en el proceso soliciten memoria adicional del sistema operativo, pero no es necesario).

3) Como se inició al principio, se trata de un problema de sistema operativo. Cada sistema operativo puede decidir qué partes virtualizar y qué partes no, existen estrategias complejas involucradas para reducir el número de intercambios.

* 1 Tenga en cuenta que hablo de memoria, no de máquina virtual. La aplicación no sabe qué partes de su memoria son virtuales o físicas, es transparente para ellos.

2

1) Cada proceso tiene 4 gb de espacio de memoria virtual, pero no es necesario asignarlo todo de una vez. El sistema operativo especifica al MMU qué partes de la memoria física se asignan a su espacio virtual, y qué partes no están mapeadas en absoluto. Los accesos a las partes que no están mapeadas causarán fallas en el procesador y el sistema operativo generalmente genera una segfault. También hay un marcador para "no presente" que le dice al procesador que el área de la memoria no está en el espacio de la memoria física pero está en el espacio de intercambio, entonces el procesador falla y el sistema operativo cambia la página a la memoria física, luego se reanuda el proceso donde lo dejo Para describir una tabla de páginas de procesos, solo necesita unos pocos bytes de memoria, por lo que 100 procesos no usarían tanta memoria hasta que realmente lo soliciten.

2) Hay muchos algoritmos de asignación de memoria. Por lo general, el sistema operativo solo asigna grandes bloques de memoria a la vez, por lo que las llamadas a malloc() solo a veces provocan una llamada al sistema operativo, la mayoría de las veces son los detalles de implementación de la biblioteca estándar C los que manejan la microadministración. No hay garantía de que un acceso fuera de los límites de una matriz produzca una falla seg, ya que podría ser parte de una matriz diferente que se había mallocrado anteriormente, o parte del espacio libre que la biblioteca estándar está rastreando para el futuro asignaciones y por lo tanto no segfault. Sin embargo, existen herramientas de depuración como valgrind que detectarán dichos errores.

3) Los detalles sobre dónde se encuentra cada segmento dependen del sistema operativo, pero para el código que es general y portátil, no hay necesidad de saberlo. Para obtener más información sobre todos estos temas, consulte el wiki osdev, específicamente la parte en paging y memory allocation.

Cuestiones relacionadas