(57)【特許請求の範囲】
【請求項１】
マルチタスクのオペレーティング・システムを搭載するコンピュータにおいてハード・ディスク・ドライブからブートする方法であって、
前記コンピュータが、前記ハード・ディスク・ドライブからブート・ファイルをロードするために生成されて順番に実行される複数のタスクの名称と前記ブート・ファイルのサイズを今回のブート時に観測するステップと、
前記コンピュータが、前記観測した複数のタスクの中で同一名称のタスクがロードするブート・ファイルのサイズと実行順序が前記同一名称のタスクの間に存在する複数のタスクがそれぞれロードする複数のブート・ファイルの合計サイズを比較してサイズの大きい方の前記ブート・ファイルまたは前記複数のブート・ファイルを先読みブート・ファイルとして選択するステップと、
前記コンピュータが、ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルするステップと、
前記コンピュータが、フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードするステップと
を有するブート方法。
【請求項２】
前記選択するステップが、前記観測した複数のタスクの中に同一名称のタスクが所定数以上ある場合に実行される請求項１に記載のブート方法。
【請求項３】
前記フィルするステップが、前記同一名称のタスクがロードするブート・ファイルの全体または前記同一名称のタスクの間に存在する複数のタスクがそれぞれロードする複数のブート・ファイルの全体をフィルするステップを含む請求項１または請求項２に記載のブート方法。
【請求項４】
マルチタスクのオペレーティング・システムを搭載するコンピュータにおいてハード・ディスク・ドライブからブートする方法であって、
前記コンピュータが、順番に実行される複数のタスクが前記ハード・ディスク・ドライブからそれぞれロードする複数のブート・ファイルのサイズを今回のブート時に観測するステップと、
前記コンピュータが、前記観測した複数のブート・ファイルの中でサイズが所定値以上のブート・ファイルを先読みブート・ファイルとして選択するステップと、
前記コンピュータが、ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルするステップと、
前記コンピュータが、フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードするステップと
を有するブート方法。
【請求項５】
マルチタスクのオペレーティング・システムを搭載するコンピュータにおいてハード・ディスク・ドライブからブートする方法であって、
前記コンピュータが、前記ハード・ディスク・ドライブから複数のブート・ファイルをロードするために順番に実行される複数のタスクを今回のブート時に観測するステップと、
前記コンピュータが、前記ハード・ディスク・ドライブからブート・ファイルをロードするために生成されて順番に実行される複数のタスクから１つおきの順番に選択したタスクが読み出すブート・ファイルを先読みブート・ファイルとして選択するステップと、
前記コンピュータが、ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルするステップと、
前記コンピュータが、フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードするステップと
を有するブート方法。
【請求項６】
前記選択するステップを、ブート中の一定の時間ごとに実行する請求項１から請求項５のいずれかに記載のブート方法。
【請求項７】
前記コンピュータが、前記ハード・ディスク・ドライブから単位時間当たりにロードされるブート・ファイルのサイズに関する短期移動平均と長期移動平均を計算するステップと、
前記コンピュータが、前記短期移動平均が前記長期移動平均よりも下回ったタイミングに基づいてそれ以降に読み出すブート・ファイルを先読みブート・ファイルとして選択するステップと
を有する請求項１から請求項６のいずれかに記載のブート方法。
【請求項８】
前記短期移動平均が前記長期移動平均を上回ったことに応答して前記ブート・ファイルの前記ブート・キャッシュに対するフィルを停止する請求項７に記載のブート方法。
【請求項９】
マルチタスクのオペレーティング・システムが搭載され複数のブート・ファイルを格納するハード・ディスク・ドライブからブートするコンピュータであって、
プロセッサと、
前記プロセッサが実行するデータを記憶するメイン・メモリと、
ブート・キャッシュと、
ブート・ドライバを格納する不揮発性メモリとを有し、
前記ブート・ドライバは前記オペレーティング・システムと協働して前記コンピュータに、
前記ハード・ディスク・ドライブからブート・ファイルをロードするために生成されて順番に実行される複数のタスクの名称と前記ブート・ファイルのサイズを今回のブート時に観測する機能と、
前記観測した複数のタスクの中で同一名称のタスクがロードするブート・ファイルのサイズと実行順序が前記同一名称のタスクの間に存在する複数のタスクがそれぞれロードする複数のブート・ファイルの合計サイズを比較してサイズの大きい方の前記ブート・ファイルまたは前記複数のブート・ファイルを先読みブート・ファイルとして選択する機能と、
ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルを前記ブート・キャッシュにフィルする機能と、
フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・キャッシュからロードする機能と
を実現させるコンピュータ。
【請求項１０】
マルチタスクのオペレーティング・システムが搭載され複数のブート・ファイルを格納するハード・ディスク・ドライブからブートするコンピュータであって、
プロセッサと、
前記プロセッサが実行するデータを記憶するメイン・メモリと、
ブート・キャッシュと、
ブート・ドライバを格納する不揮発性メモリとを有し、
前記ブート・ドライバは前記オペレーティング・システムと協働して前記コンピュータに、
順番に実行される複数のタスクが前記ハード・ディスク・ドライブからそれぞれロードする複数のブート・ファイルのサイズを今回のブート時に観測する機能と、
前記観測した複数のブート・ファイルの中でサイズが所定値以上のブート・ファイルを先読みブート・ファイルとして選択する機能と、
ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをキャッシュにフィルする機能と、
フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードする機能と
を実現させるコンピュータ。
【請求項１１】
マルチタスクのオペレーティング・システムが搭載され複数のブート・ファイルを格納するハード・ディスク・ドライブからブートするコンピュータであって、
プロセッサと、
前記プロセッサが実行するデータを記憶するメイン・メモリと、
ブート・キャッシュと、
ブート・ドライバを格納する不揮発性メモリとを有し、
前記ブート・ドライバは前記オペレーティング・システムと協働して前記コンピュータに、
前記ハード・ディスク・ドライブから複数のブート・ファイルをロードするために順番に実行される複数のタスクを観測する機能と、
前記ハード・ディスク・ドライブからブート・ファイルをロードするために生成されて順番に実行される複数のタスクから１つおきの順番に選択したタスクが読み出すブート・ファイルを先読みブート・ファイルとして選択する機能と、
ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルする機能と、
フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードする機能と
を実現させるコンピュータ。
【請求項１２】
前記ブート・ドライバは前記オペレーティング・システムと協働して前記コンピュータに、
前記ハード・ディスク・ドライブから単位時間当たりにロードされるブート・ファイルのサイズに関する短期移動平均と長期移動平均を計算する機能と、
前記短期移動平均が前記長期移動平均よりも下回ったタイミングに基づいてそれ以降に読み出すブート・ファイルを先読みブート・ファイルとして選択する機能と
を実現させる請求項９から請求項１１のいずれかに記載のコンピュータ。
【請求項１３】
前記ブート・キャッシュが前記メイン・メモリの一部にブート・キャッシュ領域として構成されており、前記ブート・ドライバはブートを完了した後に前記ブート・キャッシュ領域を開放する請求項９から請求項１２のいずれかに記載のコンピュータ。
【請求項１４】
複数のブート・ファイルを格納するハード・ディスク・ドライブからブートするコンピュータに、マルチタスクのオペレーティング・システムと協働して、
前記ハード・ディスク・ドライブからブート・ファイルをロードするために生成されて順番に実行される複数のタスクの名称と前記ブート・ファイルのサイズを今回のブート時に観測する機能と、
前記観測した複数のタスクの中で同一名称のタスクがロードするブート・ファイルのサイズと実行順序が前記同一名称のタスクの間に存在する複数のタスクがそれぞれロードする複数のブート・ファイルの合計サイズを比較してサイズの大きい方の前記ブート・ファイルまたは前記複数のブート・ファイルを先読みブート・ファイルとして選択する機能と、
ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルする機能と、
フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードする機能と
を実現させるコンピュータ・プログラム。
【請求項１５】
複数のブート・ファイルを格納するハード・ディスク・ドライブからブートするコンピュータに、マルチタスクのオペレーティング・システムと協働して、
順番に実行される複数のタスクが前記ハード・ディスク・ドライブからそれぞれロードする複数のブート・ファイルのサイズを今回のブート時に観測する機能と、
前記観測した複数のブート・ファイルの中でサイズが所定値以上のブート・ファイルを先読みブート・ファイルとして選択する機能と、
ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルする機能と、
フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードする機能と
を実現させるコンピュータ・プログラム。
【請求項１６】
複数のブート・ファイルを格納するハード・ディスク・ドライブからブートするコンピュータに、マルチタスクのオペレーティング・システムと協働して、
前記ハード・ディスク・ドライブから複数のブート・ファイルをロードするために順番に実行される複数のタスクを今回のブート時に観測する機能と、
前記ハード・ディスク・ドライブからブート・ファイルをロードするために生成されて順番に実行される複数のタスクから１つおきの順番に選択したタスクが読み出すブート・ファイルを先読みブート・ファイルとして選択する機能と、
ブートするために生成したタスクから独立した、前記ブート・ファイルをロードするために生成したタスクよりも優先度の高いシステム・タスクを生成して前記選択した先読みブート・ファイルをブート・キャッシュにフィルする機能と、
フィルしたあとに読み出されるブート・ファイルが前記ブート・キャッシュにフィルされている場合に前記ブート・ファイルを前記ブート・キャッシュからロードする機能と
を実現させるコンピュータ・プログラム。
【請求項１７】
さらに、
前記ハード・ディスク・ドライブから単位時間当たりにロードされるブート・ファイルのサイズに関する短期移動平均と長期移動平均を計算する機能と、
前記短期移動平均が前記長期移動平均よりも下回ったタイミングに基づいてそれ以降に読み出すブート・ファイルを先読みブート・ファイルとして選択する機能と
を実現させる請求項１４から請求項１６のいずれかに記載のコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータのブート時間を短縮する技術に関する。
【背景技術】
【０００２】
コンピュータは電源が投入されると、起動プロセス（ブート・ストラップまたはブートともいう。）を開始する。最初にＢＩＯＳ＿ＲＯＭに格納されているＢＩＯＳのＰＯＳＴ（Power On Self Test）といわれる初期化プログラムがメイン・メモリに読み出されて実行される。初期化プログラムは、ブート・デバイスを診断したり初期化したりする。
【０００３】
つぎにＢＩＯＳはブート・ファイルが格納されているブート・デバイスを探す。ブート・ファイルはオペレーティング・システム、デバイス・ドライバ、およびアプリケーション・プログラムなどを含む。ブート・デバイスとしては通常ハード・ディスク・ドライブ（ＨＤＤ）が使用される。ＢＩＯＳは、ＨＤＤの先頭セクタに格納されているＭＢＲ（Master Boot Record）をメイン・メモリにロードしてそれに制御を移す。ＭＢＲはディスクからブート可能なパーティションを探してその先頭セクタ（ブート・セクタ）にあるブート・ストラップ・ローダをメイン・メモリにロードしてそれに制御を移す。その後ブート・ストラップ・ローダにつづいてブート・ファイルが順番にメイン・メモリに読み出される。
【０００４】
プリエンプティブなマルチタスキングを行うオペレーティング・システム（ＯＳ）は、ブート時もプリエンプティブなタスク・スイッチを行うようになっている。ＯＳはブート時にＨＤＤからブート・ファイルを読み出すために複数のプロセスやスレッドを生成する。ＯＳは、各プロセスを所定のアルゴリズムでプロセッサにディスパッチする。ディスパッチされたプロセスは、プロセッサにおいて所定のタイム・スライスの間だけ実行されたのちにプリエンプトされて後続のプロセスがディスパッチされる。ブートの後半になると同時に存在するプロセスの数が増大してＨＤＤに多くのシーク時間が発生し、ブートの実行効率が低下してブート時間の遅延を招く。
【０００５】
余分なシークが発生しないようにＨＤＤに単一のブート・イメージを格納して短時間でブートを完了する方法もあるが特殊なＯＳに限定されている。また、ＳＳＤ（Solid State Drive）をブート・デバイスとして利用する方法もあるが、容量およびコストに限界がある。さらに、ＨＤＤに記憶されたブート・ファイルに対してデフラグを実行してシークが発生しにくいように並べ替える方法もある。Ｗｉｎｄｏｗｓ（登録商標）では、無駄なページ・フォルトやシークを省略して起動時間を短縮するためにプリフェッチという機能を導入している。
【０００６】
これは前回までのブート時に、ブート中のプログラムの動作をトレースして、ＨＤＤ上のファイルのアクセス状況を調べておき、その結果に基づいて次回以降のブート時に所定のファイルを先読みしておくという機能である。アクセス・ログはファイルごとに記録されて所定のディレクトリに格納される。各ファイルには、それぞれのプログラムごとのＨＤＤに対するアクセス・パターンのデータが記録されており、ブート時にはこのアクセス・ログに基づいてファイルがメイン・メモリに先読みされる。
【０００７】
特許文献１は、ブート時間を短縮するために、起動時にＨＤＤから読み出されたプリフェッチ・テーブルでブート関連プログラムをプリフェッチする技術を開示する。プリフェッチ・テーブルには、プログラムの格納位置とサイズが記憶され、さらに、フラグでプリフェッチを設定できるようになっている。特許文献２および特許文献３は、ホストからのリード要求のサイズが所定値以上の場合には、リード要求に続くデータも含めて先読みする技術を開示する。特許文献４は、統計処理に基づいてキャッシュするデータ量を決める技術を開示する。特許文献５は、ホストからの要求転送レートと光ディスクからのデータ読み取りレートを比較して先読み量を設定する技術を開示する。
【特許文献１】米国特許６０７３２３２号明細書
【特許文献２】特開２００７−２４１９２７号公報
【特許文献３】特開昭６４−７６３１４号公報
【特許文献４】特開２００１−３５０６６９号公報
【特許文献５】特開２００２−２０７６３５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
上記のＷｉｎｄｏｗｓの機能では、２回目以降のブートでは起動時間の短縮が図れるがアクセス・ログを収集するための１回目のブートでは起動時間を短縮することができない。また、一連のブート・ファイルは、デバイス・ドライバが更新されたり、パッチ・プログラムが追加されたり、さらにはアプリケーションが追加されたりして、その種類や起動順序などの構成が頻繁に変更される。ブート・ファイルの構成が変更された場合には以前に生成されたブート・ログでは十分に対応できない。ブート・ファイルのアクセス・ログを生成しないでファイルの先読みによりブート時間を短縮するには、先読み対象ファイルを選定する新たな方法が必要となる。
【０００９】
そこで、本発明の目的は、ブート時間を短縮するブート方法を提供することにある。さらに本発明の目的は、ブート・ファイルの構成が変更されても対応が可能なブート方法を提供することにある。さらに本発明の目的は、そのようなブート方法を実現するコンピュータおよびコンピュータ・プログラムを提供することにある。
【課題を解決するための手段】
【００１０】
本発明は、マルチタスクのオペレーティング・システムを搭載するコンピュータにおいてハード・ディスク・ドライブからブートする方法を提供する。ハード・ディスク・ドライブはコンピュータと一体になっていても、分離されていてもよい。ブート・ドライバは、当該ブートにおいて、ハード・ディスク・ドライブからメイン・メモリに読み出すために生成されて順番に実行される複数のタスクを観測する。つづいて、ブート・ドライバは、観測した複数のタスクの中から先読みブート・ファイルを選択する。
【００１１】
ブート・ドライバは、選択した先読みブート・ファイルをメイン・メモリ上のブート・キャッシュにフィルし、フィルしたあとに読み出されるブート・ファイルをブート・キャッシュからロードする。その結果、ブート・ファイルを読み出す際のリソースの競合を排除してブート時間を短縮することができる。ブート・ファイルは全体をフィルしてもよく、あるいは、ブート・キャッシュの容量が不足する場合は一部をフィルしてもよい。一部をフィルした場合はブート段階が進行して当該ブート・ファイルが再度先読みブート・ファイルとして選択されたときに、残りのファイルをブート・キャッシュにフィルすることもできる。
【００１２】
先読みブート・ファイルは、所定数のタスクに占める同一のブート・ファイルを読み出すタスクの数の割合を計算して選択することができる。先読みブート・ファイルは、観測した所定数のタスクにおいて１つのブート・ファイルのサイズと残りの複数のブート・ファイルのサイズを合計したサイズを比較して選択することができる。ブート・キャッシュの容量には限界があるので、このような方法によりリソースの競合を排除するために効果的な先読みブート・ファイルを選択することができる。先読みブート・ファイルは、上記の比較結果に基づいて残りの複数のブート・ファイルとして選択することができる。
【００１３】
先読みブート・ファイルは、さらに所定のサイズ以上のブート・ファイルとして選択することができる。サイズの大きいブート・ファイルは、読み出しを実行するタスクの数が増える可能性が高く、結果として他のタスクとの間でリソースの競合が発生する可能性も高いため、ブート・キャッシュにフィルしておくとブート時間の短縮に効果的である。リソースの競合は、順番に実行されるタスクの中で前後のタスク間で起こることが多い。したがって先読みブート・ファイルは、順番に実行される複数のタスクの中から１つおきに選択したタスクで読み出される複数のブート・ファイルとして選択することができる。ブートの進行に伴ってブート・ファイル間におけるリソースの競合の状態は変化するので、先読みブート・ファイルを選択するための観測は、ブート中の一定の時間ごとまたは読み出したブート・ファイルのサイズごとに実行することで対応することができる。このときブート・キャッシュはＬＲＵやＦＩＦＯなどのアルゴリズムで更新してブートの進行に対応できるようにする。
【００１４】
ロードしたブート・ファイルの単位時間あたりの平均読み取りサイズを所定の経過時間ごとに計算した結果に基づいて先読みブート・ファイルを選択してもよい。このとき、平均読み取りサイズの長期移動平均と短期移動平均を計算し、先読みのタイミングは、短期移動平均が長期移動平均を下回ったタイミングに設定することができる。短期移動平均が長期移動平均を上回ったときに長期移動平均と短期移動平均に基づくブート・ファイルの先読みを停止することができる。
【００１５】
ブート・キャッシュは、メイン・メモリの一部にブート・キャッシュ領域として構成し、ブート・ドライバがブートを完了した後にブート・キャッシュ領域を開放するようにしてもよい。ブート・ドライバは、実行可能キューに登録された連続するタスクの中から同一ファイルを読み出す２つのタスクの間に存在するすべてのタスクが読み出すブート・ファイルをブート・キャッシュにフィルするようにしてもよい。ブート・ドライバは、実行可能キューに登録された複数のタスクの中に所定数以上存在する同一のタスクが読み出すブート・ファイルをブート・キャッシュにフィルするようにしてもよい。
【発明の効果】
【００１６】
本発明により、ブート時間を短縮するブート方法を提供することができた。さらに本発明により、ブート・ファイルの構成が変更されても対応が可能なブート方法を提供することができた。さらに本発明により、そのようなブート方法を実現するコンピュータおよびコンピュータ・プログラムを提供することができた。
【発明を実施するための最良の形態】
【００１７】
［コンピュータの構成］
図１は、コンピュータ１０の概略のハードウエア構成を示すブロック図である。ＣＰＵ１１は、コンピュータ１０の中枢機能を担う演算処理装置で、ＯＳ、ＢＩＯＳ、デバイス・ドライバ、あるいはアプリケーション・プログラムなどを実行する。ＣＰＵ１１は、ノース・ブリッジ１３およびノース・ブリッジ１３にさまざまなバスを経由して接続された各デバイスを制御する。ノース・ブリッジ１３は、メイン・メモリ１５へのアクセス動作を制御するためのメモリ・コントローラ機能や、ＣＰＵ１１と他のデバイスとの間のデータ転送速度の差を吸収するためのデータ・バッファ機能などを含む。
【００１８】
メイン・メモリ１５は、ＣＰＵ１１が実行するプログラムの読み込み領域、処理データを書き込む作業領域として利用される揮発性のＲＡＭである。メイン・メモリ１５には、図４に示すようにＯＳのキャッシュ機能を実現するＯＳキャッシュ領域８５、本発明のキャッシュ機能を提供するブート・キャッシュ領域８３、およびロード領域８１を備える。なお、ブート・キャッシュ領域８３は、メイン・メモリ１５の一部としてではなく専用のメモリで構成してもよい。ブート・キャッシュ領域８３はＯＳのカーネル領域にあり、その容量は制約を受ける。ブート時には、ＣＰＵ１１は各ブート・ファイルをメイン・メモリ１５上での実行領域であるロード領域８１に読み出す。ブート・ファイルをＨＤＤ１９からメイン・メモリ１５の実行可能な領域のアドレスに読み出すことをロードという。
【００１９】
サウス・ブリッジ１７は、ノース・ブリッジ１３に接続され、さまざまな周辺入出力デバイスのインターフェースやＰＣＩバス、ＰＣＩ−Ｅｘｐｒｅｓｓバスのポートを備えている。サウス・ブリッジ１７にはＨＤＤ１９が接続される。ＨＤＤ１９には、ＯＳ、デバイス・ドライバ、アプリケーションなどの周知のプログラムの他に、本実施の形態にかかるソフトウエア・プログラムであるブート・ドライバ１１９（図４参照）を格納する。ＨＤＤ１９に格納されたＯＳはプリエンプティブなマルチタスキングを行う。
【００２０】
さらにサウス・ブリッジ１７は、ＰＣＩバスまたはＬＰＣバス２３を介して、従来からノートＰＣ１０に使用されているレガシー・デバイス、あるいは高速なデータ転送を要求しないデバイスに接続される。ＬＰＣバス２３には、ＢＩＯＳ＿ＲＯＭ２５が接続されている。ＢＩＯＳ＿ＲＯＭ２５は、不揮発性で記憶内容の電気的な書き替えが可能なメモリである。ＢＩＯＳ＿ＲＯＭ２５は、ハードウエアの試験および初期化を行うＰＯＳＴ（Power-On Self Test）、ＢＩＯＳの制御下でブート・デバイスにアクセスするための入出力を制御する周辺機器制御コード、電源および筐体内の温度などを管理するユーティリティ、パスワードの認証を行うパスワード認証コードなどを格納する。
【００２１】
［タスクの状態遷移］
図２（Ａ）は、マルチタスクＯＳがタスクを管理するときの状態を示す状態遷移図で、図２（Ｂ）は、実行可能キューにタスク制御ブロック（ＴＣＢ）が登録されている状態を示す図である。なお、本明細書ではタスクという用語をプロセスおよびスレッドまたはそのいずれかを示すものとして使用する。ブートが開始されるとブート・ファイルをロードするためのタスクが生成される。
【００２２】
ＯＳのタスク管理はブート・ファイルの読み出しのために、必要なリソースを割り付けてタスクを生成する。リソースには、ブート・ファイルが格納されているＨＤＤ１９も含まれる。プリエンプティブなマルチタスキングのもとでは、ＯＳは特定のブート・ファイルをロードする際に一度に全体を読み出すのではなくて、当該ブート・ファイルの読み出しを複数のタスクに分割して他のブート・ファイルの読み出しのためのタスクと平行して実行しながら読み出す。１つのタスクが実行されるとブート・ファイルの一部がメイン・メモリのロード領域８１に書き込まれ、同一のブート・ファイルを読み出す複数のタスクが実行されてブート・ファイルの全体がロード領域８１に書き込まれる。プリエンプティブなマルチタスキングは、ブートが完了したあとではリソースの競合が少ないのでユーザに並行作業という快適なコンピュータの使用環境を提供するが、ブート時は後に説明するようにむしろブート時間の遅延をもたらす。
【００２３】
タスクは基本的にＯＳにより、タスクの生成（Created）３１、実行可能状態（Ready state）３３、実行状態（Running）３５、実行待ち状態（Waiting State）３７、およびタスクの消滅（Terminated）３９のいずれかの状態で管理される。タスクは、実行中のプログラムとＣＰＵ１１の状態を示す情報などで構成されており、ＯＳはタスクをＴＣＢというデータ構造で管理する。ＴＣＢは、プロセッサ状態、タスクの優先度、タイム・スライス情報、タスク識別子、およびデバイス情報などで構成される。プロセッサ状態は、ＣＰＵ１１がタスクを中断したときのレジスタ、スタック、およびプログラム・カウンタなどの状態に関する情報でコンテキストともいう。タスクの優先度は、タスク間におけるコンテキスト・スイッチの優先順位を示す情報である。タイム・スライス情報は、タイム・スライスの初期値や残り時間に関する情報である。
【００２４】
タイム・スライスとはタスクがＣＰＵ１１に対する一度の実行権を獲得したときに許される最大実行時間をいう。タスク識別子は、各タスクに割り当てられた一意の番号である。デバイス情報は、当該タスクに割り当てられたデバイスの識別情報である。なお、ＴＣＢには、ＯＳにより異なるその他のさまざまな情報が含まれる。ＯＳにより生成されたＴＣＢはＯＳのデータ領域に確保された図２（Ｂ）の実行可能キュー４０にラウンド・ロビン方式または優先度方式などのさまざまな方式で実行の順番に登録されて実行可能状態３３になる（遷移１）。
【００２５】
ここでは実行可能キュー４０に、タスクＡ、タスクＢ、タスクＣ、タスクＤ、およびタスクＥの５個のタスクが登録されてＣＰＵ１１による実行を待っている。ＯＳのスケジューラは、各タスクを実行状態３５と実行可能状態３３の間で遷移させてコンテキスト・スイッチを行う（遷移２、遷移３）。実行可能状態３３から実行状態３５に遷移させることをディスパッチといい、実行状態３５から実行可能状態３３に遷移させることをプリエンプト（横取り）という。プリエンプティブなマルチタスクを行うスケジューラは、たとえば実行中のタスクＡに与えられたタイム・スライスが経過すると、タスクＡに対するＣＰＵ１１の実行権を強制的にプリエンプトして実行可能キュー４０の最後の位置に戻し、つぎのタスクＢを実行状態３５に移行させるといったように制御してタスクＡ〜タスクＥを順番に実行する。
【００２６】
実行状態３５に入ったタスクが、自らの実行に必要なデバイスが取り外されたり故障したりして使用できない状態になっていることが判明したときは、実行待ち状態３７に移行し（遷移４）、ＯＳはＴＣＢをＯＳのデータ領域に確保された実行待ちキューに登録する。実行待ちキューに登録されたタスクに割り付けられていたデバイスが使用可能になると、そのデバイスはＯＳ経由でＣＰＵ１１に割り込みをかけてタスク管理に通知し、タスク管理は当該タスクを実行待ち状態３７から実行可能状態３３に移行させＴＣＢを実行可能キュー４０に登録する。その後タスクは、スケジューラのアルゴリズムに基づいて実行状態３５に移行してＣＰＵ１１により実行される。特定のブート・ファイルのロードが完了すると当該ブート・ファイルのロードのために生成されたタスクが終了して、タスク管理は、当該タスクをタスクの消滅３９に移行させる（遷移６）。
【００２７】
［ブート時間が遅延する原因の説明］
図３は、プリエンプティブなマルチタスキングのもとでブート時間が遅延する原因を説明する図である。図３（Ａ）は、ＨＤＤ１９のディスク５０にブート・ファイル５１、５３、５５が異なるトラックに記録されている様子を示している。ブート・ファイル５１、５３、５５をロードする際には、ＨＤＤ１９のヘッドが各トラックに移動してブート・ファイルを読み取る必要がある。１つのブート・ファイルは、通常は１つのトラックに連続して格納され、さらに必要に応じて隣接するトラックに格納されている。したがって、１つのブート・ファイルを連続して読み出すことができれば、無駄なシークは抑えられブート時間が遅延することはない。
【００２８】
しかし、実際には、ブート・ファイル５１、５３、５５を読み出すタスクが同時に存在して実行可能キュー４０に登録されると、これらの、トラック間をヘッドが移動するための無駄なシーク時間が発生して、ブート時間を遅延させる原因をつくることになる。さらにブート・ファイル５１、５３、５５が実行されるとさらに他のブート・ファイルを読み出すタスクを生成して、一層無駄なシーク時間が発生する。プリエンプティブなマルチタスキングでは、最初にブート・ファイル５１を読み出すためのタスクが実行されたときに、ブート・ファイル５１の全体の読み出しが完了する前に他のブート・ファイル５３、５５を読み出すタスクが実行されるため、無駄なシーク時間は必然的に発生する。
【００２９】
ここで、ブート・ファイル５１、ブート・ファイル５５、ブート・ファイル５３の順番にタスクが実行されて読み取られる場合と、ブート・ファイル５１、ブート・ファイル５３、ブート・ファイル５５の順番にタスクが実行されて読み取られる場合とを考えた場合、移動距離に関係するシーク時間は前者の方が長くなる。このように同じブート・ファイルをロードする場合でもその読み出しにかかるタスクの実行順序でシーク時間に差がでる。ＯＳのスケジューラはシーク時間を考慮してタスクの実行順序を決めることはできない。シーク時間に着目してブート時間を遅延させるブート・ファイルを選択する場合は、タスクの実行順序およびトラック上でのブート・ファイルの格納位置を調べる必要があり実際にブートさせてログを収集しない限り困難である。また、一度ブート時間を遅延させるブート・ファイルを探すことができたとしても、一連のブート・ファイルの構成が変更されるとそのログは利用できなくなる。
【００３０】
したがって従来はブート時間を短縮させるためには、実際にブートさせた段階でブート時間を遅延させるブート・ファイルを特定して、次回以降のブートでそのブート・ファイルをキャッシュに先読みしておくしか方法がなかった。本発明では後に説明するように、ブート時間の遅延がシーク時間だけでなく、ＨＤＤ１９という１つのブート・デバイスに関するリソースの競合が起因しているという視点に着眼して先読みするブート・ファイルを特定し、限られた容量のブート・キャッシュに効率よくキャッシングしてブート時間を短縮することができる。
【００３１】
ブートが進行すると、多くのプログラムが実行されて新しいタスクを生成してファイルを読み出し、そのファイルがさらに新しいタスクを生成して別のファイルを読み出すというようになり、同時に実行可能キュー４０に登録されるタスクの数が増える。通常は１台のＨＤＤ１９からブートすることになっており、かつ、ＨＤＤ１９は同時に１つの入力または出力しか処理できないので、マルチタスキング上で複数のタスクが実行待ちキュー４０に登録されて同時にＨＤＤ１９に対する出力要求をするような場合は、いずれか１つのタスクを除いて出力待ちの状態になりいわゆるリソースの競合が発生する。
【００３２】
図３（Ｂ）は、ＨＤＤ１９のアクセスに関するリソースの競合が発生する様子を説明する図である。ブート・ファイルａ、ｂ、ｃ、ｄ、ｅをロードするためのタスクＡ、Ｂ、Ｃ、Ｄ、Ｅが同時に存在して実行可能キュー４０に登録され、タイム・スライス６１、６２、６３、６４、６５、６６で順番に実行される。タスクＡはタイム・スライス６１、６６で実行される。各タイム・スライスは一定の時間として設定されており、各タスクでは与えられたタイム・スライスを消費すると処理状況とは無関係につぎのタスクにＣＰＵ１１の実行権が渡される。
【００３３】
各タスクでは、ブート・ファイルの読み取り要求をするために、ＡＰＩ（Application Program Interface）関数を呼び出す。タスクＡが時刻ｔ０１でＨＤＤ１９に対するブート・ファイルａの一部の読み出し要求７１をしたときに、タイム・スライス６１の終了時刻ｔ１までロードが完了してＨＤＤ１９がタスクＡから解放されればリソースの競合は発生しない。よって、タスクＢが時刻ｔ１１でＨＤＤ１９に対するブート・ファイルｂの一部の読み出し要求７３をしてもＨＤＤ１９にアクセスできるためタスクＢは待つことなく実行される。しかし、タスクＡによるＨＤＤ１９のディスク・ドライバ１２７に対する読み出し要求が時刻ｔ１までに完了している場合は、時刻ｔ１までデバイス・ドライバ１２７から出力完了の通知を受け取らなくても、その読み出し要求はキャンセルされず、しかも時刻ｔ１でタスクＢにタスク・スイッチが行われる。
【００３４】
そして、タスクＡの読み出し要求７１で読み出されたブート・ファイルａの一部は、タスクＢによりタスクＡで指定した場所にロードされるので、読み出し要求７１はタイム・スライス６２の時刻ｔ１２で、デバイス・ドライバ１２７から出力完了の通知７７で完了する。したがって、時刻ｔ１１でタスクＢがＨＤＤ１９からブート・ファイルｂの一部の読み出し要求７３をしても、ＨＤＤ１９がタスクＡのために読み出し要求７１を処理しているのでタスクＢの処理は待たされる。そして、タスクＢが時刻ｔ１３でブート・ファイルｂの一部の読み出し要求７５を行ったときに、その読み出し要求７５が時刻ｔ２で完了していない場合は、読み出し要求７５はキャンセルされ、つぎにタスクＢがディスパッチされたときに再度読み出し要求７５が処理される。
【００３５】
このように、タスクＢのタイム・スライス６２にはリソースの競合に基づく無駄な時間が発生しブート時間の遅延につながる。このようなリソースの競合はシーク時間とは異なるブート時間遅延の原因であり、この場合、ブート・ファイルｂ、ｃ、ｄ、ｅをブート・キャッシュ領域８３に先読みしておけば、競合によるブート時間の遅延を解消することができる。リソースの競合は、タイム・スライスにおける入出力待ちの時間から判断すると、通常は前後して実行されるタスクの間で発生するので、前後して実行されタスクの一方がブート・キャッシュ領域８３からブート・ファイルを読み出すようにしても解消することができる。
【００３６】
［ブートを実行する構成］
図４は、ブートを実現する構成を説明するためのブロック図である。図４のブロック図では、Ｗｉｎｄｏｗｓ（登録商標）の関数を例示してブートに関連する主要なソフトウエアとハードウエアだけを示している。ただし、本発明はＯＳがＷｉｎｄｏｗｓの場合だけに限定されるものではなく、本発明の思想の範囲内で他の周知のＯＳに適用することもできる。
【００３７】
図４では、ブート・ドライバ１１９、およびブート・キャッシュ領域８３以外は周知の要素である。ライン１０２より上側に記載されたソフトウエアはプロセッサ１１のユーザ・モードで動作し、下側に記載されたソフトウエアはカーネル・モードで動作する。ブート・システム・コード１０１は、ＢＩＯＳからＯＳに制御が移ったときに最初に実行され、つぎのブート・ファイルをロードする役割を果たす。ブート・ストラップ手法では、先に読み出されたブート・ファイルがつぎのブート・ファイルを読み出すといったように順番にブート・ファイルをメイン・メモリにロードしていく。
【００３８】
Kernel32.dllは、ＷｉｎｄｏｗｓのサブシステムＤＬＬ（Dynamic Link Library）の一部であり、公開されているＷｉｎｄｏｗｓＡＰＩ関数を非公開のカーネル・モード・システム・サービスへの呼び出しに変換する。たとえば、先にロードされたブート・ファイルがつぎのブート・ファイルをＨＤＤ１９からメイン・メモリ１５に読み出すために、ReadFile APIというアプリケーションに公開されている関数を呼び出すと、それに応じて非公開のNtoskrnl.exeに実装されているNtReadFileという内部関数が呼び出されてＨＤＤ１９からデータがロードされる。
【００３９】
Ntdll.dllは、サブシステムＤＬＬを使用するための関数を提供するサポート・ライブラリである。Ntdll.dllは、ユーザ・モードから呼び出すことができるインターフェース機能（System Service Dispatch Stub）と、サブシステムＤＬＬが使用するNtReadFile関数などの内部サポート関数で構成されている。タスク管理１０９は、実行可能キュー４０および実行待ちキューを含み、図２で説明したようにタスクを管理する。タスク管理１０９は、ブート・ファイルのロードのために呼び出されたReadFile APIという関数に対して生成されたタスクのＴＣＢの情報を保持している。
【００４０】
割り込みディスパッチ・テーブル（ＩＤＴ）１１１は、ＯＳによりメイン・メモリ１５に展開され、ブート・システム・コード１０１およびブート・ファイルがソフトウエア割り込みを行って所定のシステム・サービスに移行するためのアドレスを各エントリーに格納する。たとえば、ＣＰＵ１１のＥＡＸレジスタにシステム・サービス番号を設定してエントリーのインデックスをＩＮＴ  ０ｘ２ｅ（１６進数）と指定すれば、そのエントリーに格納されたアドレスのシステム・サービスであるシステム・サービス・ディスパッチャ（ＳＳＤ）１１５を実行して、プロセッサ１１の制御をユーザ・モードからカーネル・モードに移行させることができる。
【００４１】
ＳＳＤ１１５は、Ntoskrnl.exeの一部であり、スレッドのユーザ・モード・スタックからカーネル・モード・スタックに呼び出し元コードの引数（パラメータともいう。）をコピーする。ＳＳＤ１１５はシステム・サービス・ディスパッチ・テーブル（ＳＳＤＴ）１１３のエントリーを参照して呼び出されたシステム・サービスを実行する。ＳＳＤＴ１１３には、システム・サービスのＩＤと対応するシステム・サービスを記述するコードの先頭アドレスが格納されている。
【００４２】
たとえば、あるエントリーにはＩＤとしてNtReadFile関数を示す情報が格納され、アドレスとしてNtReadFile関数１１７の実際のコードを記憶しているメイン・メモリ１５上のアドレスが格納されている。NtReadFile関数１１７は、Ntoskrnl.exeの一部である。ブート・ドライバ１１９の構成については図５を参照して後に説明する。ファイル・システム１２３は、ＨＤＤ１９に格納されているデータを管理するためにＯＳが提供するソフトウエアである。ファイル・システム１２３は、ＦＡＴ（File Allocation Table）およびディレクトリを作成してＨＤＤ１９に関するファイルの記録、読み取り、削除、または移動などを管理する。
【００４３】
ＯＳキャッシュ・マネージャ１２１はＨＤＤ１９に対するアクセスのパフォーマンスを向上させるためにＯＳが提供するソフトウエアである。ＯＳキャッシュ・マネージャ１２１は、ＨＤＤ１９に対して、ReadFile API関数やWriteFile API関数が呼び出されたときに毎回ＨＤＤ１９にアクセスしないでも処理できるように、ＯＳキャッシュ領域８５にデータをプリフェッチしてフィルする。ＯＳキャッシュ・マネージャ１２１は、コンピュータ１０で実行されるすべてのソフトウエアからのＨＤＤ１９に対するアクセスを対象にして、独自のアルゴリズムに基づいてＯＳキャッシュ領域８５に対するファイルのフィルおよびフラッシュを管理する。なお、新たなデータをブート・キャッシュ領域８３やＯＳキャッシュ領域８５にフィルしたり、その際に古いデータをフラッシュしたりすることをキャッシングという。ディスク・ドライバ１２７は、ＨＤＤ１９の動作およびデータ転送を制御するためのソフトウエアである。
【００４４】
［ブート・ドライバの構成］
図５は、ブート・ドライバ１１９の主要な構成を示す機能ブロック図である。Ｉ／Ｏ制御部１５１は、外部と内部の各要素とのインターフェース機能を果たす。先読みファイル選定部１５３は、ブート・システム・コード１０１またはそれに続いて読み出されたブート・ファイルからReadFile API関数が呼び出されたときに以下に説明する第１の方法ないし第３の方法に応じて複数の制御をすることができる。
【００４５】
第１の方法では、先読みファイル選定部１５３は、NtReadFile関数をフックして得られるリード要求のプリフェッチキューｘｘｘを管理して、読み出すブート・ファイルを選択し、同時にそれぞれのリード要求を行っているタスクをタスク管理１０９に問い合わせて関係するタスクを識別する。第２の方法では、タスク管理１０９に現在実行可能キュー４０に登録されているタスクの情報を問い合わせ、ファイル・システム１２３にそれらのタスクが読み出すブート・ファイルのサイズを問い合わせる。そして、所定のサイズより大きいブート・ファイルをブート・キャッシュ領域８３に先読みするブート・ファイルとして選択する。
【００４６】
第３の方法では、周知のリアル・タイム・クロック（ＲＴＣ）からブート開始からの時間情報を取得し、さらに、ファイル読み取り部１５５がその時刻までロードが完了したブート・ファイルの合計サイズを蓄積して、単位時間あたりにロードが完了したブート・ファイルの平均読み取りサイズを計算し、さらに平均読み取りサイズの長期移動平均および短期移動平均を計算して、ブート・キャッシュ領域８３への先読みを開始するタイミングとそれを停止するタイミングを決定して先読みファイルを選択する。
【００４７】
ファイル読み取り部１５５は、フックしたすべてのReadFile API関数に対応するNtReadFile関数を実行する。ファイル読み取り部１５５は、先読みファイル選定部１５３が選定した先読みブート・ファイルに対して生成した特別なシステム・タスクにより、引数を修正したNtReadFile関数を実行し、先読みファイル選定部１５３が選定した先読みブート・ファイル以外のブート・ファイルに対してはすでに生成されたタスクにより設定された引数を修正しないでNtReadFile関数を実行する。そのシステム・タスクはユーザ・モードのタスクとは異なりカーネル・モードだけで動作する特殊なタスクである。
【００４８】
ファイル読み取り部１５５は、特別なシステム・タスクを実行して選定された先読みブート・ファイルの全体または大部分をブート・キャッシュ領域８３に短時間に読み出すことができる。ブート・キャッシュ制御部１５７は、ファイル読み取り部１５５がＨＤＤ１９から読みとったブート・ファイルをＬＲＵ（Least Recently Used）方式でブート・キャッシュ領域８３にキャッシングする。ＳＳＤＴ書き換え部１５９は、ブート・ドライバ１１９がＯＳと一緒にメイン・メモリ１５にロードされるときに、ＳＳＤＴ１１３におけるNtReadFile関数というＩＤに対応するアドレスをNtReadFile関数１１７のアドレスからブート・ドライバ１１９のアドレスに書き換える。
【００４９】
このようにＳＳＤＴ１１３のアドレスをＯＳがあらかじめ設定した関数のアドレスから別のコードのアドレスに書き換えることを、関数をフックするという。データ転送部１６１は、先行するブート・ファイルが後続のブート・ファイルをメイン・メモリ１５にロードするために呼び出したReadFile API関数に対応してタスク管理１０９により生成されたタスクのブート・ファイルがブート・キャッシュ領域８３にフィルされているか否かを判断する。データ転送部１６１はフィルされていると判断した場合は当該ブート・ファイルをメイン・メモリ１５のロード領域８１に転送する。データ転送部１６１はフィルされていないと判断したときは処理をファイル読み取り部１５５に渡し、ファイル読み取り部１５５は、NtReadFile関数を実行してＨＤＤ１９からブート・ファイルを読み出す。なお、図３に示したブート・ドライバ１１９の構成は一例であり、当業者にとって明らかな範囲で同等の機能を実現できる他のいかなる構成を採用することもできる。
【００５０】
［第１の方法］
つぎに図１ないし図５で説明したコンピュータ１０において、ブート時間を短縮する第１の方法を説明する。図３（Ｂ）で説明したように、あるブート・ファイルの読み出しを実行する２つのタスクと、その間に挟まれている別のブート・ファイルを読み出すタスクが実行順に並んでいるときに、挟まれているブート・ファイルをブート・キャッシュ領域８３に先読みしておけば、それらの一連のブート・ファイルの読み出しにおいてリソースの競合が発生しないために、ブート時間を短縮することができる。挟まれているブート・ファイルを検出して先読みするブート・ファイルを決定する方法を以下に説明する。
【００５１】
図６は、実行可能キュー４０に複数のタスクが登録されている様子を示している。タスク番号はタスクが生成された順番に割り当てられ、また、各タスクは並んでいる順番に上から実行されるものとする。ただし、実行可能キュー４０には、タスクが生成された順番とは異なる順番でタスクが登録される場合もある。登録の順番はＯＳのスケジューラのアルゴリズムに依存する。またタスクが完了して消滅するタイミングとタスクが生成された順番とは関係がない。対象ファイルは当該タスクがＨＤＤ１９からメイン・メモリ１５のロード領域８１に読み出すブート・ファイルの名称とＨＤＤ１９における格納場所を示す。タスク名称は、対象ファイルを読み出すタスクの名称で、データ・サイズは当該タスクで読み出すブート・ファイルの一部のサイズを示す。
【００５２】
先読みファイル選定部１５３は、ブートを開始してから所定のタイミングでタスク管理１０９に問い合わせて、２０個程度の連続するタスクを抽出し同一の名称のタスクがたとえば全体の２／３程度以上存在するか否かを調べる。図６では、ブート・ファイルとしてａ、ｂ、ｃ、ｄ、ｅが読み出されている様子が示されている。図６ではブート・ファイルａを読み出すタスクＡが全体の２／３以上存在しているものとする。同一名称のタスクＡの数が多い場合は、タスクＡの間に挟まれたその他のタスクとの間でリソースの競合が発生してブート時間が遅延する可能性が高いことを意味する。
【００５３】
そして２０個のタスクの中で、ファイルａのサイズがその他のファイルｂ、ｃ、ｄ、ｅの合計サイズよりも大きく、かつ、ブート・キャッシュ領域８３のサイズより小さい場合は、ファイルａをブート・キャッシュ領域８３に先読みする。そしてブート・ファイルａ、ｂ、ｃ、ｄ、ｅの読み出しを行うタスクが実行待ちキュー４０に同時に存在する場合には、ブート・ファイルａをブート・キャッシュ領域８３からロード領域８１に書き込む。その結果、タスクＡとこれに前後するタスクとの間のリソースの競合が解消されブート時間を短縮することができる。タスクＡは、サイズが大きいのでタスクの存続時間が長くなってディスパッチされる頻度が高く、あらかじめブート・キャッシュ領域８３にフィルしておけば、ブートが進行したときにこれに前後するタスクとの間でリソースの競合を排除できる頻度が高い。
【００５４】
逆に、ファイルａのサイズがその他のファイルｂ、ｃ、ｄ、ｅの合計サイズよりも小さく、かつ、その他のファイルｂ、ｃ、ｄ、ｅの合計サイズがブート・キャッシュ領域８３のサイズより小さい場合は、ファイルｂ、ｃ、ｄ、ｅをブート・キャッシュ領域８３に先読みする。そしてブート・ファイルａ、ｂ、ｃ、ｄ、ｅの読み出しを行うタスクが同時に実行待ちキュー４０に存在する場合には、ブート・ファイルｂ、ｃ、ｄ、ｅをブート・キャッシュ領域８３からロード領域８１に書き込む。その結果、タスクＡ、Ｂ、Ｃ、Ｄ、Ｅの間のリソースの競合がすべて解消されブート時間を短縮することができる。ブート・ファイルｂ、ｃ、ｄ、ｅは、比較的ファイル・サイズが小さいため、タスクＢ、Ｃ、Ｄ、Ｅの存続時間は短いが、存続する間はリソースの競合を排除する頻度が高い。
【００５５】
このように、複数存在する同一名称のタスクが読み取るブート・ファイルのサイズと、その間に挟まれることになるその他のタスクが読み取るブート・ファイルのサイズの合計サイズとを比較して、大きい方がブート・キャッシュ領域８３のサイズ以内であることを条件にして先読みブート・ファイルを選定する。そして、タスクが実行される前にそれらをブート・キャッシュ領域８３に先読みしてＨＤＤ１９に対するアクセスの競合を排除することができる。
【００５６】
なお、順番に実行される複数のタスクの中でタスクを１つおきに選択し、選択したタスクが読み出すブート・ファイルを先読みブート・ファイルとしてブート・キャッシュ領域８３にフィルしてもよい。たとえば図６では偶数番号または奇数番号のタスクが読み出すブート・ファイルをブート・キャッシュ領域８３にフィルすれば、タスク番号１１１からタスク番号１３０までのタスクをほとんどリソースの競合を排除して実行することができる。
【００５７】
図７はこのような方法でブート時間を短縮する手順を記載したフローチャートである。ブロック２０１では、コンピュータ１０に電源が投入されＢＩＯＳ＿ＲＯＭのＰＯＳＴが実行される。その後、ＨＤＤ１９に格納されたＭＢＲおよびブート・セクタのコードに制御が移る。従来通りの手順でブート・システム・コード１０１が最初に実行されて後続のブート・ファイルをロードするタスクが生成される。つづいて、後続のブート・ファイルが実行されてさらに後続のブート・ファイルをロードするタスクが生成され、以後順番にブートが完了するまで繰り返される。各ブート・ファイルはCreateFile API関数およびReadFile API関数を呼び出してＨＤＤ１９に対する後続ファイルの読み出し要求を行っている。
【００５８】
図４に示すソフトウエアがすべてロードされた段階から、ブート・ドライバ１１９が動作を開始して、図７の手順が開始される。いま、ある瞬間に、図６の２０個のタスクが観測され、上側のタスクから順番に実行されてブート・ファイルがメイン・メモリ１５にロードされているものとする。各タスクにおいてReadFile API関数が呼び出され、そのＴＣＢが実行可能キュー４０に登録されてスケジューラによりＣＰＵ１１にディスパッチされるのを待っている。ブート・ドライバ１１９はブートの初期段階でＯＳと一緒にメイン・メモリ１５にロードされ、ＳＳＤＴ書き換え部１５９によりＳＳＤＴ１１３のNtReadFileというＩＤのメイン・メモリ１５上でのアドレスが、NtReadFile関数１１７の先頭アドレスからブート・ドライバ１１９の先頭アドレスに書き換えられてフックされている。
【００５９】
ＯＳキャッシュ・マネージャ１２１は、ブート・ドライバ１１９によるブート・キャッシュ領域８３のキャッシングとは独立してＯＳキャッシュ領域８５に対するキャッシングを管理している。ＯＳキャッシュ領域８５にはブート時のリソースの競合の存否とは無関係にブート・ファイルの断片がフィルされているが、ブート時間の短縮に対する効果は低い。ＳＳＤＴ１１３のアドレスは書き換えられているため、各タスクから呼び出されたReadFile API関数はすべてブート・ドライバ１１９で処理される。
【００６０】
ブロック２０３では、先読みファイル選定部１５３がNtReadFile関数をフックして得られるリード要求のプリフェッチキューｘｘｘを管理して、図６で説明した方法で読み出すブート・ファイルを選択して、同時にそれぞれのリード要求を行っているタスクをタスク管理１０９に問い合わせて関係するタスクを識別する。ブート・ファイルがロードされて実行されると、そのブート・ファイルが下位のブート・ファイルを読み出すためのタスクを生成し、その下位のブート・ファイルがさらに下位のブート・ファイルを読み出すためのタスクを生成する。その結果、ブートが進行するに伴って多数のタスクが実行可能キュー４０に登録されるようになり、リソースの競合が多数発生してブート時間の遅延が激しくなる。ブロック２０３の判断を行う最初のタイミングは遅延が激しくなる全ブート時間の中間位に設定することができる。
【００６１】
ブロック２０３で観測したリード要求のプリフェッチキューｘｘｘの中には先読みの対象となるブート・ファイルは存在しないと先読みファイル選定部１５３が判断したときは、ブロック２０９に移行する。先読みファイル選定部１５３が先読みの対象となる先読みブート・ファイルがリード要求のプリフェッチキューｘｘｘの中に存在すると判断したときは、ブロック２０５に移行する。ブロック２０５では、ファイル読み取り部１５５が、先読みブート・ファイルがブート・キャッシュ領域８３にフィルされているか否かを判断する。フィルされている場合はブロック２０９に移行する。
【００６２】
フィルされていない場合は、ブロック２０７に移行する。ブロック２０５で、先読みの対象となるブート・ファイルとしてファイルｂ、ｃ、ｄ、ｅが存在すると判断した場合は、ファイル読み取り部１５５がファイルｂ、ｃ、ｄ、ｅをブート・キャッシュ領域８３に読み出す特別なシステム・タスクを複数生成してNtReadFile関数を順番に実行する。NtReadFile関数の引数にはブート・キャッシュ領域８３のアドレスが指定される。このシステム・タスクは、ブートするために生成されたユーザ・モードのタスクからは独立して実行される。
【００６３】
システム・タスクは優先度を上げてあり、NtReadFile関数を実行することにより、最初にブート・ファイルｂの全体を読み出し、つぎにブート・ファイルｃの全体を読み出し、以後順番にブート・ファイルｅまで読み出す。ブート・ファイルｂ、ｃ、ｄ、ｅのブート・キャッシュ領域８３への書き込みの際には、ＨＤＤ１９にシークが発生する可能性はあるが、特別なシステム・スレッドで読み出されるため、後続のタスクとの間でリソースが競合する可能性はブート・ファイルｂからブート・ファイルｃといったように異なるタスクにスイッチするときだけであり比較的短時間でフィルは完了する。
【００６４】
ブロック２０５で、先読みの対象となるブート・ファイルとしてファイルａが選択された場合は、同様の手順でファイル読み取り部１５５がファイルａの全体または一部だけをブート・キャッシュ領域８３に読み出す。ブロック２０９ではやがて、タスク番号１１１のタスクＡがディスパッチされて実行される。この時点では、リソースの競合が発生するとして選択されたブート・ファイルｂ、ｃ、ｄ、ｅ、はブート・キャッシュ領域８３にフィルされている。ブロック２１１では、タスクＡで実行されるNtReadFile関数をチェックしたデータ転送部１６１は、ファイルａがブート・キャッシュ領域８３に存在するか否かを判断する。
【００６５】
ブロック２０７でブート・ファイルａは、ブート・キャッシュ領域８３にフィルされていないので、ブロック２１７に移行し、ファイル読み取り部１５５は引数を修正しないでNtReadFile関数を実行して、ＨＤＤ１９からタスクＡで読み出されるブート・ファイルａの一部（サイズ２５０）をロード領域８１に書き込む。ブロック２０３で先読み対象ファイルが選択されない場合のタスクもブロック２１７で処理される。ロード領域８１への書き込みが完了するとブロック２１５でディスク・ドライバ１２７からタスク管理１０９に読み出し完了の通知が行われブロック２０９に戻る。
【００６６】
ブロック２０９ではつづいて実行可能キュー４０に登録されたタスク番号１１２のタスクＢがＣＰＵ１１にディスパッチされて実行される。タスクＢのNtReadFile関数がフックされてブート・ドライバ１１９のデータ転送部１６１が、読み出しにかかるブート・ファイルｂがブート・キャッシュ領域８３に存在するか否かを判断する。ブロック２０７でブート・ファイルｂはブート・キャッシュ領域８３にフィルされているので、データ転送部１６１はそこからNtReadFile関数で指定されたロード領域８１の所定のアドレスに、ブロック２１３でタスク番号１１２のタスクＢで実行されるブート・ファイルｂの一部（サイズ１１０）を書き込む。タスク番号１１２のタスクＢが実行されるときに、タスクＡがＨＤＤ１９の出力待ちの状態であったとしてもブート・ファイルｂはブート・キャッシュ領域８３から読み出されるのでリソースの競合は発生しない。
【００６７】
ブート・ドライバ１１９は、ブート・ファイルｂをロード領域８１に書き込むにあたり、ディスク・ドライバ１２７にＨＤＤ１９への読み出し要求をしないため、つづいて実行されるタスク番号１１３のタスクＣがリソース待ちの状態になることはなく、タスクＣもブート・ファイルｃの一部をブート・キャッシュ領域８３から読み出す。ブート・ファイルｂ、ｃ、ｄ、ｅまでブート・キャッシュ領域８３に格納されているので、タスク番号１１２のタスクＢからタスク番号１３０のタスクＡまではまったく競合が発生しないためブート時間は短縮する。
【００６８】
ブートが進行するに伴い、新たなブート・ファイルをロードするためのタスクが順番に生成される。本実施の形態では、ブロック２０３の判断を、時間周期または読み出したブート・ファイルのサイズなどを契機にしてブートが終了するまで複数回行うことで、ブートがいかなる段階に入っても競合を排除することができる。また、ブート・ファイルのサイズやブートの順番などの構成が変更されても、以前のブート・プロセスのログを生成することなくブート時間を短縮することができる。
【００６９】
ブート・キャッシュ領域８３に蓄積されるブート・ファイルが多くなるほどロード領域８１には、ブート・キャッシュ領域８３から読み出されるのでブート時間は短縮する。ブート・キャッシュ領域８３は、ブート中はブート・キャッシュ制御部１５７によりＬＲＵでキャッシングされる。ブートが進行するにしたがって、競合するブート・ファイルは変化し、ブート・キャッシュ領域８３はそれに応じて新たなブート・ファイルをキャッシングする。ブート・キャッシュ領域８３はブートが完了すると通常のメモリ領域として開放される。
【００７０】
［第２の方法］
つぎに、ブート時間を短縮する第２の方法を説明する。第２の方法は、第１の方法に代えてまたは第１の方法に加えて実施することができる。第２の方法は、図７のブロック２０３を変更する。図３（Ｂ）に示したように、ブート・ファイルａの全体のサイズが大きい場合は、ブート・ファイルａをロードするためのタスクＡが完了して消滅するまでの間に、実行待ちキュー４０とＣＰＵ１１との間でディスパッチとプリエンプトが複数回繰り返される。したがってブート・ファイルａがＨＤＤ１９から読み出される限り、ディスパッチごとに後続のタスクとの間でＨＤＤ１９に対するリソースの競合が発生する。
【００７１】
リソースの競合の頻度は、当該タスクに割り当てられるタイム・スライスの数が多いほど高くなり、ブート・ファイルに割り当てられるタイム・スライスの数はファイル・サイズが大きいほど多くなる。第２の方法では、ブロック２０３で、あるタスクで実行されるNtReadFile関数に設定された引数をブート・ドライバ１１９の先読みファイル選定部１５３が検査して、読み出されるブート・ファイルのサイズが所定値以上であるか否かを判断する。
【００７２】
ブート・ファイルａのファイル・サイズが所定値以上であると判断したときは、ブート・ファイルａの全体または一部を特別なシステム・タスクを生成してブロック２０７でブート・キャッシュ領域８３に書き込む。それ以降ブート・ファイルａを読み出すタスクが実行されるときはブート・キャッシュ領域８３からロード領域８１に転送されるため、ブート・ファイルａに前後して実行されるタスクとの間でＨＤＤ１９に対するリソースの競合が発生することはなくなる。
【００７３】
［第３の方法］
つぎに、ブート時間を短縮する第３の方法を説明する。第３の方法は、第１の方法および第２の方法またはそのいずれかに加えて実施することができる。図８は、ブート中の経過時間と単位時間あたりにロードされたブート・ファイルのサイズ（Ｍｂｐｓ）の一例を示すグラフである。ライン３０１はブート・ファイルの単位時間ごとの平均読み出しサイズで、ライン３０３はライン３０１に対する所定期間ごとの短期移動平均で、ライン３０５はライン３０１に対する所定期間ごとの長期移動平均を示す。
【００７４】
ブート中は読み出されるブート・ファイルの種類およびタスクが実行される順番で時間あたりの平均読み出しサイズは複雑に変化する。第３の方法では、クロス・ポイント３０７で短期移動平均３０３が長期移動平均３０５よりも下回ったときにブートが停滞していると判断してそれ移行に読み出されるブート・ファイルのブート・キャッシュ領域８３への先読みを行う。図７のブロック２０３においてブート・ドライバ１１９の先読みファイル選定部１５３が、短期移動平均３０３が長期移動平均３５よりも下回ったと判断したときに、ファイル読み取り部１５５がそれ以降に実行されるタスクが読み出すブート・ファイルを、システム・タスクを生成してブート・キャッシュ領域８３の容量が許す範囲でフィルする。なお、ブート・キャッシュ領域８３にフィルするファイルには、クロス・ポイント３０７で実行されたタスクよりも少し前に実行されたタスクのファイルを含めてもよい。
【００７５】
なお、第３の方法を実行している間は、第１の方法および第２の方法は停止する。ブート・ファイルがブート・キャッシュ領域８３から読み出されるにしたがって、単位時間あたりの平均読み出しサイズは上昇する。図７のブロック２０３においてブート・ドライバ１１９の先読みファイル選定部１５３が、クロス・ポイント３０９で短期移動平均３０３が長期移動平均３５よりも上回ったと判断したときにブート・キャッシュ領域８３への先読みを中止する。それ以後はブート・キャッシュ領域８３を利用して第１の方法または第２の方法を実行することができる。
【００７６】
これまで本発明について図面に示した特定の実施の形態をもって説明してきたが、本発明は図面に示した実施の形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができることはいうまでもないことである。
【図面の簡単な説明】
【００７７】
【図１】コンピュータに実装されたハードウエアの概略構成を示すブロック図である。
【図２】タスクの状態を説明する図である。
【図３】ブートが遅延する原因を説明する図である
【図４】ブートを実現する構成を説明するためのブロック図である。
【図５】ブート・ドライバの主要な構成を示す機能ブロック図である。
【図６】実行可能キューに複数のタスクが登録されている様子を示す図である。
【図７】ブート時間を短縮する手順を記載したフローチャートである。
【図８】ブート中の経過時間と単位時間あたりにロードされたブート・ファイルのサイズの一例を示すグラフである。
【符号の説明】
【００７８】
８１…ロード領域
８３…ブート・キャッシュ領域
８５…ＯＳキャッシュ領域
【図１】
0004795378.tif 000002
【図２】
0004795378.tif 000003
【図３】
0004795378.tif 000004
【図４】
0004795378.tif 000005
【図５】
0004795378.tif 000006
【図６】
0004795378.tif 000007
【図７】
0004795378.tif 000008
【図８】
0004795378.tif 000009