Por que o sistema operacional precisa copiar toda a memória RAM no HDD para hibernação?

7

minha pergunta é teórica em sistemas operacionais de computadores, especificamente sobre hibernação.

Até onde eu sei, a hibernação (estado S5 da ACPI, está correto?) envolve gravar no disco rígido todos os dados necessários para restaurar a RAM quando o sistema operacional é inicializado novamente. OK, isso soa bem para mim.

Mas, lembro-me dos velhos tempos da classe Operating Systems quando o professor explicou as diferenças no gerenciamento de memória entre sistemas operacionais. O kernel Windows e Linux usam memória virtual : todas as páginas são inicializadas em swap e carregadas na RAM quando necessário para que possam ser realocadas a qualquer momento.

Eu também sei que as páginas de memória não são imediatamente liberadas para swap, mas são mantidas na memória por um determinado período de tempo, ou quando há a necessidade de carregar uma página de swap e todas as páginas de memória estão dirty

A minha pergunta é: Por que o Windows precisa armazenar um arquivo hiberfil.sys separado com toda RAM armazenada dentro, já que todas as páginas devem estar presentes no arquivo de troca (e a hibernação significaria simplesmente liberar os caches e parar o computador) e quase todos limpos após uma inatividade prolongada?

O mesmo, por que o Linux diz explicitamente que está copiando páginas para trocar a partição? Quando eu simplesmente suspendo o sistema, ele leva alguns segundos de acesso contínuo ao disco antes de parar (talvez o kernel liberando caches), mas quando eu quero hibernar, ele leva o mesmo tempo que resta para a restauração.

Estou faltando alguma coisa sobre kernels?

    
por usr-local-ΕΨΗΕΛΩΝ 04.12.2010 / 18:05

3 respostas

2

Parte do que você está descrevendo soa menos como a memória virtual e mais como um cache de disco, em que o sistema operacional mantém cópias dos dados em memória do disco, caso um aplicativo queira lê-lo novamente . Nesse cenário, ele também pode atrasar a gravação de páginas "sujas" no disco, a fim de aumentar a eficiência escrevendo várias páginas de uma só vez.

A memória virtual é o contrário - os dados são gravados primeiro na RAM, e somente no arquivo de troca, se o kernel precisar liberar essa RAM para outra finalidade. (Nem todo bit de memória necessariamente tem um espaço correspondente no arquivo de troca; caso contrário, você não poderia ter um arquivo de troca menor do que o tamanho da memória RAM.) O pensamento convencional é que essa é a maneira que precisa ser; seria muito caro continuar copiando a RAM para o disco o tempo todo quando você não precisa. Pense em como o seu computador fica lento quando você está executando muitos programas com muita memória e precisa começar a espancar o espaço de troca.

Dito isto, existem alguns sistemas operacionais de pesquisa experimental que funcionam mais como você descreve, com algumas regras complexas para copiar a memória de volta ao disco em intervalos regulares, e o resultado é que não há necessidade de hibernação - você pode o plug no computador e perder talvez 30 segundos de trabalho. Confira CoyotOS , CapROS ou < href="http://www.eros-os.org/"> EROS se você estiver interessado teoricamente. Eu não sei como é o desempenho deles, ou quais outras desvantagens podem existir em tal estratégia, mas quando você leva em conta coisas malucas como a memória compartilhada com sua placa de vídeo ou outros dispositivos, eu imagino que é difícil conseguir isso funcionando corretamente para todos os casos. Até onde eu sei, nenhum sistema operacional de produção faz esse tipo de coisa.

    
por 05.12.2010 / 10:25
4

O mal-entendido aqui é que nem todo o conteúdo da RAM pode ser transferido para o disco.

Os processos do usuário têm espaço de troca dedicado, mas o sistema não. Isso ocorre porque muitas partes do sistema nunca são trocadas, e as que são trocadas são simplesmente apagadas da memória, já que não são mais necessárias (não escritas ). O sistema, nesse caso, inclui o kernel, os drivers e todos os dados usados para controlar processos (como a tabela de segmentos da memória virtual).

O arquivo de hibernação é gravado com todos os dados necessários para duplicar o estado do sistema . Isso está longe de ser igual em tamanho à RAM, já que apenas a memória ocupada está escrita.

Salvar e restaurar demoram ao mesmo tempo, pois os mesmos dados precisam ser lidos conforme foram gravados. Nos discos em que a leitura é muito mais rápida do que a escrita, como SSD, a restauração será muito mais rápida.

    
por 04.12.2010 / 19:12
2

Seu arquivo de página pode ser menor, maior ou do mesmo tamanho que sua RAM. Algumas pessoas até (erroneamente) desligam. Portanto, a Microsoft decidiu criar um arquivo separado com o mesmo tamanho da RAM e que pode ser lido e gravado na inicialização e na hibernação, respectivamente. Quanto ao Linux, eu assumiria a mesma lógica.

EDITAR:

E como harrymc aponta em sua resposta, é manter o estado do sistema.

    
por 04.12.2010 / 18:12