Cos'è la memoria virtuale?


27

Stavo ricontrollando le mie note per "Memoria virtuale" e la definizione nel mio libro di testo è:

Processo di allocazione di una sezione di memoria secondaria per agire come parte della memoria principale

Dove dice Wikipedia :

La memoria virtuale è una tecnica di sistema che dà al programma applicativo l'impressione di avere una memoria di lavoro contigua (uno spazio di indirizzi)

e (dice anche Wikipedia)

Tieni presente che la "memoria virtuale" è molto più del semplice "utilizzo dello spazio su disco per estendere la dimensione della memoria fisica"

Qualcuno può offrire qualche chiarimento su quale sia corretto?


Credo che la nota di Wikipedia implichi alcune qualifiche su ciò che viene utilizzato in termini di cose contigue.
JB King,

Questa domanda avrebbe probabilmente una risposta migliore su SO.
Capitano Segfault,

2
Non confondere la memoria virtuale con come viene utilizzata. La prima frase di Wikipedia sta definendo di cosa si tratta. Il tuo libro parla di come viene generalmente utilizzato. Quando le persone parlano di "pagine", parlano di un'implementazione specifica della memoria virtuale.
Tony Lee,

2
Il tuo libro di testo è semplicemente sbagliato. Esistono molte macchine con memoria virtuale e nessuna memoria secondaria. Allo stesso modo, una volta c'erano molte macchine che potevano usare l'archiviazione secondaria come parte della memoria principale ma non supportavano la memoria virtuale. La "memoria virtuale" è qualcosa che non è memoria ma è accessibile come memoria. Il tuo libro di testo sta definendo lo scambio o il paging.
David Schwartz,

1
Il libro di testo lo definisce in modo completamente errato, l'archiviazione secondaria non fa parte della definizione. E anche l'affermazione di Wikipedia su "più dello spazio su disco" è fuorviante, perché potrebbe non coinvolgere affatto il disco - quella frase sembra "estendere la memoria al disco" più qualcos'altro.
Kelvin,

Risposte:


41
Note that "virtual memory" is more than just "using disk space to extend physical memory size"

La memoria virtuale è uno strato di astrazione fornito a ciascun processo. Il computer ha, diciamo, 2 GB di RAM fisica, indirizzato da 0 a 2G. Un processo potrebbe visualizzare uno spazio di indirizzi di 4 GB, che ha interamente a sé. La mappatura da indirizzi virtuali a indirizzi fisici è gestita da un'unità di gestione della memoria, che è gestita dal sistema operativo. In genere questo viene fatto in "pagine" 4KB.

Questo offre diverse funzionalità:

  1. Un processo non può vedere la memoria in altri processi (a meno che il sistema operativo non lo voglia!)
  2. La memoria in un determinato indirizzo virtuale potrebbe non trovarsi nello stesso indirizzo fisico
  3. La memoria di un indirizzo virtuale può essere "paginata" su disco e quindi "paginata" quando si accede nuovamente.

Il tuo libro di testo definisce la memoria virtuale (erroneamente) come solo # 3.

Anche senza lo scambio, è necessario prestare particolare attenzione alla memoria virtuale se si scrive un driver di dispositivo per un dispositivo che esegue DMA (accesso diretto alla memoria). Il codice del driver viene eseguito sulla CPU, il che significa che gli accessi alla memoria avvengono tramite la MMU (virtuale). Il dispositivo probabilmente non passa attraverso la MMU, quindi vede indirizzi fisici non elaborati. Quindi, come scrittore di driver, devi assicurarti:

  1. Qualsiasi indirizzo di memoria grezza che passi all'hardware è fisico, non virtuale.
  2. Qualsiasi grande blocco di memoria (multipagina) inviato è fisicamente contiguo. Un array 8K potrebbe essere praticamente contiguo (tramite la MMU) ma due pagine fisicamente separate. Se dici al dispositivo di scrivere 8K di dati all'indirizzo fisico corrispondente all'inizio di quell'array, scriverà il primo 4K dove ti aspetti, ma il secondo 4K danneggerà un po 'di memoria da qualche parte. :-(

4

Proverò a iniziare lentamente, e poi metterò tutto insieme per te. È così:

La memoria virtuale, come comunemente usata, si riferisce al "paging". Come suggerisce il nome, il paging è come un blocco note umano.

Quando si elaborano somme semplici o si imparano informazioni semplici, si fa tutto in testa: si caricano tutte le informazioni, le si elabora e si ottiene la risposta. È come un computer che carica file dal disco rigido: carica i programmi o le immagini o altre informazioni necessarie per lavorare nella sua "memoria reale" (o "memoria fisica") e ci lavora con il suo "cervello" ( il suo processore).

Tuttavia, quando stai imparando informazioni complesse o lavorando con somme complesse, potresti non essere in grado di adattarti a tutto ciò nella tua testa in una volta. Ti confondi, inizi a rallentare, non riesci a tenere tutto lì dentro in una volta e devi dimenticare qualcosa per ricordare qualcos'altro.

La soluzione umana è usare un blocco note. Annotiamo sulle pagine tutte le cose che non possiamo ricordare in una volta, ma ci riferiamo a loro mentre facciamo le somme. Potremmo non essere in grado di ricordare un enorme elenco di dati sulle vendite per il mese, ma possiamo guardare le pagine, ottenere le informazioni un po 'alla volta ed elaborare ogni bit. È come se il computer "impaginasse" la sua memoria: scrivesse pagine piene di informazioni e le mettesse in "memoria virtuale" per riferimento futuro, e realizzasse che aveva bisogno di una pagina e caricando quella pagina dalla memoria virtuale nella memoria reale. Su Linux e Unix, il luogo in cui sono memorizzate queste pagine è letteralmente chiamato "file di paging", e le pagine di dati in memoria sono letteralmente chiamate "pagine". Sistemi diversi hanno nomi diversi per queste cose, ma il concetto generale è più o meno lo stesso.

Quindi davvero, il paging è molto semplice. Tutte le pagine di informazioni non si adattano alla memoria, quindi alcune pagine vengono inserite sul disco e caricate di nuovo in seguito.

Ora, dove diventa sempre più complicato, i moderni sistemi dispongono della mappatura della memoria e della protezione della memoria, che di solito è gestita dallo stesso sistema hardware nel computer: l'unità di gestione della memoria o MMU.

In un (moderno) computer multitasking, che può eseguire molti programmi contemporaneamente e dotato di protezione della memoria, ogni programma è solitamente separato da altri programmi in esecuzione sullo stesso sistema. In questo modo, un programma non può alterare un altro programma semplicemente accedendo alla sua memoria - la MMU separa fisicamente lo spazio di indirizzi di un programma da quello di altri. In altre parole, i programmi dell'utente non vedono i programmi di altri utenti o anche altri programmi. Non vedono la "memoria reale", vedono la loro "memoria virtuale".

Ora, questo concetto di isolamento della memoria e il concetto di file di paging sono due cose concettualmente diverse, motivo per cui sei confuso. Tuttavia, la chiave è che entrambi funzionano utilizzando la MMU, l'unità di gestione della memoria, che divide la memoria in pagine e mappa le pagine su uno spazio di indirizzi virtuale.

Pertanto, quando un programma richiede la memoria in corrispondenza di un determinato "indirizzo di memoria", ciò che accade realmente è che le pagine di memoria per quel programma e i loro indirizzi corrispondenti (lo "spazio degli indirizzi" del programma) vengano cercate e la pagina che corrisponde a quel blocco di memoria è stato trovato. Quella pagina può essere caricata da qualche parte nella memoria reale, nel qual caso il programma ha accesso, oppure può essere pagata su un disco. Se viene eseguito il paging, viene attivato un "errore di pagina": si accede al disco e la pagina viene caricata in memoria. Quindi il programma funziona anche quando non c'è abbastanza memoria, ma funziona LENTAMENTE, se deve usare il disco per quello che normalmente sarebbe un accesso alla memoria molto veloce.

Ora, se non c'è abbastanza spazio per caricare quella pagina in memoria, allora hai un problema. In tal caso, alcune ALTRE pagine che sono già in memoria devono essere "scambiate" su disco, in modo da poter caricare la prima pagina del programma. Oppure potrebbero essere ugualmente pagine dello stesso programma. Questo si vede a volte nei programmi di grafica, ad esempio, su sistemi pesantemente caricati, quando parte dell'immagine viene caricata lentamente e disegnata rapidamente, quindi la parte successiva viene caricata altrettanto lentamente e disegnata rapidamente e quando torni a lavorare con la prima parte, è di nuovo lento. Questo perché vengono caricati per essere elaborati, quindi scambiati di nuovo, quindi è possibile lavorare su qualcos'altro. Ovviamente, questo è un modo molto lento di lavorare e ciò di cui hai davvero bisogno è più memoria REALE.


Non sono d'accordo al 100% con questa risposta. Se "memoria virtuale" si riferiva al paging, un sistema che non esegue la pagina (ad esempio, uno senza file di scambio o di pagina abilitato) non può supportare la memoria virtuale. Ma questo è ovviamente folle.
David Schwartz,

@DavidSchwartz - Inizialmente ho avuto una reazione simile alla tua, ma nel leggere la risposta in modo più dettagliato, non penso che sia così male. Considera Wikipedia / memoria virtuale / Paged dice "Quasi tutte le implementazioni della memoria virtuale dividono uno spazio di indirizzi virtuali in pagine, blocchi di indirizzi di memoria virtuale contigui". Cioè, "paging", in senso lato, non richiede un file di paging , ma si riferisce alla mappatura di indirizzi virtuali in indirizzi fisici.
ToolmakerSteve

1
Hmm, d'altra parte, Lee dice "Tutte le pagine di informazioni non si adattano alla memoria, quindi alcune pagine vengono messe su disco e caricate di nuovo in seguito", quindi David ha ragione: questa risposta manca del fatto essenziale che paging è non solo di paging su disco . Tra i lati positivi, Lee continua menzionando altri vantaggi della memoria virtuale (isolamento della memoria). Se questa risposta fosse riformulata per non confondere la "mappatura delle pagine della memoria virtuale" con "il paging su disco", sarebbe più utile.
ToolmakerSteve

@ToolmakerSteve Il problema è che si tratta di un malinteso molto comune e tutto ciò che rafforza tale malinteso è, IMO, una cosa negativa. È particolarmente negativo qui quando questa risposta sta cercando di spiegare i concetti di base in una questione molto semplice: lì è il più importante non gettare le basi sulla base di un malinteso comune!
David Schwartz,

@DavidSchwartz - Sono d'accordo. Hai ragione, è non definisce "memoria virtuale", egli sta definendo "come funziona un file di paging". Inizialmente avevo pensato che il problema fosse semplicemente che Lee non riusciva a distinguere tra "paging = mappatura delle pagine di memoria dal file di pagina virtuale a fisico" contro "file della pagina = mappatura delle pagine su disco", ma dopo aver riletto, stava davvero parlando solo sulla mappatura su disco. (Come possiamo vedere, dalla citazione del libro di testo, da tutte le altre risposte tranne quelle del Capitano, e da una ricerca su Google, questa commistione dei due concetti è molto diffusa. Sono sicuro di essermi reso colpevole.)
ToolmakerSteve

0

So che è troppo tardi .... ma lo ritengo ancora utile.

  • Tutti sono corretti in base a diversi punti di vista.
  • La memoria virtuale è una tecnica di gestione della memoria mentre la memoria di swap era area sull'unità disco. La memoria di swap è generalmente chiamata spazio di swap. Lo spazio di swap si riferisce alla parte della memoria virtuale che è riservata come posizione di archiviazione temporanea. Lo spazio di swap viene utilizzato quando la RAM disponibile non è in grado di soddisfare i requisiti della memoria del sistema
  • È possibile fare riferimento al seguente link per maggiori dettagli

-2

Bene, se capiamo la parola virtuale, penso che possiamo capire come si riferisce alla memoria.

"Virtuale" come definito su Dictionary.com: "temporaneamente simulato o esteso dal software del computer: un disco virtuale nella RAM; memoria virtuale su un disco rigido".

Nel caso della memoria virtuale, il sistema sta simulando la memoria del sistema utilizzando risorse di memoria più lente (ad esempio disco rigido, chiavetta USB ecc.) Quando è richiesta memoria aggiuntiva, il sistema sostituirà i dati nella memoria di sistema che non sono necessari per il disco rigido unità o risorsa che hai impostato. Ciò libera la memoria di sistema in modo che l'applicazione possa continuare l'attività che stava svolgendo.

Lo scambio è un processo continuo e quindi se si aggiorna la memoria si dovrebbe vedere un miglioramento delle prestazioni in quanto il sistema non dovrebbe richiedere lo scambio a memoria più lenta come offten.


-2

La memoria virtuale è una funzionalità di un sistema operativo (SO) che consente a un computer di compensare la carenza di memoria fisica trasferendo temporaneamente pagine di dati dalla memoria ad accesso casuale (RAM) alla memoria del disco.

Significa che è come un mirror o una memoria di esempio utilizzata nella macchina virtuale o nella scatola virtuale per provare i sistemi operativi senza formattare il computer.


No, questo è il paging.
David Schwartz,

-4

La memoria virtuale è un blocco del disco rigido che il sistema utilizza come file di paging oltre alla RAM fisica.

Diventa complicato e talvolta lento, perché Windows NON deframmenta questa parte del tuo disco rigido.

I 2 migliori consigli che posso offrire: 1) Virt Mem dovrebbe essere impostato sia min che max a circa 1,5 volte la tua memoria fisica. ex. 2 GB di RAM = 3070 MB di Virt. 2) Durante la deframmentazione, disattivare il file di paging. Deframmenta 2x e ripristina il numero originale. Ciò fornisce una porzione pulita di unità e aumenta la velocità del file di paging.


1
Non è del tutto vero: i moderni gestori di memoria virtualizzano TUTTA la memoria di sistema. Questo è ciò che consente la separazione dei processi: ogni processo può solo toccare la propria memoria. Il gestore della memoria è responsabile del mapping di queste pagine virtuali alla memoria reale e, facoltativamente, a un disco fisso.
Anthony Giorgio,

1
"Windows NON deframmenta questa parte del tuo disco rigido." basta nuke pagefile.sys, riavviare, deframmentare il disco e riattivare il paging, voilá, un file di paging fresco e contiguo! tuttavia, PageDefrag di Sysinternals fa un lavoro migliore in quanto posizionerà anche il file di paging all'inizio dell'unità / partizione per prestazioni migliori.

1
Se questa risposta fosse corretta, un sistema Windows senza file di pagina configurati non potrebbe fornire alcun supporto di memoria virtuale. Ma questo è ovviamente sbagliato. Un tale sistema potrebbe, ad esempio, mappare i file nello spazio degli indirizzi di processo in eccesso rispetto alla RAM fisica, che è un esempio di memoria virtuale.
David Schwartz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.