Eu estava lendo um artigo que explicava o procedimento de hibernação no Microsoft Windows. Os principais pontos que eu tirei disso são
- O Windows despeja toda a RAM (talvez depois de processada) no
hiberfil.sys
arquivo. - Durante a inicialização, o arquivo de hibernação é lido e o conteúdo é carregado na RAM.
Minha pergunta é quando normalmente copio um arquivo de tamanho, digamos, 1 GB, leva cerca de 2 minutos para ser concluído.
No entanto, quando o Windows está gravando o arquivo de hibernação (durante o procedimento de hibernação), todo o processo leva cerca de 10 a 15 segundos. Por que existe tanta diferença na velocidade de gravação?
O tamanho da minha RAM é de 4 GB. (Não estou falando sobre tecnologia de inicialização rápida.)
Benchmarks:
- Copiando arquivo de 1 GB do Disco 1 para o Disco 2 (externo): 2,3 minutos.
- Hibernando o sistema: 15 segundos.
fsutil
.Respostas:
Esta é provavelmente uma resposta tripla.
Uma coisa que pode estar em jogo aqui é o novo Hybrid Shutdown no Windows, que efetivamente fecha seus aplicativos, efetua o logoff e depois passa a hibernar o núcleo do sistema operacional. Já ter esses dados salvos significa que eles não precisam "re-hibernar" potencialmente.
A segunda coisa seria que a hibernação não precisaria salvar páginas de memória que são paginadas para o arquivo de troca ou não estão em uso (esse seria um motivo para preencher agressivamente o arquivo de troca e manter os dados na memória) .
A terceira seria que os dados do arquivo de hibernação também são compactados . Combine isso com o meu segundo ponto e, se você tiver apenas um pequeno conjunto de dados a exportar que contém dados altamente compactáveis (os executáveis geralmente são compactados bem), a quantidade de dados a serem enviados para o arquivo de hibernação pode ser substancialmente menor que o conjunto de trabalho De dados. Observe que, conforme declarado nos comentários, os caches de arquivos e outros dados desnecessários do buffer podem ser facilmente descartados sem causar efeitos negativos para reduzir a quantidade de dados a serem despejados no arquivo de hibernação.
Além disso, os discos rígidos atuais são bastante rápidos. Com um disco com gravação sustentada na ordem de 100 MB / s, você poderá gravar (não compactado) 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 é algo que seu benchmark simples não terá, e copiar de disco para disco será potencialmente mais lento do que simplesmente gravar RAM em disco.
Combine essas coisas e a quantidade de dados a serem gravados no arquivo de hibernação pode ser bem pequena, potencialmente da ordem de 1 GB e provavelmente seria gravada em um grande bloco contínuo em menos de 10 segundos.
fonte
Primeiro, a quantidade de RAM que precisa ser salva é surpreendentemente pequena. De fato, apenas o conjunto de páginas sujas mapeadas ("write-back lento") precisa ser liberado, assim como todas as páginas particulares que foram gravadas e o código executável realocado precisam ser gravadas.
Segundo, ao contrário de você copiar um arquivo, despejar o conjunto de páginas de RAM que precisam ser salvas em disco é uma única gravação sequencial e contígua do ponto de vista da unidade. A API do Win32 até expõe uma função no nível do usuário para essa mesma operação. O Gather Write é suportado diretamente pelo hardware e funciona tão rápido quanto o disco é capaz de aceitar dados fisicamente (o controlador extrai dados diretamente via DMA).
Existem várias condições prévias para que isso funcione (como alinhamento, tamanho do bloco, fixação), e ele não funciona bem com o armazenamento em cache e não existe "write-back lento" (que é uma otimização muito desejável em operação normal) )
Essa é a razão pela qual nem toda gravaçãofunciona assim o tempo todo. No entanto, quando o sistema está salvando o arquivo de hibernação, todas as pré-condições são atendidas automaticamente (todos os dados são alinhados, dimensionados e fixados) e o armazenamento em cache tornou-se irrelevante porque o computador será desligado em um momento.
Terceiro, fazer uma única gravação contígua é muito favorável tanto para discos giratórios quanto 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. Portanto, a menos que os setores estejam danificados e o disco precise realocar os setores físicos, uma gravação sequencial lógica será convertida em uma gravação sequencial física em um disco rotativo.
Nenhuma operação de leitura-modificação-gravação é necessária no disco quando uma grande quantidade de dados sequenciais e contíguos está sendo gravada. Esse problema é menos pronunciado em discos rígidos giratórios, que podem gravar setores únicos muito pequenos (desde que você não grave bytes únicos, o que o cache geralmente impede, o dispositivo não precisará buscar o conteúdo original e gravar a versão modificada). .
Isso é, no entanto, algo que é muito perceptível no SSD, onde cada gravação significa que, por exemplo, um bloco de 512kB (que é um número usual, mas pode ser maior) deve ser lido e modificado pelo controlador e gravado em um arquivo diferente. quadra. Embora você possa, em princípio, escrever para (mas não substituir)) unidades menores em discos flash, você só pode apagar blocos enormes, é assim que o hardware funciona. Essa é a razão pela qual os SSDs se saem muito melhor em gravações sequenciais enormes.
fonte
Não despeja toda a RAM em tempo de hibernação.
Já terá uma grande parte da RAM já duplicada no disco. Isso não apenas permite que a hibernação aconteça rapidamente, mas também permite que a memória seja disponibilizada rapidamente para novos programas (para que eles possam iniciar rapidamente).
Portanto, ele só precisa escrever uma pequena fração dos 4 GB e isso pode ser feito em 10 a 15s.
Da microsoft :
fonte
Além de todos os itens acima, acho que existem outros fatores em jogo.
Uma é que, ao copiar um arquivo, o arquivo deve ser lido e gravado; a hibernação requer apenas que o arquivo seja gravado. Já está, por definição, 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 pedaço, escrever um pedaço, atualizar o diretório (para mostrar o novo tamanho); leia um pedaço, escreva um pedaço, atualize o diretório.
Cada vez que você move de uma parte do disco para outra (por exemplo, leia o arquivo a para gravar o arquivo b, escreva o arquivo b para escrever o diretório e escreva o diretório para ler o próximo bloco), o disco deve procurar - mover as cabeças, deixe as cabeças assentarem, aguarde a parte certa do disco. Essa é uma das vantagens de um disco de estado sólido - a busca não leva tempo. Ao hibernar, os dados são gravados de ponta a ponta. O arquivo de hibernação (troca) é 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, seu computador suspendeu todas as outras tarefas - é a ÚNICA coisa que ele está fazendo (duvido que isso faça muita diferença, mas certamente fará algumas!). Até coisas como gerenciamento de memória e alternância de tarefas estão suspensas.
fonte
Provavelmente, isso ocorre porque a RAM possui velocidades de entrada / saída muito mais rápidas que o disco rígido, para que a RAM possa produzir as coisas nele tão rapidamente quanto o disco rígido pode ler.
Ao copiar arquivos, você também é limitado por vários fatores - a velocidade do disco, se for necessário ler e sair no mesmo disco, levará mais tempo, a velocidade limitada da conexão (se for para a unidade externa), verificando-a não está substituindo nada etc
fonte
dd if=/dev/zero of=/tmp/output.img bs=8k count=256k
e obter1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s
, então parece possível (acrescentarei que a cópia de arquivos do Windows parece demorar desnecessariamente).