Entendendo Memoria Virtual no Windows - Virtual/Committed/Shared/Reserved.
A maioria das pessoas que atua na área técnica, ao ouvirem falar do termo “Memória” rapidamente associam o termo com Memória RAM (Memória Física). Porém os processos que rodam no Windows, como notepad.exe ou calc.exe, não acessam a memória física diretamente, são pouquíssimos os que fazem isso.
Os processos no Windows utilizam o Virtual Memory Concept que traduzindo ao pé da letraquer dizer “Conceito de Memória Virtual”. Um processo 64bits que roda no Windows Server 2012 possui um limite de Memória Virtual de 8TB (Terabytes) em User Mode e o sistema operacional, por sua vez, possui um limite de 8TB em Kernel Mode. A menor unidade de alocação no Sistema Operacional Windows é uma página de memória, com tamanho de 4KB.
Antes de pensar em memória física, pense que cada processo que roda Windows vive em um mundo Virtual só para ele e que nesse mundo ele pode endereçar 8TB de Memória. Esse endereçamento de Memória é Virtual, não depende da quantidade de Memória RAM (Física) que a sua máquina possui, exatamente por isso que o nome é Memória Virtual. Por exemplo, um servidor com 50 Gigabytes de RAM, possui vários processos sendo executados (ex. notepad.exe e calc.exe) e cada um deles possui uma área de 8TB. Esse espaço Virtual é chamado de Virtual Address Space (VAS).
Veja na imagem abaixo o tamanho do VAS disponível para cada processo em diferentes versões do Windows.
A memória virtual pode estar nos seguintes estados: Free, Committed e Reserved. Para ajudar na compreensão, vamos imaginar analogia:
Reserved Memory
Imagine que você sairá de férias em 3 meses, férias das quais você resolve viajar para um destino na Europa. Para que isso aconteça, você acessa um portal de uma agência de turismo de sua preferência, escolhe um voo, reservauma passagem aérea e um albergue para se hospedar. Quando você efetua essa compra e a reserva pelo site, no momento que a transação é aprovada, não significa que alguém da companhia área vai sair correndo e isolar aquele assento do avião para você, naquele momento, sendo que você só vai utilizar daqui a 3 meses. A companhia vai querer aproveitar ao máximo o uso do avião todos os dias que antecedem o seu voo. Seu assento será utilizado até que chegue a data e hora marcada de sua viagem. Nesta ação, você efetuou apenas uma reserva.
Quando falamos de Reserved Memory (Memória reservada) ocorre algo parecido. Quando um Processo precisa utilizar uma área de memória especifica, ele primeiramente deve reservar aquela área, o que não quer dizer que o processo está utilizando aquela área efetivamente. É como quando programamosem alguma linguagem, que declaramos um Array de variáveis e atribuímos 10 mil posições para ele. No momento da declaração, não estamos atribuindo nenhum valor para o Array, apenas estamos preparando ele para receber os 10 mil valores. Neste momento efetuamos uma “reserva” dessas posições, tal como a Reserved Memory do sistema . Reservar Memória é um passo obrigatórioantes de que ela seja efetivamente utilizada.
Committed Memory
Imagine que chegou o grande dia das suas tão sonhadas férias. Você chega com suas malas ao aeroporto e vai diretamente ao balcão da companhia aérea para efetuar check-in do seu voo. Quando você efetua o Check-in, naquele momento você implicitamente está dizendo que chegou o dia e a hora programada para o voo e agora você quer usar o assento que reservou previamente. Você faz o check-in e está prestes a utilizar aquele assento. Para que isso ocorra, obviamente não poderá haver ninguém utilizando aquela mesma área no momento, porque só assim você vai adquirir lugar no voo. Quando falamos Committed Memory, que vou “aportuguesar” algumas vezes nesse artigo usando o termo “Memória Commitada”, quero dizer para o Windows Memory Manager que aquele pedaço da minha memória virtual, eu irei escrever algo nele. Para isso eu preciso desse espaço físico. Quando o Memory Manager concede esse espaço de memória requerido ele está garantindo que o processo está “apoiado” por Memória física (RAM ou PagingFile) e livre para escrever algo lá. É apenas nesse momento que o consumo de memória se torna físico realmente, nesta hora que aqueles 50GB que mencionei nos parágrafos iniciais vão fazer toda a diferença. Se você tiver RAM/Paging File para atender a requisição, o Windows Memory Manager concede, caso contrário não, tal como na analogia feita acima, pode ocorrer de você ter sua passagem área paga e devidamente reservada, mas na hora efetuar o check-in a atendente lhe informar que seu voo deu overbooking e que por isso você não poderá mais embarcar (cenário nada divertido).
Physical Memory
Mas vamos ser otimistas, imagine que seu check-in foi efetuado com sucesso, agora você já está com seu assento prometido para o voo. Em se tratando de memória é igual, quando o Memory Manager concede ao processo “commitar” ele está prometendo memória física (committed) para ele, dizendo: processo pode escrever que seu espaço já está garantido. Quando o processo escreve em uma área de memória “commitada”, dizemos que essa memória foi tocada (touched memory) e neste momento é que estamos falando de Memória RAM propriamente dita, essa memória tocada do processo é chamada de WorkingSet que vai aparecer no Perfmon.exe contador Process\Workset(processo). Na analogia é equivalente se você subisse no avião e se sentasse no assento efetivamente.
Private and Shared Memory
Imaginando novamente as suas férias, lembre-se que usamos um albergue como exemplo para a sua hospedagem. Como vocês sabem, um quarto de Albergue, é compartilhado com outras pessoas, ou paga-se um pouco mais para ter um quarto só pra você. Imagine então que você fez isso, reservou um quarto só pra você, porém como nem tudo são flores, o banheiro do seu albergue é compartilhado com outros quartos. Quando falamos de memória, funciona de forma parecida. Por sua vez, committed memory é dividida em duas categorias Private (Privada) e Shared (Compartilhada).
Veja a imagem abaixo:
A memória privada de um processo se refere apenas àqueles endereçamentos de memória daquele mesmo processo. Da mesma maneira quando se abre o notepad.exe duas vezes na mesma máquina e se escreve um texto qualquer diferente em cada uma das instâncias do notepad.exe, essa parte diferente do texto fica na Memória Privada (private) do processo.
Um processo quando é carregado e está ativo, ele carrega os dados de suas DLLs em memória. Essas DLLs são comuns entre os Notepads e possuem componentes comuns que são necessários para toda instância aberta do processo. Para que isso ocorra, o processo utiliza o file-mapping object para acessar uma mesma área de um VAS de um outro processo, com isso, os dois processos (através de seu VAS) enxergam aquela mesma área como parte do seu Virtual Address Space, tal como no exemplo da imagem acima. Essa área é chamada Shared Memory.
Observe a imagem abaixo:
Agora veja que fato interessante, não há contadores no Performance Monitor(Perfmon.exe) para descrever todos esses estados mencionados neste post. O contador Process\Virtual Bytes é o contador que se refere ao Virtual Address Space (VAS) do processo, entretanto, não há nenhum contador para Committed Memory dele, o que existe é um contador que representa a parte Privada do processo que no caso é o Process\Private bytes, além destes não há contadores do Perfmon para representar Shared/Reserved da memória virtual.
Caso haja interesse em saber o total de memória Private, Committed e Shared de um determinado processo, o VMMap, que é uma ferramenta do sys.internals, te ajuda a mostrar a utilização de Memória dele.
Veja a imagem abaixo:
Porque falar de memória no Windows em um blog de SQL Server?
Quando há um servidor com uma instância SQL Server na máquina, não podemos esquecer que pode haver outros processos consumindo memória ao ponto de afetar aquela instância, por isso em cenários de troubleshooting de memória é pode ser útil entender esses conceitos, saber utilizar tools como Process Explorer/Process Monitor e VMMAP e para obter informações sobre seu consumo.
Para quem quiser saber mais sobre o assunto, veja as fontes abaixo:
https://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx?PageIndex=2
https://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366876(v=vs.85).aspx
Alberto Antonio Lima
Comments
Anonymous
September 10, 2014
Como sempre, mto bom! Parabéns! Um dos assuntos que mais gosto de estudar, memória.Anonymous
September 10, 2014
Muito bom Alberto... Mais um excelente post... Keep blogginh []'sAnonymous
September 10, 2014
esse é um assunto legal, parabéns...Anonymous
September 10, 2014
Ótimo post! Muito obrigado por compartilhar conhecimento informativo e didático ao mesmo tempo. Curti mesmo esse formato técnico atrelado com analogias. []'sAnonymous
September 11, 2014
Excelente post, Alberto. Muito interessante! Obrigado por compartilhar!Anonymous
September 11, 2014
Fico feliz que curtiram Liliam, Alex e Edvaldo. Tive um pouco mais de trabalho pra montar esse...rsrsAnonymous
September 11, 2014
Renato e Gustavo, O objetivo é esse, tentar falar de alguns alguns assuntos que sinto que a galera confunde um pouco, outros que não tem muito assunto sobre e tentar compartilhar da melhor maneira possível. Fico Fliz que gostaram e obrigado pelo feedback!Anonymous
September 11, 2014
Grande Alberto! Excelente o post! Parabéns! só tive tempo de ler agora ¬¬ Abraço!!!Anonymous
October 06, 2014
Ótima Analogia Alberto, Parabéns !!!Anonymous
April 19, 2016
Adorei a analogia com as reservas de passagem e hotel.. Muito bom a explicação parabéns...