Partilhar via


Proteção de memória

A memória que pertence a um processo é implicitamente protegida pelo seu espaço de endereçamento virtual privado. Além disso, o Windows fornece proteção de memória usando o hardware de memória virtual. A implementação dessa proteção varia de acordo com o processador, por exemplo, páginas de código no espaço de endereço de um processo podem ser marcadas como somente leitura e protegidas contra modificações por threads de modo de usuário.

Para obter a lista completa de atributos, consulte Constantes de proteção de memória.

Proteção contra cópia ao gravar

A proteção contra cópia na gravação é uma otimização que permite que vários processos mapeiem seus espaços de endereço virtual de modo que compartilhem uma página física até que um dos processos modifique a página. Isso faz parte de uma técnica chamada de avaliação preguiçosa, que permite ao sistema conservar memória física e tempo, não realizando uma operação até que seja absolutamente necessário.

Por exemplo, suponha que dois processos carreguem páginas da mesma DLL em seus espaços de memória virtual. Essas páginas de memória virtual são mapeadas para as mesmas páginas de memória física para ambos os processos. Contanto que nenhum processo escreva nessas páginas, elas podem mapear e compartilhar as mesmas páginas físicas, conforme mostrado no diagrama a seguir.

caixas e setas do processo 1 e 2 páginas mapeadas para a mesma memória física

Se o Processo 1 gravar em uma dessas páginas, o conteúdo da página física será copiado para outra página física e o mapa de memória virtual será atualizado para o Processo 1. Ambos os processos agora têm sua própria instância da página na memória física. Portanto, não é possível que um processo escreva em uma página física compartilhada e que o outro processo veja as alterações.

caixas e setas de processos e remapeamento de memória física

Carregando aplicativos e DLLs

Quando várias instâncias do mesmo aplicativo baseado no Windows são carregadas, cada instância é executada em seu próprio espaço de endereço virtual protegido. No entanto, seus identificadores de instância (hInstance) normalmente têm o mesmo valor. Esse valor representa o endereço base do aplicativo em seu espaço de endereçamento virtual. Se cada instância puder ser carregada em seu endereço base padrão, ela poderá mapear e compartilhar as mesmas páginas físicas com as outras instâncias, usando a proteção contra cópia na gravação. O sistema permite que essas instâncias compartilhem as mesmas páginas físicas até que uma delas modifique uma página. Se, por algum motivo, uma dessas instâncias não puder ser carregada no endereço base desejado, ela receberá suas próprias páginas físicas.

DLLs são criadas com um endereço base padrão. Cada processo que usa uma DLL tentará carregar a DLL dentro de seu próprio espaço de endereço no endereço virtual padrão para a DLL. Se vários aplicativos podem carregar uma DLL em seu endereço virtual padrão, eles podem compartilhar as mesmas páginas físicas para a DLL. Se, por algum motivo, um processo não puder carregar a DLL no endereço padrão, ele carregará a DLL em outro lugar. A proteção contra cópia ao gravar força algumas das páginas da DLL a serem copiadas em páginas físicas diferentes para esse processo, porque as correções para instruções de salto são escritas dentro das páginas da DLL e serão diferentes para esse processo. Se a seção de código contiver muitas referências à seção de dados, isso poderá fazer com que toda a seção de código seja copiada para novas páginas físicas.