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
http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx



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

Comments (0)

Skip to main content