Condividi tramite


Protezione della memoria

La memoria appartenente a un processo è protetta in modo implicito dallo spazio indirizzi virtuale privato. Windows garantisce inoltre la protezione della memoria usando l'hardware di memoria virtuale. L'implementazione di questa protezione varia a seconda del processore, ad esempio le tabelle codici nello spazio indirizzi di un processo possono essere contrassegnate come di sola lettura e protette dalla modifica da thread in modalità utente.

Per l'elenco completo degli attributi, vedere Costanti di protezione della memoria.

Protezione da copia su scrittura

La protezione da copia in scrittura è un'ottimizzazione che consente a più processi di eseguire il mapping dei relativi spazi indirizzi virtuali in modo che condividono una pagina fisica fino a quando uno dei processi modifica la pagina. Questa è parte di una tecnica denominata valutazione lazy, che consente al sistema di risparmiare memoria fisica e tempo non eseguendo un'operazione fino a quando non è assolutamente necessario.

Si supponga, ad esempio, che due processi carichino pagine dalla stessa DLL negli spazi di memoria virtuale. Queste pagine di memoria virtuale vengono mappate alle stesse pagine di memoria fisica per entrambi i processi. Purché nessun processo di scrittura in queste pagine possa eseguire il mapping e la condivisione, le stesse pagine fisiche, come illustrato nel diagramma seguente.

caselle e frecce del processo 1 e 2 pagine mappate alla stessa memoria fisica

Se Process 1 scrive in una di queste pagine, il contenuto della pagina fisica viene copiato in un'altra pagina fisica e la mappa di memoria virtuale viene aggiornata per Il processo 1. Entrambi i processi ora hanno la propria istanza della pagina in memoria fisica. Pertanto, non è possibile che un processo scriva in una pagina fisica condivisa e che l'altro processo visualizzi le modifiche.

caselle e frecce di processi e rimmapping della memoria fisica

Caricamento di applicazioni e DLL

Quando vengono caricate più istanze della stessa applicazione basata su Windows, ogni istanza viene eseguita nel proprio spazio indirizzi virtuale protetto. Tuttavia, gli handle di istanza (hInstance) hanno in genere lo stesso valore. Questo valore rappresenta l'indirizzo di base dell'applicazione nello spazio indirizzi virtuale. Se ogni istanza può essere caricata nell'indirizzo di base predefinito, può eseguire il mapping e condividere le stesse pagine fisiche con le altre istanze, usando la protezione da copia in scrittura. Il sistema consente a queste istanze di condividere le stesse pagine fisiche fino a quando una di esse non modifica una pagina. Se per qualche motivo una di queste istanze non può essere caricata nell'indirizzo di base desiderato, riceve le proprie pagine fisiche.

Le DLL vengono create con un indirizzo di base predefinito. Ogni processo che usa una DLL tenterà di caricare la DLL all'interno del proprio spazio indirizzi all'indirizzo virtuale predefinito per la DLL. Se più applicazioni possono caricare una DLL all'indirizzo virtuale predefinito, possono condividere le stesse pagine fisiche per la DLL. Se per qualche motivo un processo non è in grado di caricare la DLL nell'indirizzo predefinito, carica la DLL altrove. La protezione da copia in scrittura forza la copia di alcune pagine della DLL in pagine fisiche diverse per questo processo, perché le correzioni per le istruzioni di salto vengono scritte all'interno delle pagine della DLL e saranno diverse per questo processo. Se la sezione del codice contiene molti riferimenti alla sezione dei dati, è possibile che l'intera sezione del codice venga copiata in nuove pagine fisiche.