Perché l’indirizzo della variabile del processo figlio e del processo genitore è lo stesso

Ecco il mio codice

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; } 

L’output del programma è come segue:

 before: 3 ffbff440 after: 30 ffbff440 father: 3 ffbff440 

La mia domanda è perché l’indirizzo della variabile di figlio e genitore è uguale ma il valore è diverso?

Perché è un indirizzo virtuale , non fisico.

Ogni processo riceve il proprio spazio di indirizzamento (ad esempio, un sistema a 32 bit può consentire a ciascun processo di avere il proprio spazio di indirizzamento con l’intera gamma 4G).

È l’unità di gestione della memoria che mapperà gli indirizzi virtuali a quelli fisici (e gestirà cose come gli errori di pagina se le pagine scambiate devono essere riacquistate dalla memoria secondaria).

Il seguente diagramma può aiutare, ogni sezione rappresenta un blocco di memoria 4K:

  Process A Physical Memory Process B +-------+ +-------------+ +-------+ 0K | |----> 0K | (shared) | < ----| | 0K +-------+ +-------------+ +-------+ 4K | |--+ 4K | | <----| | 4K +-------+ | +-------------+ +-------+ 8K | | +-> 8K | | | | 8K +-------+ +-------------+ +-------+ | : : : : : : : | | +-------------+ | | 128K | | < --------+ | +-------------+ +--------> 132K | | +-------------+ 

È ansible vedere, in tale diagramma, la disconnessione tra gli indirizzi di memoria virtuale e gli indirizzi di memoria fisica (e la possibilità per i processi di condividere anche blocchi di memoria). Gli indirizzi lungo i lati sinistro e destro sono indirizzi virtuali che i processi vedono.

Gli indirizzi nel blocco centrale sono effettivi indirizzi fisici in cui i dati sono “realmente” e la MMU gestisce la mapping.

Per una spiegazione più approfondita di fork (ed exec ), potresti anche voler dare un’occhiata a questa risposta .

L’indirizzo è lo ‘stesso’ in quanto ogni processo ha il proprio spazio di indirizzamento virtuale e la variabile verrà generalmente caricata nella stessa posizione. Si noti che questo non è l’indirizzo fisico in memoria. Si noti inoltre che esistono schemi che deliberatamente randomizzano la posizione in cui viene caricato un processo al fine di rendere più difficile l’attacco / hacking del processo. In tal caso l’indirizzo sarà diverso.