2011-02-02 1 views
5

ero debug di un programma in due terminali dando ingresso differente, ma in particolare i visto questo in un unico terminaleallocazione di memoria per puntatore

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

e in un altro terminale

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

dove ins è

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

in che modo è possibile allocare la stessa posizione di memoria a un puntatore. e sto facendo funzionare lo stesso programma su due terminali diversi ... con differenti ingressi

+2

Questa è una bella domanda. – sharptooth

risposta

5

Con memoria virtuale, ogni programma in esecuzione su un sistema agisce come se avesse intero spazio di indirizzamento del computer a sé. Tuttavia, ogni volta che un puntatore viene dereferenziato, un particolare elemento hardware viene convertito dall'indirizzo presunto del puntatore (l'indirizzo virtuale ) in un'altra posizione nella memoria in cui i dati effettivamente risiedono (l'indirizzo fisico ). Il sistema operativo è costruito per gestire e spostare le regioni della memoria a cui indirizzi virtuali sono mappati, quindi se un programma dereferenzia qualche indirizzo Un sarà mappare in una posizione diversa nella memoria fisica di quanto si otterrebbe se si dereferenziato indirizzo A in un altro processo. In effetti, qualsiasi numero di programmi può richiedere di utilizzare l'indirizzo A senza problemi, poiché questi indirizzi virtuali si risolvono tutti in indirizzi fisici diversi sul sistema.

+1

Nota che se così non fosse, la funzione 'fork' sarebbe impossibile. –

9

Gli indirizzi di memoria che stai guardando sono indirizzi virtuali. Questi indirizzi vengono quindi tradotti dal processore in indirizzi fisici. Questa è la base di tutti i moderni sistemi operativi. Ogni processo ritiene di possedere l'intero spazio di indirizzamento (4 GB nel caso di una macchina a 32 bit, molto più nel caso di una macchina a 64 bit). Quando un processo accede alla memoria che deve ancora essere assegnata ad esso, viene generato un errore di pagina dalla CPU. Il sistema operativo può quindi gestire quell'accesso di memoria non valido in uno dei vari modi; un modo comune è un errore di segmentazione.

1

Oltre a quelli considerati virtuali e "privati" per ogni processo, non dimenticare che una certa memoria fisica può essere effettivamente condivisa tra i processi. Ad esempio, quando il processo non viene copiato immediatamente, il codice rimane solo condiviso e le pagine di dati vengono copiate solo nel tentativo di modificarle ("copia su scrittura"), quindi due programmi possono effettivamente condividere la memoria fisica (in modo trasparente a loro).