2011-02-02 19 views
5

i se depura un programa en dos terminales, dando entrada diferente, pero en el particular, vi esto en un terminalasignación de memoria para el puntero

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c) 

y en otro terminal de

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c) 

donde la función ins es

ins(struct node *ptr, int key, int *upKey,struct node **newnode) 

cómo se puede asignar la misma ubicación de memoria a un puntero. y estoy ejecutando el mismo programa en dos terminales diferentes ... con diferentes entradas

+2

Esa es una gran pregunta. – sharptooth

Respuesta

5

Con memoria virtual, cada programa que se ejecuta en un sistema actúa como si tuviera todo el espacio de direcciones de la computadora en sí mismo. Sin embargo, cada vez que se desreferencia un puntero, una pieza especial de hardware se traduce de la supuesta dirección del puntero (su dirección virtual) a otra ubicación en la memoria donde realmente viven los datos (dirección física). El sistema operativo está diseñado para administrar y mover las regiones de memoria a las que se asignan las direcciones virtuales, por lo que si un programa elimina la dirección A se asignará a una ubicación diferente en la memoria física que la que obtendría si desreferenciara la dirección A en un proceso diferente. De hecho, cualquier número de programas puede pretender utilizar la dirección A sin problemas, ya que todas estas direcciones virtuales se resuelven en direcciones físicas diferentes en el sistema.

+1

Tenga en cuenta que si este no fuera el caso, la función 'fork' sería imposible. –

9

Las direcciones de memoria que está viendo son direcciones virtuales. Esas direcciones luego son traducidas por el procesador a direcciones físicas. Esta es la base de todos los sistemas operativos modernos. Cada proceso cree que posee todo el espacio de direcciones (4 GB en el caso de una máquina de 32 bits, mucho más en el caso de una máquina de 64 bits). Cuando un proceso accede a la memoria que todavía tiene que asignarse, la CPU genera un error de página. El SO puede manejar ese acceso inválido a la memoria de una de varias maneras; una forma común es una falla de segmentación.

1

Además de aquellos que se tratan de ser virtuales y "privados" para cada proceso, no se olvide de que parte de la memoria física puede compartirse entre los procesos. Por ejemplo, cuando fork() el proceso no se copia inmediatamente, el código permanece compartido y las páginas de datos solo se copian al intentar modificarlas ("copiar al escribir"), por lo que dos programas pueden compartir la memoria física (de forma transparente para ellos).