2013-06-15 21 views
9

Supponiamo che io abbia una libreria condivisa con questa funzione dove "i" è una variabile globale.Come sono collegate le variabili globali nelle librerie condivise?

Quando chiamo questa funzione da più processi, il valore di "i" in ogni processo è indipendente dagli altri

Questo comportamento è abbastanza probabile.

Mi stavo chiedendo come viene solitamente implementato questo comportamento dal linker? Dalla mia comprensione il codice è condiviso tra i processi, quindi la variabile deve avere lo stesso indirizzo virtuale in tutti gli spazi di indirizzi di ogni programma che utilizza questa libreria. Quella condizione sembra abbastanza difficile da realizzare per me quindi credo che mi manca qualcosa qui e si fa in modo diverso.

Posso ottenere informazioni più dettagliate su questo argomento?

+5

** Codice ** è condiviso, non ** dati. ** Il linker dinamico presumibilmente crea una nuova copia della variabile per ogni processo, ma non crea copie del segmento di testo (codice). –

+0

@ H2CO3 Ne sono ben consapevole. Comunque sto chiedendo i dettagli del processo di collegamento. –

+0

Bene, se hai bisogno di maggiori dettagli, penso che dovresti dare un'occhiata a un'implementazione reale. Il linker dinamico in Linux e quello in Darwin (BSD/OS X/iOS) sono opensource. –

risposta

0

Ogni processo ha il proprio spazio di indirizzamento univoco, quindi quando un processo accede alla variabile può avere valori diversi rispetto all'altro processo. Se il processo dovesse condividere la stessa memoria, dovrebbero configurarlo in modo specifico. Una libreria condivisa non è sufficiente per questo.

+0

Sono consapevole del fatto che ogni processo ha uno spazio di indirizzi univoco. Tuttavia, il codice è condiviso. e il codice si riferisce ad alcuni indirizzi (virtuali) nella memoria. La mia domanda riguarda come viene gestita quella cosa. –

+0

Ma anche se puntano allo stesso indirizzo, le pagine di memoria sono relative al loro ambiente di processo. Le pagine di memoria sono assegnate dal sistema operativo, quindi il linker non deve fare nulla di speciale per questo. – Devolus

6

Il processo di collegamento dinamico in fase di esecuzione (molto simile al processo di collegamento statico), alloca segmenti separati di dati (e bss) per ogni processo e li associa nello spazio di indirizzamento del processo. Solo i segmenti di testo sono condivisi tra i processi. In questo modo, ogni processo ottiene la propria copia dei dati statici.

+0

Ed è necessario allocare i segmenti di dati esattamente nella stessa posizione in ogni spazio di indirizzamento? In tal caso, cosa succede se la posizione è già utilizzata da altri dati in uno degli spazi? –

+0

I segmenti vengono allocati, mappati allo spazio degli indirizzi da qualche parte (qualunque sia disponibile) e quindi un processo di collegamento se eseguito (trasferimento ecc. E risoluzione dei simboli). – Ziffusion

+0

Ma se il codice è condiviso, come posso eseguire il riposizionamento su di esso senza influenzare altri processi che utilizzano lo stesso codice? –

2

il codice è condiviso tra i processi, quindi la variabile deve avere lo stesso indirizzo virtuale in tutti gli spazi di indirizzi di ogni programma che usa questa libreria

Il codice non è condiviso il modo in cui pensare. Sì, l'oggetto condiviso dinamico viene caricato una sola volta ma i riferimenti di memoria o lo stack o l'heap codificato negli usi so non è condiviso. Solo la sezione che contiene il codice è condivisa.

Problemi correlati