Shared Memory

Pergunta: Por que não posso apagar um arquivo DLL que está em uso no Windows?

Para responder essa pergunta, começarei com uma outra pergunta: Qual a diferença entre Shared e Private Working Set? (veja os números em WS Private e WS Shareable/Shared na figura abaixo).

image

A resposta está na tradução: shared corresponde a memória compartilhada, enquanto que private é exclusiva do processo.

O fato de compartilhar memória permite realizar transferência de dados entre os processos. Por exemplo, um dos protocolos de comunicação do SQL Server é Shared Memory (Desenvolvedores: há um exemplo de como compartilhar memória no MSDN – Named Memory Object).

Será que existe algum outro uso para Shared Memory?

Por incrível que pareça sim! Todas as DLL são carregadas na forma de Shared Memory. O Sistema Operacional carrega a imagem da DLL uma única vez na memória RAM e permite que todos os processos compartilhem esse arquivo através do mapeamento de memória virtual. Como o Windows marca esse mapeamento como read-only, o conteúdo em memória é idêntico ao conteúdo em disco. Caso haja falta de memória, a DLL não será copiada para o Page File porque as informações estão sempre disponíveis em disco. Sempre que uma DLL está em uso por um processo, ela funciona como um “Page File” para o Windows. Se houver necessidade de paginação, o Windows utiliza o próprio arquivo para preencher a memória RAM.

Voltando a pergunta: Por que não posso apagar uma DLL que está em uso?

Um arquivo DLL é sempre carregado como File-Backed Section, ao invés de Page-File-Backed Section. Assim como não é possível deletar o Page File, não é possível apagar um arquivo DLL em uso.

Referência

MSDN - Creating Named Shared Memory
https://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

File-Backed and Page-File-Backed Sections
https://msdn.microsoft.com/en-us/library/ff545754(VS.85).aspx