Dela via


Oferecendo tempos de inicialização rápida no Windows 8

Ao falarmos de "conceitos básicos", gostaríamos de começar pelo tempo de inicialização - nenhum recurso é mais comentado e avaliado. Criamos o Windows 8 para que você não tenha que inicializar com tanta frequência (e estamos sempre trabalhando para reduzir o número de reinicializações exigidas pelo código de execução de patches). Mas quando for preciso inicializar, queremos que seja o mais rápido possível. Esse é um assunto muito complexo e temos muita gente focada nele. Devido em grande parte à cooperação de todo o ecossistema, avançamos bastante nesse quesito, bem mais do que nos últimos tempos, com o Windows 8. Gabe Aul, um diretor de gerenciamento de programas no Windows, escreveu esta postagem (a primeira de uma série de postagens sobre conceitos básicos).
--Steven

Poucas operações no Windows são tão examinadas, avaliadas e destacadas quanto a inicialização. Isso é compreensível. O tempo de inicialização representa uma amostra do desempenho geral do sistema, e todos sabemos que a experiência de inicialização é um aspecto extremamente importante que devemos aperfeiçoar para os clientes. Dados mostram que 57% dos usuários de PC desktop e 45% dos usuários de laptop desligam as suas máquinas em vez de colocá-las em suspensão. Em geral, metade dos usuários desligam suas máquinas em vez de colocá-las em suspensão.

Gráfico de pizza com as transições de energia de um laptop com Windows 7, mostrando o Modo Suspender com 45%, Hibernar com 11% e Desligar (incluindo o Reiniciar) com 45%
Gráfico de pizza com as transições de energia de um desktop com Windows 7, mostrando o Modo Suspender com 42%, Hibernar com 1% e Desligar (incluindo o Reiniciar) com 57%

Qualitativamente, as pessoas dizem que preferem desligar porque querem ter seus PCs completamente “desligados”, de maneira que não haja gasto de energia, seja para preservar a vida útil da bateria ou para reduzir o uso de energia. A hibernação também é uma boa opção para isso, já que não há nenhum uso de energia e muitas pessoas gostam desse modo. No entanto, está claro que isso não é para todos, pois uma das coisas que ouvimos é que muitas pessoas desejam ligar seus PCs e "começar do zero" em vez de executar as tarefas de suas sessões anteriores. Suspender/retomar é a melhor opção para transições de ligar/desligar nos PCs de hoje, mas ainda consome energia para preservar os conteúdos da RAM, o que significa gasto de bateria, mesmo que seja apenas um pouco em um sistema otimizado. E como pano de fundo disso tudo, temos em mente a maneira como usamos nossos celulares hoje: quase nunca reiniciados e sempre usados uma maneira semelhante ao modo de suspensão.

Nosso desafio, portanto, era o de criar uma maneira de realizar todos esses desejos nos PCs de hoje, sem exigir um hardware novo e especial. Estas eram as nossa metas:

  • Gasto zero de energia watt quando desligado
  • Uma nova sessão após a inicialização
  • Tempos muito curtos entre pressionar o botão de ligar e poder utilizar o PC.

No Windows 7, fizemos muitas melhorias no caminho da inicialização, incluindo a inicialização paralela dos drivers de dispositivos e dos serviços inicializados automaticamente. Contudo, estava claro que teríamos de ser ainda mais criativos (e mais sintéticos) se quiséssemos que o desempenho da inicialização fosse rápido o suficiente para atender a todas essas necessidades.

Nossa solução é um novo modo de inicialização rápida que é um híbrido da inicialização a frio tradicional e da continuação do modo de hibernação.

Antes de detalharmos o funcionamento dessa solução, é interessante lembrarmos como o desligamento e a inicialização funcionam hoje no Windows 7.

O desligamento requer que:

  1. O usuário inicie um desligamento ao selecionar “desligar” do menu Iniciar ou ao pressionar o botão de energia; ou que um aplicativo inicie o desligamento ao acionar um API como o ExitWindowsEx() ou InitiateShutdown().
  2. O Windows transmita mensagens para os aplicativos em execução, oferecendo-os a chance de salvar dados e configurações. Os aplicativos também podem solicitar um tempinho extra para terminar o que estão fazendo.
  3. O Windows encerre as sessões do usuário para cada usuário que tenha feito logon no sistema.
  4. O Windows envie mensagens para os serviços notificando-os sobre o início de um desligamento e os desligue em seguida. Os serviços solicitados que têm uma dependência serão desligados em série e o restante em paralelo. Se um serviço não responder, será desligado à força.
  5. O Windows transmita mensagens a dispositivos, solicitando o desligamento.
  6. O Windows feche a sessão do sistema (também conhecida como a “sessão 0”).
  7. O Windows libere dados pendentes na unidade do sistema para garantir que estejam completamente salvos.
  8. O Windows envie um sinal através da interface ACPI ao sistema para desligar o PC.

E a inicialização requer que:

  1. Após pressionar o botão de ligar, o firmware do PC inicie o POST (Power-On Self Test) e carregue as configurações de firmware. Este processo de pré-inicialização se encerra quando um disco do sistema válido é detectado.
  2. O firmware leia o MBR (registro mestre de inicialização) e então inicie o Bootmgr.exe. O Bootmgr.exe localize e inicie o carregador do Windows (Winload.exe) na partição de inicialização do Windows.
  3. Os drivers essenciais necessários para se iniciar o kernel do Windows sejam carregados e que o kernel inicie sua execução, carregando na memória o hive do registro de sistema e drivers adicionais que estejam marcados como BOOT_START.
  4. O kernel passe o controle para o processo do gerenciador da sessão (Smss.exe), que inicializa a sessão do sistema, carrega e inicia os dispositivos e drivers que não estejam marcados como BOOT_START.
  5. O Winlogon.exe inicie, a tela de logon do usuário apareça, o gerenciador de controle de serviço inicie os serviços e que todo script de Política de Grupo seja executado. Quando o usuário fizer o logon, o Windows crie uma sessão para esse usuário.
  6. O Explorer.exe inicie e o sistema crie o processo do DWM (gerenciador de janelas da área de trabalho), que inicializa e exibe a área de trabalho.

Há muitos outros detalhes específicos. Se alguém quiser saber mais: https://msdn.microsoft.com/en-us/windows/hardware/gg463386

No entanto, é fundamental ter em mente que em um desligamento tradicional fechamos todas as sessões de usuários e que em uma sessão kernel fechamos os serviços e dispositivos para preparar um desligamento completo.

Agora aqui está a principal diferença do Windows 8: como no Windows 7, fechamos as sessões do usuário, mas, em vez de fechar a sessão kernel, nós a hibernamos. Comparada a uma hibernação completa, que inclui muitas páginas de memória em uso por aplicativos, os dados da hibernação da sessão 0 são muito menores, levando bem menos tempo para gravá-los no disco. Caso você não esteja familiarizado com a hibernação, o que ocorre é que o estado do sistema e o conteúdo da memória são salvos em um arquivo no disco (hiberfil.sys) e, depois, esses dados são lidos quando as atividades são retomadas, restaurando o conteúdo novamente à memória. Usar essa técnica com a inicialização nos oferece uma grande vantagem nos tempos de inicialização, já que ler o arquivo de hibernação e reinicializar drivers é muito mais rápido na maioria dos sistemas (30 a 70% mais rápido na maioria dos sistemas testados).

Gráfico de barras comparando os tempos rápidos de inicialização do Windows 8 aos tempos de inicialização a frio do Windows 7 em 30 configurações de PC diferentes. Os tempos de inicialização do Windows 8 estão todos entre 15 e 33 segundos, enquanto os tempos de inicialização a frio do Windows 7 estão entre 25 e 72 segundos.
Amostra dos resultados de testes dos sistemas no laboratório da System Integration Test.
Clique para ver uma versão ampliada desse gráfico.

É mais rápido porque continuar a sessão do sistema hibernado é comparativamente menos trabalhoso do que realizar uma inicialização completa do sistema, mas também é mais rápido porque adicionamos uma nova funcionalidade de continuação em multifase, que é capaz de utilizar todos os núcleos em um sistema com vários núcleos em paralelo, dividir o trabalho de leitura do arquivo de hibernação e descompactar o conteúdo. Para aqueles que preferem a hibernação, isso também resultará em uma continuação mais rápida do modo de hibernação.

Gráfico de barras mostrando o tempo relativo necessário para diferentes fases da inicialização. Para a inicialização a frio do Windows 7, o POST/pré-inicialização leva em torno de 1/3 do tempo, o sistema de inicialização leva metade do tempo e a inicialização da sessão leva em torno de 1/5 do tempo. Para a inicialização rápida do Windows 8, o POST/pré-inicialização leva em torno de 1/3, a leitura do arquivo de hibernação e a inicialização da sessão do usuário, cada uma, leva em torno de 1/4 do tempo e a inicialização do driver compreende uma porção um pouco menor do que o arquivo de hibernação e a inicialização da sessão do usuário.
Representação de diferentes fases entre a inicialização a frio e a inicialização rápida.
Clique para ver uma versão ampliada desse gráfico.

Vale mencionar rapidamente como tratamos o arquivo de hibernação - caso leia isso e resolva fazer imediatamente um dir /s /ah hiberfile.sys, você descobrirá que se trata de um arquivo que ocupa bastante espaço no disco. O arquivo de hibernação tem como tamanho padrão 75% da RAM física. O arquivo é essencialmente uma reserva para os dados de hibernação que serão gravados à medida que o sistema entra em hibernação. Em geral, muito menos espaço é realmente utilizado e, no caso do uso de nossa inicialização rápida, normalmente, é utilizado entre 10% e 15% da RAM física, mas isso pode variar de acordo com drivers, serviços e outros fatores. O sistema também trata o arquivo de hibernação de uma maneira um pouco diferente do que os outros arquivos no disco. Por exemplo, o serviço de Instantâneo de Volume o ignora (um pequeno benefício de desempenho). Você pode desabilitar a hibernação e recuperar esse espaço executando  powercfg /hibernate off de um prompt de comandos com privilégios elevados. Mas esteja ciente de que se você fizer isso, a hibernação estará totalmente desabilitada, e isso inclui algumas das boas funcionalidades como a inicialização rápida e a suspensão híbrida, que permitem que os sistemas desktop realizem a suspensão e a hibernação simultaneamente. O que significa que, em caso de queda de energia, não será possível continuar do estado de hibernação. É possível também executar powercfg /hibernate /size e especificar um valor entre 0 e 100 para a porcentagem de RAM física a ser reservada para o arquivo de hibernação - mas tenha cuidado! Especificar um tamanho muito pequeno pode provocar falha na hibernação. Em geral, eu recomendo deixá-la habilitada no valor padrão, a menos que você esteja trabalhando em um sistema com espaço em disco extremamente limitado.

Outro dado importante a se observar no modo de inicialização rápida do Windows 8 é que se, por um lado, não realizamos uma enumeração completa de todos os drivers “Plug and Play”, por outro, ainda inicializamos os drivers nesse modo. Aqueles que gostam de realizar uma inicialização a frio para “atualizar” os drivers e dispositivos, ficarão contentes em saber que isso será possível nesse novo modo, mesmo que não seja um processo idêntico ao de inicialização a frio.

O novo modo de inicialização rápida, trará benefícios à maioria dos sistemas, tenham eles um HDD de rotação ou uma SSD (unidade de estado sólido). No entanto, para sistemas mais novos com SSDs rápidas, será, com certeza, excelente. Confira o vídeo abaixo e veja você mesmo:

Seu navegador não dá suporte a vídeos em HTML5.

Baixe este vídeo para assisti-lo no seu media player favorito:
MP4 de alta qualidade | MP4 de qualidade inferior

Uma coisa que você vai notar no vídeo é o quão veloz foi a transmissão do POST para o Windows. Os sistemas que são construídos com UEFI (Unified Extensible Firmware Interface) estão mais propensos a alcançar tempos de pré-inicialização bem rápidos quando comparados àqueles que possuem a BIOS tradicional. Isso não se deve ao fato de que o UEFI seja mais rápido, mas porque os recursos de gravação do UEFI iniciados do zero podem otimizar mais suas implementações do que compilar dados sobre uma implementação de BIOS que pode ter muitos anos de idade. A boa notícia é que a maioria dos sistemas e os fabricantes de placa-mãe começaram a implementar o UEFI, portanto, os tempos de inicialização rápida prevalecerão em sistemas mais recentes.

Claro, em certas ocasiões você preferirá realizar um desligamento completo. Por exemplo, se você estiver abrindo um sistema para adicionar ou alterar algum hardware. Temos a opção na interface do usuário de reverter para o desligamento/inicialização a frio do Windows 7 ou, já que se trata de algo pouco comum, é possível usar o novo comutador /full no shutdown.exe. De um prompt de comando, execute: shutdown /s /full / t 0  para invocar um desligamento completo e imediato. Além disso, ao escolher Reiniciar da interface do usuário, será realizado um desligamento completo, seguido por uma inicialização a frio.

O trabalho de inicialização é quase sempre realizado por nosso Grupo da Plataforma Kernel, mas muitas equipes se uniram no Windows 8 para fazer alterações em todo o sistema operacional e dar suporte a esse novo modo, além de outras alterações de inicialização interessantes sobre as quais falaremos em breve. Estamos felizes com o desempenho da inicialização do Windows 8 em nosso uso interno e ansiosos para que você possa experimentá-la e nos contar o que achou dela.

Gabe Aul