Como o Windows pode despejar a RAM completa no arquivo de hibernação tão rápido?

64

Eu estava passando por um artigo que explicava procedimento de hibernação no Microsoft Windows. Os principais pontos que eu recebo são

  1. O Windows despeja toda a RAM (depois de processá-la talvez) no arquivo hiberfil.sys .
  2. Durante a inicialização, o arquivo de hibernação é lido e o conteúdo é carregado na RAM.

A minha pergunta é quando normalmente copio um ficheiro de tamanho, digamos, 1 GB, demora cerca de 2 minutos a concluir.

No entanto, quando o Windows está gravando o arquivo de hibernação (durante o procedimento de hibernação), todo o processo leva de 10 a 15 segundos. Por que existe essa diferença na velocidade de escrita?

Meu tamanho de RAM é de 4 GB. (não estou falando de tecnologia de inicialização rápida.)

Benchmarks:

  1. Copiando um arquivo de 1 GB do disco 1 para o disco 2 (externo): 2,3 minutos.
  2. Hibernando o sistema: 15 segundos.
por coder 09.03.2015 / 18:12

5 respostas

45

Esta é provavelmente uma resposta tripla.

Uma coisa que pode estar em jogo aqui é o novo Desligamento Híbrido no Windows, que efetivamente fecha seus aplicativos, desconecta você e depois hiberna o núcleo do sistema operacional. Já ter esses dados salvos significaria que não é necessário "re-hibernar" potencialmente.

A segunda coisa seria que a hibernação não precisaria salvar páginas de memória paginadas para o arquivo de troca ou que não estivessem em uso (essa seria uma das razões para preencher agressivamente o arquivo de troca e mantém os dados na memória também.

O terceiro seria que o os dados do arquivo de hibernação também são compactados . Combine isso com meu segundo ponto e se você tiver apenas um pequeno conjunto de dados para exportar que contenha dados altamente compactáveis (executáveis geralmente são bem compactados), então a quantidade de dados a ser enviada para o arquivo de hibernação pode ser substancialmente menor que o conjunto de trabalho De dados. Observe que, conforme declarado nos comentários, caches de arquivos e outros dados de buffer desnecessários podem ser facilmente descartados sem nenhum efeito negativo para reduzir a quantidade de dados a serem despejados no arquivo de hibernação.

Além disso, os discos rígidos atuais são bem rápidos. Com um disco que tenha uma gravação sustentada na ordem de 100 MB / s, você seria capaz de gravar (sem compactação) 4 GB de RAM em menos de um minuto. Como a hibernação pode ser feita como a última coisa depois de suspender todos os processos do usuário e antes de suspender a CPU, o SO geralmente terá a velocidade total de gravação do disco. Isso é uma coisa que o seu benchmark simples não terá, e copiar de disco para disco será potencialmente mais lento do que simplesmente gravar a RAM no disco.

Combine essas coisas e a quantidade de dados a ser gravada no arquivo de hibernação pode ser bem pequena, provavelmente da ordem de 1 GB, e provavelmente seria gravada em um grande bloco contínuo em menos de 10 segundos.

    
por 09.03.2015 / 18:46
31

Primeiro, a quantidade de RAM que precisa ser salva é surpreendentemente pequena. Na verdade, apenas o conjunto de páginas sujas mapeadas ("write-back preguiçoso") precisa ser liberado, assim como todas as páginas privadas que foram gravadas e realocadas pelo código executável precisam ser gravadas.

  • Os segmentos de texto dos executáveis são sempre suportados pelo mapeamento de arquivos. Isso também é verdade para pelo menos alguns DLLs (mas não todos, depende se eles precisam ser realocados).
  • A memória que é apoiada de forma semelhante pelos mapeamentos de arquivos pode ser descartada (presumindo que não seja CoW ou RW e suja).
  • O write-back lento ainda terá que ocorrer, mas além disso, os caches podem ser descartados.
  • A memória que foi alocada mas não foi gravada (geralmente a maior parte dos dados do aplicativo!) é apoiada pela página zero e pode ser descartada.
  • A maior parte das páginas de memória que estão no status de "standby" (o atual conjunto de trabalho residente por processo no Windows é surpreendentemente pequeno, apenas 16MB) foi copiado para o arquivo de paginação no fundo em algum momento e pode ser descartado.
  • Regiões da memória que são mapeadas por determinados dispositivos, como a placa gráfica, podem (possivelmente) não precisar ser salvas. Às vezes, os usuários ficam surpresos ao conectar 8GiB ou 16GiB em um computador, e 1GiB ou 2GiB estão "desaparecidos" sem razão aparente. As principais APIs gráficas exigem que os aplicativos consigam invalidar o conteúdo do buffer "sob algumas condições" (sem dizer exatamente o que isso significa). Portanto, não é irracional esperar que a memória que é fixada pelo driver gráfico seja descartada também. A tela vai escurecer, afinal.
Em segundo lugar, ao contrário de você copiar um arquivo, despejar o conjunto de páginas de RAM que precisam ser salvo disco é uma única gravação contígua, seqüencial do ponto de vista da unidade. A API do Win32 expõe até mesmo uma função no nível do usuário para esta mesma operação. Recolher gravação é diretamente suportado pelo hardware e funciona tão rápido quanto o disco é fisicamente capaz de aceitar dados (o controlador puxará dados diretamente via DMA). Há várias condições prévias para que isso funcione (como alinhamento, tamanho de bloco, fixação), e não funciona bem com o armazenamento em cache e não existe "write-back lento" (que é uma otimização muito desejável sob operação normal ).
Essa é a razão pela qual nem toda gravação funciona assim o tempo todo. No entanto, quando o sistema está salvando o arquivo de hibernação, todas as pré-condições são automaticamente atendidas (todos os dados são alinhados à página, tamanho da página e fixados) e o cache acaba se tornando irrelevante porque o computador será desligado em um momento.

Em terceiro lugar, fazer uma única gravação contígua é muito favorável para discos giratórios e para discos de estado sólido.

O arquivo de troca e o arquivo de hibernação são geralmente alguns dos arquivos mais antigos criados e reservados no disco. Eles geralmente têm um, no máximo dois fragmentos. Assim, a menos que setores estejam danificados e o disco tenha que realocar setores físicos, uma gravação sequencial lógica se traduz em uma gravação seqüencial física em um disco giratório.

Nenhuma operação read-modify-write é necessária no disco quando uma quantidade enorme de dados sequenciais contíguos está sendo gravada. Esse problema é menos pronunciado em discos rígidos giratórios que podem gravar setores únicos que são bem pequenos (contanto que você não escreva bytes únicos, o que geralmente impede o armazenamento em cache, o dispositivo não precisa buscar o conteúdo original e gravar a versão modificada).

Isto é, no entanto, algo que é muito perceptível no SSD, onde cada escrita significa que, por ex. um bloco de 512kB (que é um número normal, mas poderia ser maior) deve ser lido e modificado pelo controlador, e escrito de volta para um bloco diferente. Embora você possa, em princípio, gravar (mas não sobrescrever) unidades menores em discos flash, você só pode apagar blocos enormes, é como o hardware funciona. Esta é a razão pela qual os SSDs se saem muito melhor em gravações sequenciais enormes.

    
por 10.03.2015 / 12:01
10

Ele não despeja toda a RAM no tempo de hibernação.

Ele já terá uma grande parte da RAM já duplicada no disco. Isso não só permite que a hibernação aconteça rapidamente, mas também permite que a memória seja disponibilizada rapidamente para novos programas (para que possam ser executados rapidamente).

Portanto, ele só precisa escrever uma pequena fração dos 4 GB e isso pode ser feito em 10-15s.

Em microsoft :

When RAM is in short supply (for example, Committed Bytes is greater than installed RAM), the operating system will try to keep a certain fraction of installed RAM available for immediate use by copying virtual memory pages that are not in active use to the pagefile. Therefore, this counter will not reach zero and is not necessarily a good indication of whether your system is short of RAM.

    
por 10.03.2015 / 12:01
2

Além de todos os itens acima, acho que há alguns outros fatores em jogo.

Uma é que, ao copiar um arquivo, o arquivo deve ser lido e escrito; A hibernação requer apenas que o arquivo seja gravado. É, por definição, já na memória!

Intimamente relacionado a isso, ao ler um arquivo e gravá-lo ao mesmo tempo, para economizar memória, o processo é: ler um trecho, escrever um trecho, atualizar o diretório (para mostrar o novo tamanho); leia um trecho, escreva um trecho, atualize o diretório.

Cada vez que você passar de uma parte do disco para outra (por exemplo, ler o arquivo a para gravar o arquivo b, gravar o arquivo b para gravar o diretório e escrever o diretório para ler o próximo bloco) o disco deve procurar - mover as cabeças, permitem que as cabeças se assentem, esperem a parte direita do disco passar. Esta é uma das vantagens de um disco de estado sólido - a busca não leva tempo algum. Quando hibernando, os dados são gravados de ponta a ponta. O arquivo de hibernação (swap) é pré-alocado, portanto, o diretório não precisa ser atualizado (você não está alterando o tamanho do arquivo de hibernação, apenas o conteúdo).

E, finalmente, o seu computador suspendeu todas as outras tarefas - esta é a ÚNICA coisa que está fazendo (duvido que isso faça muita diferença, mas ele vai fazer algumas!). Mesmo coisas como gerenciamento de memória e troca de tarefas estão suspensas.

    
por 12.03.2015 / 03:11
0

Provavelmente, isso ocorre porque a RAM possui velocidades de entrada / saída muito mais rápidas do que o disco rígido, de modo que a RAM pode produzir o material tão rápido quanto o disco rígido pode ler.

Ao copiar arquivos, você também é limitado por vários fatores - a velocidade do disco, se tiver que ler para dentro e para fora no mesmo disco, levará mais tempo, a velocidade limitada da conexão (se a unidade externa) , verificando se não está sobrescrevendo nada, etc.

    
por 09.03.2015 / 18:17