2012-04-25 21 views
5

Su un sistema Linux a 32 bit, un processo può accedere a un massimo di 4 GB di spazio di indirizzi virtuali; tuttavia, i processi sembrano essere conservativi a vari livelli nel riservare nulla di tutto ciò. Quindi un programma che usa malloc occasionalmente accresce il suo segmento di dati da un sysck sbrk/brk. Persino quelle pagine non sono ancora rivendicate nella memoria fisica. Quello che non capisco pienamente è il motivo per cui abbiamo bisogno di prendere in considerazione in primo luogo, perché non darmi solo 4 GB di spazio di indirizzi evitando qualsiasi chiamata sbrk, in quanto fino a quando non tocchiamo/rivendichiamo questi blocchi, è essenzialmente un'operazione gratuita, giusto?Memoria virtuale e sbrk

risposta

5

Cosa succede se si esegue la mappatura della memoria di un file (una cosa molto comune da fare sotto Linux)? Deve andare da qualche parte nello spazio degli indirizzi, quindi ci devono essere alcuni mezzi per definire le parti "usate" e "non usate".
La memoria condivisa (che in realtà sta solo mappando un file senza un file reale) è la stessa. Deve andare da qualche parte, e il sistema operativo deve essere sicuro che possa posizionarlo senza sovrascrivere qualcosa.

Inoltre, è preferibile mantenere la località di riferimento per ragioni di efficienza ovvie (e meno ovvie). Se ti è stato permesso di scrivere e leggere da qualsiasi posizione nel tuo spazio indirizzo, puoi scommettere che alcune persone farebbero proprio questo.

+0

"memoria condivisa (che è in realtà solo la mappatura di un file senza un file vero e proprio) è la stessa. Deve andare da qualche parte, e il sistema operativo deve essere sicuro di poterlo posizionare senza sovrascrivere qualcosa. "Vedo quello che stai dicendo (credo), come malloc chiama mmap (con anonimo e privato) credo e che potrebbe non chiamare sbrk, ma se sul programma init malloc ha fatto brk (4gb) rimuove syscall per sbrk ecc. Ma non è possibile mappare più file di memoria aggiuntivi o creare memoria condivisa con bandiere diverse. sto iniziando a capire –

+0

"Inoltre, è preferibile mantenere la località di riferimento per ovvi (e meno ovvi) motivi di efficienza" Ma se prendo un po 'di memoria da 1gb in blocco da 4gb e dico 3.9gb nel blocco da 4gb, probabilmente lo farò essere vicini alla memoria fisica una volta che l'allocazione fresca è stata esclusa (basta azzerare la destra)? –

+0

Potrebbe, potrebbe non esserlo. Non puoi saperlo. – Damon

4

Ci sono un paio di ragioni che vengono in mente:

  • Faresti non ottiene segfaults quando si accede a memoria mappata
  • Il Translation lookaside buffer (TLB) sarebbe più grande, forse richiede più tempo per impostarla up
  • Dovreste eliminare la mappatura alcuni di quella memoria in ogni caso se si carica in una nuova libreria o mmap condivisa() qualcosa
Problemi correlati