sifion disse:mto bom!!! parabens!!!
alguém sabe me dizer, que diretivas o sistema usa para a alocação de memória swap? quer dizer, se o sistema já está utilizando toda a memória física e mais uma parte da swap... q critérios o sistema utiliza para decidir qual informação vai para a swap e qual vai para a memória física?
abraço...
Primeiro, para facilitar o entendimento, seja a seguinte nomenclatura: (i) a memória física principal (RAM) é dividida em blocos chamados molduras de página (page frames); (ii) o espaço ocupado por um processo é dividido em blocos chamados páginas (pages). Assim, uma página pode ou não estar contida em uma moldura, i.e., pode ou não estar na memória principal.
No Linux, o algoritmo utilizado para atender às solicitações de memória feitas pelos processos (aplicações) chama-se page frame reclaiming algorithm - PFRA. Esse algoritmo foi desenhado para permitir a alocação de molduras de página em várias situações: muita memória disponível, pouca memória disponível e situação crítica (quando não é possível alocar molduras para um determinado processo). Como o jqueiroz já citou, esse algorimo baseia-se numa método chamado LRU (least recently used - menos recentemente usado).
Simplificadamente, método LRU é implementado usando-se duas listas encadeadas: (i) inactive_list e (ii) active_list. Quando uma página, ao ser varrida pelo gerenciador de memória (mm), é identificada como inativa, uma marca (flag) é colocada na respectiva tabela de páginas; se receber duas marcas, irá para a lista inactive_list. Quando o gerenciador de memória (normalmente um serviço do kernel denominado kswapd) necessita de memória, irá escolher as molduras que estão no fim da lista para transferir seu conteúdo para o espaço de troca (swap space).
O algoritmo PFRA leva em consideração vários fatores para paginação, tais como se a página está compartilhada entre vários processos, se pertence ao buffer ou à cache, se é reservada, etc.
Se uma condição crítica ocorre, i.e., não é possível alocar uma moldura de página para um processo, e o espaço de troca também está totalmente ocupado, o kernel utiliza uma função chamada out of memory killer, que irá escolher um processo e matá-lo, para liberar suas páginas. Essa escolha não é aleatória, e utiliza certos parâmetros, como: não pode ser uma kernel thread, o processo init (pid 1) ou o swapper (pid 0); não deve ser um processo que esteja acessando determinados tipos de hardware, como o servidor X; não deve ser um processo iniciado pelo root; e assim por diante.
Em condições normais o processo kswapd irá tentar manter um certo número de molduras disponíveis - esse número normalmente estará entre dois valores - pages_low e pages_high - calculados a partir de outro valor, chamado pages_min (pages_low = (5/4) * pages_min e pages_high = (3/2) * pages_min) que é determinado na inicialização do kernel e que depende da quantidade de memória física instalada.