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

23

Tanto quanto eu entendo paginação e troca, eles são conceitos completamente diferentes. Enquanto a troca significa que um processo está 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 podem estar no disco rígido.

Mas por que o linux precisa de uma partição swap então? 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 simplesmente não entendo por que alguém precisa de uma partição de swap (ou troca em geral), então?

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

JohnnyFromBF
fonte
5
Cuidado que a "memória virtual" na arquitetura do computador é uma técnica, enquanto o MS Windows (incorretamente IMO) a define como "A memória virtual é o espaço de armazenamento no disco rígido do computador que o Windows usa em conjunto com a memória de acesso aleatório (RAM)". IE google windows "memória virtual"
sawdust

Respostas:

25

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

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

Patuck
fonte
6
E dessa maneira também é mais fácil compartilhar uma única partição de troca entre instalações do Linux.
oKtosiTe
3
normalmente um arquivo de paginação é completamente criado no primeiro boot, por isso não vai ser fragmentado (bem .. ainda há algumas possibilidades ..)
AndreaCi
12
Os UNIX mais antigos tinham apenas troca, não paginação, e só podiam trocar para uma partição dedicada. A paginação foi implementada assim que o hardware o suportou, mas o nome "swap partition" travou. A paginação para um arquivo é mais recente e possui maior sobrecarga do SO, além de arriscar a fragmentação, por isso ainda é desencorajada.
Zwol
1
"partição swap é usada como memória virtual." - Somente o Microsoft Windows define armazenamento secundário (por exemplo, arquivo de paginação no disco) como "memória virtual". Mas mesmo eles estão tentando se afastar desse uso. Experimente pesquisar na "memória virtual" do Windows e a sinopse para o primeiro resultado ("Memória virtual é espaço de armazenamento ...") não corresponde ao conteúdo da página. Uma declaração correta seria uma "partição de troca usada pela memória virtual".
sawdust
14

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 é usado há algumas décadas. Citando a Wikipedia :

Historicamente, a troca se referia à mudança de / para o armazenamento secundário de um programa inteiro por vez, em um esquema conhecido como roll-in / roll-out. Na década de 1960, após a introdução do conceito de memória virtual - em duas variantes, usando segmentos ou páginas -, o termo troca foi aplicado à movimentação, respectivamente, de segmentos ou páginas, entre disco e memória. Hoje, com a memória virtual baseada principalmente em páginas, não em segmentos, a troca tornou-se um sinônimo bastante próximo de paginação, embora com uma diferença.

De fato, em qualquer contexto envolvendo Linux (ou outros sistemas unix), paginação e troca são praticamente sinônimos. Ambos se referem ao uso de memória virtual, onde os dados da página podem ser armazenados na RAM ou no disco. (É provável que uma página tenha 4kB em qualquer dispositivo que você encontre.) O programa que usa a página de memória não se importa nem sabe onde os dados são armazenados, apenas continua usando o endereço virtual. O kernel transfere dados entre a RAM e o disco e atualiza as tabelas MMU à medida que avança para que a entrada do endereço virtual aponte para uma página física na memória ou contenha um valor especial que faça com que o processador execute algum código do kernel que carregará os dados apropriados do disco.

Paginação refere-se a esse processo genérico. A troca 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 precisa ser carregado na memória para ser executado; se uma página de código precisar ser removida da RAM para liberar espaço para outra coisa, não será necessário gravar essa página na área de troca, pois ela poderá ser carregada novamente a partir do arquivo do 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 procurará uma página na RAM (não um processo inteiro) que não tenha sido usada recentemente. Se essa página reproduzir o conteúdo de um arquivo de disco (existem tabelas no kernel para indicar isso), a página poderá ser recuperada. Caso contrário, a página é gravada para troca e, em seguida, recuperada. De qualquer maneira, 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 está na RAM e pode reutilizar a página física para outra coisa (um programa diferente ou outra página de o mesmo programa).

Gilles 'SO- parar de ser mau'
fonte
O primeiro parágrafo da sua resposta diz a ele de onde ele tirou a idéia: documentos antigos . (Lembro-me de quando havia também uma diferença entre troca e paginação.)
RonJohn
9

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

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

Normalmente, os programas no espaço do usuário solicitam 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 acompanhar quanto e que memória um programa está alocado.

Esse mecanismo de "falha de página" também pode permitir que o kernel troque a página que o processo estava tentando acessar com um disco, se o kernel puder provisionar a memória em excesso (e o Windows e o Linux suportam isso), por isso é chamado de troca. Se o acesso à memória for realmente inválido (ou seja, o processo está tentando acessar a memória que não foi solicitada primeiro), normalmente o processo será interrompido com um SIGSEGV.

Portanto, a "troca" é um recurso adicional (no Linux, você pode desativá-lo completamente, se quiser), que depende da memória / paginação virtual, mas não é necessário apenas porque uma CPU possui memória / paginação virtual. Os conceitos não são os mesmos, mas a troca depende da paginação / memória virtual para existir.


Além disso, depois de ler mais de perto sua pergunta, "paginação" às vezes é usado como sinônimo de "troca" - mas nunca ouvi falar de "troca", o que significa que toda a memória do processo é trocada versus "paginação", que significa apenas parte de é trocado.

Mas por que o linux precisa de uma partição swap então? 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.

"Memória virtual" é memória física, apenas "remapeada". O hardware da MMU não pode mapear diretamente para nenhum dispositivo de armazenamento. A MMU pode lançar uma falha que informa ao kernel que um processo tentou acessar a memória que não deveria ter - e o kernel pode usar esse mecanismo para verificar se um processo deseja algo de volta do disco que ele pensou estar na memória e, em seguida, faça o " troca". O ponto é que é o sistema operacional que decide salvar as páginas no disco para que elas possam ser usadas em outros processos, não no hardware.

LawrenceC
fonte
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 sistema operacional decidiram assumir que há mais memória no sistema, chamada "memória virtual".

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

Os desenvolvedores também propuseram que o uso da parte da memória virtual localizada no disco rígido deve ser o mais baixo possível. Por isso, toda a memória virtual foi dividida em pequenas porções chamadas "páginas". Muitas páginas são usadas em baixa taxa; essas páginas devem ser gravadas na parte da memória virtual no disco rígido. Esta operação é chamada "swap out". O sistema operacional deve acompanhar quais páginas não estão na memória física para encontrá-las quando necessário. A falha na página ocorre quando um programa deseja 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 da memória e você pode ver uma estatística do uso da 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. Além disso, este link explica também a memória virtual e o uso vmstat.

soroosh
fonte