Por que o Linux usa uma partição de troca quando o kernel suporta paginação / memória virtual?

23

Tanto quanto eu entendo paginação e troca, eles são conceitos completamente diferentes. Embora a troca signifique que um processo esteja completamente na memória física ou no disco rígido, as partes de paginação de um processo podem estar na memória física e outras partes podem estar no disco rígido.

Mas por que o Linux precisa de uma partição swap? Se a memória física estiver cheia, alguns processos serão terceirizados para o disco rígido e um novo processo será mapeado da memória virtual para a memória física.

Eu não entendo porque alguém precisa de uma partição swap (ou troca em geral) então?

Ou isso é apenas uma questão de terminologia e swap partition == virtual memory ?

    
por JohnnyFromBF 26.03.2013 / 14:50

4 respostas

25

Sim, é apenas uma questão de terminologia, em muitos casos, uma partição swap é usada como memória virtual.

A razão pela qual os sistemas UNIX e UNIX preferem as partições de troca aos arquivos de paginação é que eles podem ser contíguos, o que resulta em menores tempos de busca em comparação com um arquivo de paginação que pode ser fragmentado.

    
por 26.03.2013 / 14:59
14

Eu não sei de onde você tirou a noção de que "trocar significa que um processo está completamente na memória física ou no disco rígido". Esse significado não está em uso há algumas décadas. Citando Wikipedia :

Historically, swapping referred to moving from/to secondary storage a whole program at a time, in a scheme known as roll-in/roll-out. In the 1960s, after the concept of virtual memory was introduced—in two variants, either using segments or pages—the term swapping was applied to moving, respectively, either segments or pages, between disk and memory. Today with the virtual memory mostly based on pages, not segments, swapping became a fairly close synonym of paging, although with one difference.[dubious – discuss]

De fato, em qualquer contexto envolvendo Linux (ou outros sistemas unix), paginação e troca são praticamente sinônimos. Ambos se referem a um uso de memória virtual onde os dados da página podem ser armazenados na RAM ou no disco. (Uma página é de 4kB em qualquer dispositivo que você possa encontrar.) O programa que usa a página de memória não liga nem sabe onde os dados estão armazenados, apenas continua usando o endereço virtual. O kernel transfere dados entre a RAM e o disco e atualiza as tabelas MMU conforme vão avançando para que a entrada para o virtual o endereço aponta para uma página física na memória ou contém um valor especial que faz com que o processador execute algum código do kernel que carregará os dados apropriados do disco.

Paginação refere-se a este processo genérico. Swapping refere-se ao caso em que os dados no disco estão em uma área dedicada: a área de troca (uma partição de troca ou arquivo de troca). A paginação também pode ser feita entre a RAM e um arquivo e, nesse caso, geralmente não é referida como troca . Por exemplo, quando você executa um programa, o código deve ser carregado na memória para ser executado; Se uma página de código precisa ser removida da RAM para liberar espaço para outra coisa, então não há necessidade de escrever esta página na área de troca, porque ela pode ser carregada de volta a partir do arquivo de programa. (Isso pode ser feito para todos os dados somente leitura, não apenas para o código do programa).

Se a memória física estiver (quase) cheia, o kernel procura por uma página na RAM (não em todo um processo) que não tenha sido usada recentemente. Se essa página reproduzir o conteúdo de um arquivo em disco (existem tabelas no kernel para indicar isso), a página pode ser recuperada. Caso contrário, a página é gravada para trocar e depois recuperada. De qualquer forma, o kernel atualiza a entrada na tabela de memória virtual do processo (que se torna a tabela MMU enquanto o processo é executado) para marcá-la como não na RAM e pode reutilizar a página física para outra coisa (um programa diferente ou outra página de o mesmo programa).

    
por 26.03.2013 / 20:34
9

O recurso de memória virtual / paginação permite que um kernel "virtualize" a memória para processos de espaço do usuário. O kernel pode pegar páginas da memória física e organizá-las por meio de paginação, de modo que pareçam contíguas a um processo de espaço do usuário.

Um limite pode ser definido na memória de um processo de espaço de usuário e, se o processo for além, ocorrerá uma "falha de página", que causa uma exceção de CPU que retorna ao kernel. Isso evita que o programa userspace atrapalhe a memória alocada para o kernel ou outros programas, sem a permissão do kernel.

Normalmente, os programas userspace pedem ao kernel que estenda esse limite por meio de interfaces bem definidas (chamadas pelas funções C malloc() e free() , por exemplo). O kernel é responsável por rastrear quanto e qual memória um programa é alocado.

Esse mecanismo de "falha de página" também permite que o kernel troque a página que o processo estava tentando acessar com um do disco, se o kernel for capaz de provisionar a memória (e tanto o Windows quanto o Linux suportam isso). troca. Se o acesso à memória foi de fato inválido (ou seja, o processo está tentando acessar a memória que não pediu primeiro), então normalmente o processo será eliminado com um SIGSEGV.

Então, "trocar" é um recurso adicional (no Linux, você pode desabilitá-lo totalmente, se quiser) que depende da memória / paginação virtual, mas não é necessário apenas porque uma CPU tem memória / paginação virtual. Os conceitos não são os mesmos, mas a troca depende da existência de paginação / memória virtual.

Além disso, depois de ler mais atentamente a sua pergunta, "paging" às vezes é usado como um sinônimo de "troca" - mas nunca ouvi falar de "swapping" significando que a memória do processo inteiro foi trocada por "paging" apenas parte dela é trocada.

But why does linux need a swap partition then? If the physical memory is full, some processes will be outsourced to the hard drive and a new process will be mapped from virtual memory to physical memory.

"Memória virtual" é memória física, apenas "remapeada". O hardware da MMU não pode mapear diretamente para qualquer dispositivo de armazenamento. A MMU pode lançar uma falha que diz ao kernel que um processo tentou acessar a memória que ele não deveria ter - e o kernel pode usar esse mecanismo para ver que um processo quer algo do disco que ele pensou estar na memória e depois fazer o " troca". O ponto é que é o sistema operacional que decide salvar páginas em disco para que ele possa usar essas páginas para outros processos, não para o hardware.

    
por 26.03.2013 / 15:12
2

Em geral, a partição de troca não é igual à memória virtual.

Os processos podem precisar de mais memória do que a memória física real, então os desenvolvedores do SO decidiram assumir que há mais memória no sistema que é chamada de "memória virtual".

Esta memória virtual é basicamente a memória física e uma parte do disco. Esta parte do disco é chamada de "swap" no Linux.

Também os desenvolvedores propuseram que o uso da parte da memória virtual localizada no disco rígido deve ser o mais baixo possível. Para o efeito, toda a memória virtual foi dividida em pequenas porções que são chamadas de "páginas". Um monte de páginas são usadas em baixa taxa, essas páginas devem ser gravadas para a parte da memória virtual no disco rígido. Esta operação é chamada de "swap out". O sistema operacional deve controlar quais páginas não estão na memória física para encontrá-las quando necessário. A falha de página acontece quando um programa quer gravar / ler uma parte da memória que é trocada.

Para responder à sua pergunta: O Linux precisa de uma partição swap para trocar algumas páginas de memória e você pode ver uma estatística do uso de memória virtual com vmstat :

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

A coluna 'swap' mostra a troca e a estatística. Também este link explica a memória virtual e o uso de vmstat também.

    
por 26.03.2013 / 16:25