Protezione della memoria

La memoria appartenente a un processo è protetta in modo implicito dallo spazio indirizzi virtuale privato. Inoltre, Windows fornisce la protezione della memoria usando l'hardware di memoria virtuale. L'implementazione di questa protezione varia con il processore, ad esempio le pagine codici nello spazio indirizzi di un processo possono essere contrassegnate in 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 in scrittura

La protezione da copia in scrittura è un'ottimizzazione che consente a più processi di mappare gli spazi indirizzi virtuali in modo che condividono una pagina fisica fino a quando uno dei processi modifica la pagina. Si tratta 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é nessuno dei processi scrive in queste pagine, può eseguire il mapping a e condividere le stesse pagine fisiche, come illustrato nel diagramma seguente.

boxes and arrows of process 1 and 2 pages mapped to same physical memory

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 Processo 1. Entrambi i processi hanno ora una propria istanza della pagina in memoria fisica. Pertanto, non è possibile scrivere in una pagina fisica condivisa e per l'altro processo per visualizzare le modifiche.

boxes and arrows of processes and physical memory remapping

Caricamento di applicazioni e DLL

Quando vengono caricate più istanze della stessa applicazione basata su Windows, ogni istanza viene eseguita nello spazio indirizzi virtuale protetto. Tuttavia, gli handle dell'istanza (hInstance) in genere hanno 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 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 può caricare la DLL nell'indirizzo predefinito, carica la DLL altrove. La protezione da copia in scrittura impone la copia di alcune pagine della DLL in pagine fisiche diverse per questo processo, perché le correzioni per le istruzioni jump vengono scritte nelle pagine della DLL e saranno diverse per questo processo. Se la sezione codice contiene molti riferimenti alla sezione dati, ciò può causare la copia dell'intera sezione del codice in nuove pagine fisiche.