Windows の基礎について話すとなれば、まずトピックにしたいのは起動時間です。何しろ、これほど話題にのぼったり計測されることの多い機能は他にありません。Windows 8 では起動自体をそれほど頻繁にしなくてよいように設計しています (また、実行中のコードに修正プログラムを適用するための再起動もなるべく減らすことができるよう、常に努力しています) が、起動が必要な場面では、なるべく高速なエクスペリエンスをお届けしたいと考えています。これはとても深いトピックで、チームでもかなりの数のメンバーを注力させています。Windows 8 ではこの分野において長らくなかったような大きな飛躍を実現することができましたが、これにはエコシステム全体からの協力が大きく貢献しています。Windows チーム所属のプログラム管理ディレクターである Gabe Aul が今回の記事を執筆しました (これはこの後に続く Windows の基礎部分に関する一連の記事の第 1 弾となるものです)。
--Steven

Windows で行う処理の中で、起動ほど吟味され、計測され、あれこれ言われるものは多くありません。これは十分に理解できることです。というのも起動時間は全体的なシステム パフォーマンスを評価する指標となっており、私たちも適切な起動のエクスペリエンスをユーザーの皆さんにお届けするのはきわめて重要なことだと認識しています。データによれば、デスクトップ PC ユーザーの 57%、ノート PC ユーザーの 45% が、マシンをスリープ状態にせず、シャットダウンしています。総合的には、全ユーザーの半数がスリープではなくシャットダウンを利用しています。

Windows 7 ノート PC における各電源切り替え方法の利用状況を示した円グラフ。スリープ 45%、休止状態 11%、シャットダウン (再起動を含む) 45%
Windows 7 デスクトップ PC における各電源切り替え方法の利用状況を示した円グラフ。スリープ 42%、休止状態 1%、シャットダウン (再起動を含む) 57%

質的データの面では、ユーザーがシャットダウンを好むのは、PC を完全に "オフ" にして電力消費をゼロにし、バッテリーや電力使用量を節約するためだという情報があります。同様に電力を使用しない休止状態も、この用途に対して有効なオプションで、多くのユーザーに人気があります。しかし明らかに万人向けではないようです。というのも、多くのユーザーは PC をオンにする際、前のセッションで実行していたものを引き継ぐのではなく、"きれいな" 状態で始めることを望むという情報もあるからです。今日の PC でオン/オフのすばやい切り替えを求める場合、スリープ/再開が最良のオプションですが、この方法ではやはり RAM の内容を維持するためにいくらか電力が必要で、適切に最適化されたシステムならばわずかな量とはいえ、その分バッテリーが消耗します。そしてこれらすべての背景に見え隠れするのは、今日一般的な携帯電話の利用方法です。携帯電話を再起動することはほとんどなく、感覚的にはスリープに最も近い状態を常に使用しています。

これを受けた私たちの課題は、今日の PC に対するこれらの要望のすべてに、新しい特別なハードウェアを要求することなく対応できる設計を実現することでした。目標は次のようなものでした。

  • オフ状態時の消費電力が実質ゼロ
  • 起動後は新しいセッションを開始
  • 電源ボタンを押してからきわめて短時間のうちに PC を使用可能

Windows 7 では、デバイス ドライバー初期化の並行処理、トリガー開始サービスなど、ブート パスへの改良が多く施されましたが、すべてのニーズに応える起動パフォーマンスに近づくためには、増分的というよりもさらにクリエイティブなアプローチが必要なのは明らかでした。

私たちが出した答えは、従来のコールド ブートと休止状態からの復帰とをかけ合わせた、新しいスタートアップ モードです。

実際の詳しいしくみについての説明に入る前に、背景として、現在の Windows 7 でシャットダウンや起動がどのように行われているか振り返っておきます。

シャットダウンは次のように行われます。

  1. ユーザーが [スタート] メニューから [シャットダウン] を選択するか、電源ボタンを押すことで、シャットダウンが開始されます。また、アプリケーションが ExitWindowsEx() (英語) や InitiateShutdown() (英語) といった API を呼び出すことでもシャットダウンが開始されます。
  2. Windows が実行中のアプリケーションにメッセージをブロードキャストし、データや設定を保存する機会を与えます。また、アプリケーションの側から、実行中の処理を完了するための追加時間を少し要求することもできます。
  3. ログオンしている各ユーザーのユーザー セッションを Windows が終了します。
  4. Windows が各サービスにシャットダウンが開始されたことを通知するメッセージを送り、その後サービスを終了していきます。依存関係のある順序付けされたサービスは逐次的に終了され、それ以外のサービスは並行的に終了されます。サービスが応答しない場合、強制的に終了されます。
  5. Windows が各デバイスにメッセージをブロードキャストし、終了の合図を出します。
  6. Windows がシステム セッション ("セッション 0" とも呼ばれる) を終了します。
  7. 保留中のデータがあれば、完全に保存されるよう、システム ドライブへとフラッシュされます。
  8. Windows が ACPI インターフェイスを通してシステムにシグナルを送り、PC の電源を切ります。

起動は次のように行われます。

  1. 電源ボタンを押すと、PC のファームウェアが Power-On Self Test (POST) を開始し、ファームウェアの設定を読み込みます。このブート前プロセスは、有効なシステム ディスクが検知されたところで完了です。
  2. ファームウェアがマスター ブート レコード (MBR) を読み、続いて Bootmgr.exe を開始します。Bootmgr.exe が Windows ブート パーティション上で Windows ローダーを検索し、開始します。
  3. Windows カーネルの起動に必要な必須ドライバーが読み込まれ、稼働を開始したカーネルはシステム レジストリ ハイブおよび BOOT_START とマークされた追加ドライバーをメモリに読み込みます。
  4. カーネルがセッション マネージャー プロセス (Smss.exe) に制御を渡し、セッション マネージャー プロセスはシステム セッションを初期化し、BOOT_START とマークされていないドライバーとデバイスを読み込んで開始します。
  5. Winlogon.exe が起動してユーザー ログオン画面が表示され、サービス コントロール マネージャーが各サービスを開始し、グループ ポリシー スクリプトがあれば実行されます。ユーザーがログインすると、Windows はそのユーザーのセッションを作成します。
  6. Explorer.exe が起動し、デスクトップ ウィンドウ マネージャー (DWM) プロセスがシステムによって作成され、デスクトップを初期化および表示します。

より具体的な詳細に関心のある方は、http://msdn.microsoft.com/ja-jp/windows/hardware/gg463386 を参照してください。

ここで確認していただきたいのは、従来のシャットダウンでは、ユーザー セッションをすべて終了するだけでなく、カーネル セッションでもサービスおよびデバイスを終了して完全なシャットダウンに備えている点です。

Windows 8 ではこの点で重要な変更を行いました。Windows 7 と同様、ユーザー セッションは終了されますが、カーネル セッションは終了されるのではなく、休止状態になります。完全な休止状態ではアプリが使用している大量のメモリ ページを含める必要があるのに対して、セッション 0 の休止状態データはずっと小さく、ディスクへの書き込みにかかる時間も大幅に短くなります。簡単におさらいしておくと、休止状態に移行する際はシステム状態とメモリの内容がディスク上のファイル (hiberfil.sys) に保存され、再開時にはこのファイルを再度読み出してメモリの内容を復元します。この技術をブート時に使用することで、起動時間において大幅なアドバンテージを得ることができます。多くのシステムでは、休止状態ファイルを読み込んでドライバーの再初期化を行うほうがずっと速いからです (テストしたシステムの多くでは 30% から 70% の速度改善が見られました)。

Windows 8 の高速スタートアップの所要時間と Windows 7 のコールド ブートの所要時間を 30 種類の PC 構成で比較した棒グラフ。Windows 8 のスタートアップはいずれも 15 秒から 33 秒、Windows 7 のコールド ブートは 25 秒から 72 秒。
システム統合テスト ラボのシステムを使ったテスト結果のサンプル。
クリックすると大きな画像で表示します。

この速さは、システムの完全な初期化と比べて、休止状態のシステム セッションを再開する方が負荷が軽いことによって実現されていますが、今回新たに追加したマルチ フェーズ式の再開機能も速度に貢献しています。これは、マルチコア システムですべてのコアを並行利用し、休止状態ファイルの読み込みと内容の展開を分担するというものです。これによって、従来の休止状態からの再開も高速化されます。

スタートアップの各フェーズに要する時間の相対的な長さを示した棒グラフ。Windows 7 のコールド ブートでは、POST/プレブートが所要時間の 1/3 程度、システム初期化が所要時間の半分以上、ユーザー セッションの初期化が所要時間の 1/5 程度を占める。Windows 8 の高速スタートアップでは、POST/プレブートが 1/3 程度、休止状態ファイルの読み込みとユーザー セッションの初期化が各 1/4 程度、ドライバー初期化が休止状態ファイル読み込みやユーザー セッション初期化よりも若干小さな割合を占める。
コールド ブートと高速スタートアップの各フェーズの比較。
クリックすると大きな画像で表示します。

休止状態ファイルの扱いについても触れておきましょう。これを読んですぐに dir /s /ah hiberfile.sys を実行した方は、このファイルがディスク上でかなり大きなサイズを占めていることに気付かれたかと思います。休止状態ファイルは既定では物理 RAM の 75% のサイズに設定されます。このファイルは、端的に言えば、システムが休止状態に入る際に書き出される休止状態データのスペースを予約しているものです。実際に使用されるスペースは通常もっと少なくなり、今回の高速スタートアップの場合は通常、物理 RAM の 10% から 15% 程度ですが、これはドライバー、サービス、およびその他の要素によって異なります。また休止状態ファイルは、システムによってディスク上の他のファイルと若干異なる扱いを受けます。たとえばボリューム スナップショット サービスはこのファイルを無視します (若干パフォーマンス上のメリットがあります)。管理者特権でのコマンド プロンプトから powercfg /hibernate off を実行すれば、休止状態を無効にしてこのスペースを回収することができますが、この処理を行うと休止状態そのものが完全に無効になり、高速スタートアップやハイブリッド スリープなどの便利な機能も同時に無効になる点に注意してください。ハイブリッド スリープとは、デスクトップ システムでスリープと休止状態を同時に利用し、電源切れが発生した場合も休止状態から復帰できるようにするものです。また、powercfg /hibernate /size を実行して 0 ~ 100 の数値を指定すれば、物理 RAM の何パーセントの大きさを休止状態ファイル用に確保しておくか設定することができますが、注意が必要です。指定したサイズが小さすぎると、休止状態への移行が失敗することがあります。極端にディスク領域の限られたシステムでない限り、通常は有効のままにしておき、既定の値を維持することをお勧めします。

もう一つ Windows 8 の高速スタートアップ モードについて重要な点は、全ドライバーに対する完全な "プラグ アンド プレイ" 列挙を行うわけではないものの、ドライバーの初期化自体はこのモードでも行われるということです。ドライバーやデバイスを "リフレッシュ" するためにコールド ブートを愛用されていた方は、新しいモードでも (同一のプロセスではないものの) 同じ効果が得られるので、ご安心いただけると思います。

新しい高速スタートアップ モードは、ディスク回転式の HDD でもソリッド ステート ドライブ (SSD) でも、ほとんどすべてのシステムで効果を発揮するものですが、高速な SSD を使用した比較的新しいシステムではめざましい速さになります。ご自分の目で確かめていただくため、下のビデオをご用意しました。


ビデオをダウンロードしてお使いのメディア プレーヤーでご覧ください。
高画質 MP4 | 低画質 MP4

ビデオでご確認いただける点として、POST から Windows への受け渡しが実に早い段階で行われていることが挙げられます。Unified Extensible Firmware Interface (UEFI) を使って構築されたシステムは、従来の BIOS を使ったシステムと比べて、プレブート時間を大幅に短縮できる可能性が高くなります。これは UEFI が本質的に高速だからではなく、UEFI を利用して一から開発すると、場合によっては何年も前の BIOS 実装を基盤にするよりも、実装を最適化しやすくなるためです。さいわい多くのシステムやマザーボードの製造元で UEFI が実装され始めており、新しいシステムではこういった高速なスタートアップが一般的になってくるはずです。

もちろん、完全なシャットダウンが必要な場面はあります。たとえばマシンを開けてハードウェアの追加や変更を行う場合がそうです。UI 上でも Windows 7 方式のシャットダウン/コールド ブート動作に戻すオプションは提供されますが、あまり頻繁に行うことではないと思いますので、shutdown.exe で新しい /full スイッチを使用するという手もあります。コマンド プロンプトで shutdown /s /full / t 0 を実行すれば、即座に完全なシャットダウンを行うことができます。また、UI から再起動を選択すれば、完全なシャットダウンの上でコールド ブートが行われます。

ブート関連の仕事は主に Kernel Platform (カーネル プラットフォーム) グループの担当ですが、Windows 8 ではいくつかのチームが集まって OS 全体にわたって変更を行い、この新しいモードを初め、ブート関連の興味深い変更を組み込んでいます。これらについては近日中にご紹介していきます。社内では Windows 8 の起動パフォーマンスを満喫しているところです。読者の皆さんに実際に試していただき、意見をお寄せいただくのを待ち遠しく思っています。

Gabe Aul