Comprendo che la memoria virtuale ingannare il programma visualizzando più memoria di quella effettivamente disponibile.
Ma alla fine deve mappare l'indirizzo logico all'indirizzo effettivamente fisico. Ora come sta aumentando la memoria?
Comprendo che la memoria virtuale ingannare il programma visualizzando più memoria di quella effettivamente disponibile.
Ma alla fine deve mappare l'indirizzo logico all'indirizzo effettivamente fisico. Ora come sta aumentando la memoria?
Risposte:
Non sta affatto aumentando la memoria fisica . Il suo scopo è completamente diverso. Ciò che può fare è rendere disponibili altri archivi di supporto che consentono ai programmi di utilizzare più memoria di quanto sia fisicamente disponibile.
La memoria virtuale viene utilizzata per separare e isolare i processi l'uno dall'altro e consentire anche che l'accesso alla memoria venga deviato verso posizioni alternative.
La memoria virtuale consente al sistema di assegnare a ogni processo il proprio spazio di memoria isolato da altri processi. Con i programmi che funzionano efficacemente nel proprio spazio, consente loro di avere pieno accesso all'intero spazio degli indirizzi anziché dover aggirare altri programmi che potrebbero anche aver bisogno di utilizzare gli "stessi" indirizzi. Ciò ha l'effetto collaterale di aumentare l'affidabilità e la sicurezza poiché i processi non possono facilmente interferire tra loro.
Lo spazio di memoria virtuale di un'applicazione viene creato in base alle esigenze. Un'applicazione sembra (a se stessa) di trovarsi in un singolo blocco contiguo di memoria ma potrebbe effettivamente essere completamente sparpagliata nella memoria fisica.
La memoria virtuale consente inoltre di intercettare e deviare gli accessi alla memoria, il che ci consente di utilizzare funzionalità come un file di scambio. Ciò significa che possiamo spingere parti di memoria che non sono state recentemente utilizzate su disco e impostare un puntatore che dice "questo blocco di memoria si trova nel file x nella posizione y" e quindi possiamo liberare la memoria fisica area per l'utilizzo da parte di un'altra applicazione. Quando un'applicazione necessita di tale memoria, può essere letta di nuovo dal disco, posizionata in una posizione della RAM fisica (potenzialmente diversa da quella in cui era prima) e mappata nella stessa posizione della memoria virtuale di prima.
Allo stesso modo in cui viene utilizzato il file di paging, la memoria virtuale può anche consentire al sistema operativo di eseguire effettivamente il caricamento "pigro" di librerie condivise per un programma. Quando il programma principale comunica al sistema operativo che desidera utilizzare una particolare libreria, il sistema operativo può risparmiare tempo controllando i requisiti per la libreria, allocando lo spazio nell'area di memoria virtuale per l'applicazione, ma anziché caricare l'intera libreria in esso può rinviare il caricamento delle pagine della libreria dal disco fino a quando non sono effettivamente necessarie. In questo modo le uniche parti della libreria che vengono caricate nella RAM sono le parti effettivamente utilizzate dal programma, le parti che non vengono mai utilizzate non vengono mai caricate e quindi non sprecano RAM.
Usando queste tecniche miglioriamo la stabilità del sistema e consentiamo a più processi di funzionare in uno spazio limitato senza che si influenzino indebitamente a vicenda. Non "aumenta la memoria", ma ci consente invece di utilizzare in modo più efficace ciò che abbiamo.
Il file di swap è attivata per sistemi di memoria virtuale, ma in passato era confuso come essendo la memoria virtuale.
Il sistema dovrà mappare ciascun indirizzo virtuale all'indirizzo fisico quando viene utilizzata quella memoria, ma non tutta la memoria viene utilizzata contemporaneamente . Ad esempio, supponiamo di avere 20 schede nel browser, ognuna con 1 GB di memoria. Nel sistema operativo senza supporto di memoria virtuale, sono necessari 20 GB di RAM per farlo funzionare. Il trucco è che non sfogli tutte e 20 le schede contemporaneamente, quindi il sistema operativo con memoria virtuale ti consentirà di utilizzare il tuo browser in quel modo con solo un paio di GB di RAM, scambiando le schede inattive su disco.
La memoria virtuale non viene utilizzata esclusivamente per lo scambio. Il suo scopo principale è in realtà quello di evitare la frammentazione della RAM, che è un grosso problema sui sistemi senza gestione della memoria virtuale: potresti avere 1 GB di RAM libera, ma se arriva in pezzi da 10 MB, un'applicazione che richiede 100 MB non sarà in grado di funzionare .
Nel tempo, la memoria virtuale ha trovato ancora più usi, in particolare l'accesso casuale ai file: molte applicazioni come i database diventeranno dolorosamente lente se sono costrette a leggere i file in sequenza e funzioneranno molto più velocemente se il sistema operativo consente loro di far finta che l'intero file si trovi in (virtuale ) memoria e ottimizzazione dell'IO del disco e della cache in base ai modelli di accesso.
La memoria virtuale non aumenta la memoria, nel senso di aggiungere effettivamente altro hardware di memoria principale. Ma può aumentare la gamma di indirizzi utilizzabili . Quindi si potrebbe avere un programma in esecuzione costituito da un segmento di codice e un segmento di dati (stack & heap) ed entrambi potrebbero occupare un intervallo di indirizzi virtuali più ampio dell'intervallo di indirizzi fisici forniti dallo spazio di archiviazione fisicamente reale del macchina. Il trucco è che solo una piccola parte di quegli indirizzi virtuali è supportata dalla memoria principale fisica in qualsiasi momento [ma alla fine tutto è supportato dalla memoria del disco] . Questo funziona a causa del fenomeno della località di riferimento: In qualsiasi momento, vengono eseguite solo le istruzioni in una o più piccole sezioni contigue del segmento di programma e solo i dati in una o più piccole sezioni contigue del segmento di dati vengono gestiti su [ovviamente il comportamento è in realtà più complesso , ma segue questo schema per gran parte del tempo]
Comprendo che la memoria virtuale ingannare il programma visualizzando più memoria di quella effettivamente disponibile.
La motivazione originale per la memoria virtuale era una forma di gestione della memoria per fornire uno spazio di indirizzi più ampio della memoria fisica.
Il software potrebbe utilizzare l'intero spazio degli indirizzi della CPU (ad es. 2 ^ 32 spazi degli indirizzi) mentre la memoria fisica effettivamente installata era solo una frazione di quel numero.
I programmi di grandi dimensioni potrebbero essere portatili tra i computer che utilizzavano la memoria virtuale senza imporre enormi requisiti di memoria (installata).
Questo uso della memoria virtuale risaliva ai tempi dei computer mainframe e della memoria core in ferrite (che era fisicamente a bassa densità e costosa).
Ma alla fine deve mappare l'indirizzo logico all'indirizzo effettivamente fisico. Ora come sta aumentando la memoria?
La memoria virtuale si è evoluta da una semplice tecnica per fornire più spazio di indirizzi per il programma.
La memoria virtuale è un componente chiave nel fornire sicurezza a ciascun processo nei moderni sistemi operativi, in modo che un processo non possa interferire con un altro processo, né essere compromesso da un altro processo.
Ma multiprocessing (da non confondere con multiprocess OR ) con la memoria virtuale ancora non fornire memoria più evidente per il sistema di memoria fisica.
Ogni processo creato è dotato di un proprio spazio di indirizzi virtuale, ovvero di una propria memoria virtuale.
La quantità di memoria fisica effettivamente utilizzata (e mappata alla memoria virtuale) per ciascun processo è dinamica. In genere solo la memoria virtuale che contiene il codice (aka testo) e le pagine / i segmenti di dati per eseguire l'esecuzione del processo viene mappata sulla memoria fisica (ovvero residente in memoria).
Il codice non essenziale (perché non è attualmente eseguito) e i dati (perché non vengono referenziati / elaborati) non devono essere costantemente residenti in memoria. Il codice e / o le pagine / i segmenti di dati possono essere "scambiati" nell'archivio di backup (ad es. Spazio di scambio o file di pagina su un HDD o SSD), e successivamente "scambiati (indietro) in" secondo necessità (ovvero "su richiesta" ).
La memoria virtuale facilita l'uso efficiente della memoria fisica finita tra numerosi processi, ognuno con il proprio spazio di indirizzi virtuale protetto. La somma di queste memorie virtuali sarebbe in genere maggiore della memoria fisica installata.
La "memoria aumentata" è ora dal punto di vista del sistema e non solo dal punto di vista del programma.
La memoria virtuale aumenta la quantità di dati che un programma può indirizzare. Dal punto di vista del software, (in genere) non ci interessa dove sono archiviati i dati. Potrebbe essere memorizzato nella memoria DRAM fisica, potrebbe essere memorizzato su un'unità flash collegata alla macchina o potrebbe anche essere memorizzato su un piatto rotante. Ciò che interessa al software è che, quando chiede di accedere a tali dati, ha successo.
In pratica, vogliamo anche che i programmi funzionino velocemente. Per considerazioni sulla velocità , ci preoccupiamo della posizione dei dati. Vogliamo che i dati a cui accediamo più spesso siano archiviati in hardware che consenta l'accesso più rapido. I nostri programmi sarebbero piacerebbe correre tutto fuori DRAM. Tuttavia, spesso non abbiamo abbastanza DRAM per farlo. La memoria virtuale è una soluzione.
Con la memoria virtuale, il sistema operativo "elabora" i dati che non sono stati utilizzati da un po 'di tempo, memorizzandoli su un disco rigido. Questo è ancora accessibile, solo lento. Se il programma richiede dati che si trovano sul disco rigido, il sistema operativo deve impiegare del tempo per leggere i dati dal disco e spostarli nuovamente in DRAM.
In teoria, potrebbe semplicemente leggere i dati direttamente dal disco. Tuttavia, ci sono ragioni per cui non è stato fatto in questo modo. I programmi non vogliono essere consapevoli di tutte queste complicazioni. Possiamo e fare software di scrittura che inserisce in modo intelligente i dati sul disco (si chiama cache). Tuttavia, ci vuole molto lavoro extra. Il più veloce che possiamo fare nel codice è:
if data is not in memory
read data from disk into memory
operate on data
Un lettore astuto noterà che, anche se i dati sono in memoria, abbiamo dovuto disporre di una condizione per verificare se sono presenti. Questo è molto più lento del semplice operare direttamente nella memoria!
La memoria virtuale risolve questo problema eseguendo il check-in dell'hardware sulla CPU. La CPU è in grado di eseguire questa operazione di memoria virtuale molto rapidamente perché può dedicare hardware ad essa. Qualsiasi tentativo di eseguire questa operazione nel solo software deve utilizzare le parti generiche della CPU, che sono naturalmente più lente rispetto ai transistor dedicati.
Questo porta al motivo per cui rimandiamo sempre i dati nella memoria piuttosto che semplicemente leggendoli dal disco e lasciandoli a quello. Suddividiamo la memoria in "pagine", ciascuna delle quali è contrassegnata come presente o non presente nella memoria. Il sistema operativo mantiene questa tabella in un formato che può essere utilizzato direttamente dalla CPU. Ogni volta che un programma accede ai dati presenti, l'hardware della CPU consente loro di accedere direttamente ai dati nella DRAM. Quando i dati non sono presenti, viene emesso un "errore di pagina", che indica al sistema operativo di caricare quella pagina dal disco in una pagina di memoria fisica e di aggiornare la tabella per indirizzare la CPU verso questa nuova pagina fisica.
La chiave di tutto questo problema è minimizzarne l'utilizzo. In pratica, scopriamo che i sistemi operativi sono molto bravi a scegliere quali dati conservare in memoria e quali dati eseguire il paging su disco, quindi la maggior parte degli accessi alla memoria si verificano senza mai causare un errore di pagina.
Lo fa rendendo temporanee le voci della mappa.
Quando un programma accede a un indirizzo logico, la CPU cerca nella mappa un indirizzo fisico corrispondente. Se viene trovato, l'accesso alla memoria procede come previsto; se non viene trovato, è necessario allocare un indirizzo fisico e caricare il contenuto da un'altra memoria, lo "spazio di scambio". Se ogni indirizzo fisico è già stato assegnato a un indirizzo logico, alcuni indirizzi logici devono essere "scambiati" (il loro contenuto salvato nello spazio di scambio) per rendere disponibili gli indirizzi fisici.
La memoria massima allocata è la dimensione dello spazio di scambio, che può essere molto più grande della memoria installata. Potrebbe essere utile pensare allo spazio di swap come alla memoria "reale" e alla RAM come cache ad alta velocità per lo spazio di swap.
(Questa è lungi dall'essere una descrizione completa, ha lo scopo di rispondere alla domanda immediata senza entrare nei dettagli rilevanti ma non necessari.)
Il concetto di base si basa sul fatto che una moderna CPU può gestire le tabelle di traduzione tenendo traccia di "quali intervalli di indirizzi è stato assegnato un determinato processo da utilizzare e quali indirizzi fisici (si pensi a linee A00..Axx su un bus di memoria), SE QUALUNQUE , attualmente vengono utilizzati per archiviare effettivamente i dati. "SE QUALUNQUE" perché "nessuno" è uno stato possibile e accettabile: in questo caso, una condizione di errore (un cosiddetto "errore di pagina") verrà sollevata a livello hardware - e questo errore attiverà un gestore a livello di sistema operativo che può, ad esempio, caricare i contenuti della memoria che sono stati scritti in un file di scambio in qualsiasi posizione libera nella memoria fisica (in caso di lettura) o trovare una posizione effettiva per mettere cose (in caso di scrittura), aggiorna la suddetta tabella di traduzione,e solo allora il controllo manuale torna al processo che ha tentato di accedere a quella memoria .. e che non sarà nessuno il più saggio di quello che è successo.
Memoria virtuale:
1) consente di mappare un ampio spazio di indirizzi virtuali su una minore quantità di memoria fisica, con l'eccesso di "scambio" su disco, o SSD o prospetticamente su NVRAM e altri dispositivi.
2) consente di mappare uno spazio di indirizzi virtuali più grande (ad es. 64 bit) su uno spazio di indirizzi fisico più piccolo (ad es. 32 o 64 bit)
3) consente di mappare uno spazio di indirizzamento virtuale più piccolo (ad es. 32 bit) su uno spazio di indirizzamento fisico più ampio (ad es. 40 bit), e quindi consente alle applicazioni meno recenti di sfruttare una DRAM fisica maggiore.
4) consente che la memoria fisica che noi frammentiamo e non contigua nello spazio degli indirizzi fisici sia resa contigua nello spazio degli indirizzi virtuali.
5) consente ai processi di disporre dei propri spazi di indirizzi virtuali e quindi di essere isolati gli uni dagli altri.
6) consente a diversi indirizzi virtuali che accadono di condividere gli stessi valori di dati per allocare una singola pagina fisica.
Ciò può accadere all'interno di un singolo processo o sistema operativo: la maggior parte dei sistemi operativi derivati UNIX BSD ha una sola pagina di zero di sola lettura, che può essere mappata in qualsiasi pagina virtuale a riempimento zero, in genere COW (Copia su scrittura - legge solo zeri, scrive intrappolato e pagina non condivisa e resa scrivibile).
Può succedere tra processi - ad esempio UNIX fork () crea processi figlio che condividono quasi tutta la memoria virtuale in modo COW.
Può succedere tra sistemi operativi, ad esempio i sistemi operativi guest su un host di macchine virtuali possono avere pagine deduplicate, COW condivise, ecc. (Alcuni recenti attacchi alla sicurezza ne hanno approfittato.)
7) la memoria virtuale può consentire a parti dello spazio di indirizzi virtuali di essere mappate su file o su memoria mappata su altri processori, sia nello stesso sistema multiprocessore, sia attraverso Internet.