procesos - Por qué la dirección de la variable del proceso hijo y el proceso principal es el mismo
proceso padre e hijo sistema operativo (2)
Aquí está mi código
int main()
{
pid_t pid;
int y = 3;
if ( (pid = fork()) <0 )
return -1;;
if( pid == 0 ) /* child */
{
printf(" before: %d %p/n", y, &y );
y *= 10;
printf("after: %d %p/n", y, &y );
}
else /* father */
{
sleep(1);
printf("father: %d %p/n" , y , &y );
}
return 0;
}
La salida del programa es como sigue:
before: 3 ffbff440
after: 30 ffbff440
father: 3 ffbff440
Mi pregunta es ¿por qué es la dirección de la variable del niño y el padre mismo, pero el valor diferente?
La dirección es la ''misma'' ya que cada proceso tiene su propio espacio de direcciones virtuales y la variable generalmente se cargará en la misma ubicación. Tenga en cuenta que esta no es la dirección física en la memoria. También tenga en cuenta que hay esquemas que deliberadamente asignan al azar la ubicación en la que se carga un proceso para dificultar el ataque / pirateo del proceso. En ese caso, la dirección será diferente.
Porque es una dirección virtual , no física.
Cada proceso obtiene su propio espacio de direcciones (por ejemplo, un sistema de 32 bits puede permitir que cada proceso tenga su propio espacio de direcciones con el rango 4G completo).
Es la unidad de administración de memoria que asignará las direcciones virtuales a las físicas (y manejará cosas como las fallas de página si las páginas intercambiadas deben comprarse desde el almacenamiento secundario).
El siguiente diagrama puede ayudar, cada sección representa un bloque de memoria 4K:
Process A Physical Memory Process B
+-------+ +-------------+ +-------+
0K | |----> 0K | (shared) | <----| | 0K
+-------+ +-------------+ +-------+
4K | |--+ 4K | | <----| | 4K
+-------+ | +-------------+ +-------+
8K | | +-> 8K | | | | 8K
+-------+ +-------------+ +-------+
| : : : : : : : |
| +-------------+ |
| 128K | | <--------+
| +-------------+
+--------> 132K | |
+-------------+
Puede ver, en ese diagrama, la desconexión entre las direcciones de memoria virtual y las direcciones de memoria física (y la posibilidad de que los procesos también compartan bloques de memoria). Las direcciones en los lados izquierdo y derecho son direcciones virtuales que ven los procesos.
Las direcciones en el bloque central son direcciones físicas reales donde los datos son "realmente" y la MMU maneja la asignación.
Para una explicación más detallada de fork
(y exec
), es posible que también desee ver esta respuesta .