Há muito envolvido aqui, mas tentarei explicá-lo da maneira mais simples possível e de uma maneira aplicável a qualquer sistema operacional.
Existem dois princípios básicos aqui:
-
A soma total de tudo que precisa estar na RAM e as coisas que se beneficiariam de estar na RAM é quase sempre maior que o tamanho da RAM. As coisas que se beneficiariam de estar na RAM incluem conjuntos de trabalho de processo e a lista de espera. Este último contém dados e códigos que já estiveram em uso ativo, mas que, desde então, se tornaram inativos. Muito disso será usado novamente, alguns em breve, por isso é benéfico manter isso na RAM. Essa memória funciona como um tipo de cache, mas não é realmente essencial, portanto, está na categoria de memória disponível. Como a memória livre, ela pode ser dada rapidamente a qualquer programa que precise dela. No interesse da performance, a memória standby deve ser grande.
-
A frequência de uso dos blocos de memória está longe de ser aleatória, mas pode ser prevista com considerável precisão. A memória é dividida em blocos, muitas vezes 4K bytes. Alguns blocos são acessados muitas vezes por segundo, enquanto outros não são acessados por muitos minutos, horas, dias ou mesmo semanas, se o sistema estiver funcionando por tempo suficiente. Existe uma ampla gama de uso entre esses dois extremos. O gerenciador de memória sabe quais blocos foram acessados recentemente e quais não foram. É uma suposição razoável que um bloco de memória que tenha sido acessado recentemente será necessário novamente em breve. A memória que não foi acessada recentemente provavelmente não será necessária em breve. A longa experiência provou que este é um princípio válido.
O gerenciador de memória aproveita o segundo princípio para mitigar amplamente as conseqüências indesejáveis do primeiro. Para fazer isso, ele faz um ato de balanceamento de manter os dados acessados recentemente na RAM enquanto mantém dados raramente usados nos arquivos originais ou no arquivo de paginação.
Quando a RAM é abundante, esse ato de equilíbrio é fácil. Muitos dos dados não usados recentemente podem ser mantidos na RAM. Esta é uma boa situação.
As coisas ficam mais complicadas quando a carga de trabalho aumenta. A soma total de dados e códigos em uso é maior, mas o tamanho da RAM permanece o mesmo. Isso significa que um subconjunto menor disso pode ser mantido na RAM. Alguns dos dados menos usados recentemente não podem mais estar na RAM, mas devem ser deixados no disco. O gerenciador de memória tenta manter um bom equilíbrio entre a memória em uso ativo e a memória disponível. Mas à medida que a carga de trabalho aumenta, o gerenciador de memória será forçado a fornecer mais memória disponível para os processos em execução. Esta não é uma boa situação, mas o gerenciador de memória não tem escolha.
O problema é que mover dados de e para a RAM enquanto os programas são executados leva tempo. Quando a RAM é abundante, isso não acontece com muita frequência e nem será notado. Mas quando o uso de RAM atinge altos níveis, isso acontece com muito mais frequência. A situação pode se tornar tão ruim que gasta-se mais tempo transferindo dados de e para a RAM do que o gasto na sua utilização real. Isso é uma surra, algo que o gerenciador de memória tenta evitar muito, mas com uma alta carga de trabalho, muitas vezes não pode ser evitado.
O gerenciador de memória está do seu lado, sempre tentando manter o melhor desempenho, mesmo sob condições adversas. Mas quando a carga de trabalho é ótima e a memória disponível fica curta, ela deve fazer coisas ruins para continuar funcionando. Isso é de fato o mais importante. A prioridade é a primeira a manter as coisas funcionando, então faça o mais rápido possível.