2012-03-15 19 views
5

sono nuovo di "fork()", ho letto ovunque che quando viene chiamato un fork() viene avviata una copia esatta del processo corrente (chiamata). Ora quando eseguo il codice seguente, ci dovrebbero essere due processi diversi, avendo due diverse posizioni di memoria assegnate alle loro vars e funzioni.Come viene mappata la memoria quando si utilizza la forcella?

#include<stdio.h> 
int i=10; 
int pid; 
int main(){ 
    if((pid=fork())==0){ 
    i++;//somewhere I read that separate memory space for child is created when write is needed 
    printf("parent address= %p\n",&i);// this should return the address from parent's memory space 
    }else{ 
    i++; 
    i++; 
    printf("child address= %p\n",&i);// this should return the address of child's memory space 
    } 
    wait(0); 
    return(0); 
} 
 
Why The output looks like:: 
child address::804a01c 
parent address::804a01c 

Perché sia ​​l'indirizzo sono gli stessi per il genitore e bambino?

+4

Loro * erano migliori * essere lo stesso. Si desidera che i puntatori facciano riferimento alla memoria nello stesso modo in entrambi i processi (anche se entrambi i blocchi di memoria sono distinti). Leggi di * memoria virtuale *, questo risponderà alla tua domanda. –

+1

Si noti che i valori * di 'i' sono diversi tra padre e figlio, anche se entrambe le copie sono memorizzate nello stesso indirizzo virtuale. – markgz

risposta

8

aventi due diverse posizioni di memoria assegnate ai rispettivi var e funzioni.

No; Linux implementa virtual memory, il che significa che ogni processo ha il proprio spazio di indirizzamento completo. Di conseguenza, dopo un fork, entrambi i processi vedono gli stessi indirizzi per le loro copie di oggetti in memoria.

:

+4

Il "lato" è in effetti abbastanza importante: nulla viene realmente copiato quando viene generato il processo figlio. Questa sarebbe un'enorme perdita di prestazioni, dato che il biforcarsi avviene molto spesso su Unix (praticamente ogni volta che si genera un nuovo processo). Il meccanismo preciso si basa su "errori di pagina". Puoi leggere di loro se sei interessato. –

+0

ok, quindi come possiamo ottenere l'indirizzo effettivo di quella var e non quella virtuale? (Chiedendo solo di soddisfare la mia curiosità) – buch11

+1

@ buch11: Penso che non sia possibile, ma permetterò agli esperti di confermare. Ad ogni modo, non dovresti. Questo tipo di informazioni è noto solo al kernel e ti permetterà solo di accedere agli indirizzi locali di processo. Questo è noto come "memoria protetta". Ogni processo può accedere solo alla propria memoria. –

2

indirizzi sono processo locale (Per inciso VM provoca anche il codice per essere condiviso tra il processo nella memoria fisica, e tutti i dati sarà solo copied-on-write.). 804a01c in un processo non corrisponde a 804a01c in un altro processo.

2

A causa di virtual memory: entrambi gli spazi degli indirizzi sono identici ai rispettivi processi. La memoria fisica in cui sono memorizzati è diversa. Tuttavia, in pratica, ciò è complicato dall'ottimizzazione della memoria (implementata dalla maggior parte dei kernel) che associa le diverse pagine virtuali corrispondenti alle stesse pagine fisiche finché uno di questi processi non scrive su quella pagina di memoria, momento in cui la pagina viene duplicata fisicamente a un altro indirizzo fisico (e la pagina virtuale viene rimappata per il processo).

Ci sono molte altre complicazioni vedere: Il più riconosciuto è che il valore di ritorno di fork() differisce tra processi, anche se questo è di solito una differenza nel valore di un registro, non memoria. Tuttavia, i file aperti e alcune altre risorse possono essere contrassegnati come non ereditabili, quindi potrebbero esserci altre differenze — minori ma a volte utili.

Problemi correlati