説明

コンピュータを短時間で起動する方法およびコンピュータ

【課題】コンピュータのブート時間を短縮する。
【解決手段】初期化コードが分割された分割型プログラム150は、それぞれエントリ・ポイント1、2、3を有する第1の初期化コード153と最適化コード157と第2の初期化コード159を含む。ブート期間中に第1の初期化コードだけが実行される。第1の初期化コードはブート期間中に他のプログラムにサービスを提供しなければならない部分だけを初期化する。第1の初期化コードの実行が終了すると分割型プログラムは部分的に起動が完了してアイドル状態に移行する。分割型プログラムは完全な起動をするための起動イベントが発生するとアイドル状態から実行状態に遷移して第2の初期化コードを実行して完全に起動する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータのブート時間を短縮する技術に関し、さらに詳細にはブート時間の短縮を図ることができるプログラム構造に関する。
【背景技術】
【0002】
コンピュータは電源が投入されると、ブート・ディスクから所定の実行可能プログラム(以後、ブート・プログラムという。)を自動的にメイン・メモリに読み出して実行する起動プロセス(ブート・ストラップまたはブートともいう。)を開始する。ユーザは一連のブート・プログラムがロードされかつ実行されてブートが完了してから所定のアプリケーション・プログラム(以後、アプリケーションという。)を利用することができるようになる。
【0003】
コンピュータの使用を開始した時点ではブート・プログラムの量が比較的少ないためブートは短時間で終了する。しかし、コンピュータを長年使用している間に、ユーザはコンピュータにさまざまなプログラムをインストールする。そして、それらのプログラムはユーザの認識していないところでブート・プログラムに組み込まれて自動起動されるようになりブート時間が長くなる。
【0004】
特許文献1は、マルチタスク・システムにおいて、システムの起動の高速化を図る発明を開示する。同文献の発明は、オペレーティング・システム(OS)を初期化する時間内において生成するタスク・オブジェクト(静的生成)を数的に制限して起動時間の短縮を図っている。具体的には、起動完了後にアクセスされるまでの初期アクセス時間が相対的に短いタスク・オブジェクトであれば静的生成の対象にするが、初期アクセス時間が一定以上に長いタスク・オブジェクトは起動完了後にアプリケーション内において特定のシステムコールを呼び出して生成する(動的生成)。特許文献2は、OSと並行して起動するアプリケーションを、さまざまな条件に基づいてタイミングをずらして実行することでOSの起動時間を短縮する。一例では、OSの起動が完了したあとに各アプリケーションを異なるタイミングで自動起動する。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2010−211596号公報
【特許文献2】特開2010−217945号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
特許文献1および特許文献2の発明は、ブート時にOSと並行して自動起動していたアプリケーションの一部をブート完了後に起動するように起動タイミングを変更してブート時間の短縮を図っている。ブート・プログラムは、OSの仕組みとしてあるいはユーザがインストールしたプログラムのインストーラにより起動の順序が決定される。ある種のプログラムは、正常に動作するために他のプログラムを利用する必要があるため起動順序の制約を受ける場合がある。
【0007】
たとえば、アプリケーションから呼び出されて実行される他のアプリケーションやOSのある種のサービス・プログラムは、呼び出しているアプリケーションの実行前に起動している必要がある。このように実行順序に依存関係があるプログラムでは起動順序を自由に変更することはできない。したがって、特許文献1および特許文献2の方法では、あらかじめ依存関係のないプログラムであることを確認したり、依存関係を維持する工夫をしたりする必要があるためブート完了後に起動できるプログラムの範囲は制限を受ける。この制限は、専用のプログラムがブート時に他のプログラムの実行タイミングを制御しようとする際に常に生ずる。
【0008】
ブート・プログラムは本来の機能を果たす本体コードの他に本体コードを初期化する初期化コードを含んでいる。初期化コードは、当該プログラムが実行されたときに最初にだけ実行されてレジストリや他のデータ・ベースの情報を本体コードに設定する。レジストリは、本体コードが実行されている間に本来は削除されるべき不必要な情報が残留し次第に肥大化する傾向がある。初期化コードが肥大化したレジストリの情報に基づいて本体コードを設定すると、ディスク・ドライブやプロセッサなどのハードウエア・リソースを余分に消費するためブート時間が一層長くなる。
【0009】
レジストリの不要な情報を消去するためのツールとしてレジストリ・クリーナが知られている。レジストリ・クリーナは、リンク先がないショートカットの削除や一次キャッシュ・ファイルの削除などのように、対象となるプログラム以外のプログラムでも明らかに判断できる情報を、レジストリから削除することができる。レジストリ・クリーナが対象プログラムの事情を考慮しないで大胆にレジストリの情報を削除すると、当該プログラムの動作が不安定になってしまう。また、レジストリ・クリーナの実行はユーザの操作に委ねられているため、ブート時間の短縮と結びついて行われるとは限らない。
【0010】
そこで、本発明の目的は、短時間でブートできるコンピュータを提供することにある。さらに本発明の目的は、ハードウエアや専用のソフトウエアに依存しないでプログラムが自律的にブート時間を短縮することができるコンピュータを提供することにある。さらに本発明の目的は、安全かつ効果的にブート時間を短縮することができるコンピュータを提供することにある。さらに本発明の目的は、そのようなコンピュータを実現するコンピュータ・プログラムおよびそのようなコンピュータにおけるブート方法を提供することにある。
【課題を解決するための手段】
【0011】
本発明は、分割して実行できる初期化コードを含むプログラムを提供して、ブート時間の短縮を図る。プログラムが、ブート期間中に他のプログラムとの間の実行順序に依存関係を有する場合には、当該プログラムをブート期間中に起動する必要がある。本発明は、依存関係のあるプログラムであっても、ブート期間中には完全な起動をしないで部分的な起動をすることでブート時間の短縮を図りながら、他のプログラムの実行を妨げないようにして安全にブートを完了する。本発明では、ブート段階で実行しなければならないコードとブート後に実行すればよいコードを選別してコーディングしておくと、プログラムが自律的に動作してブート期間中に使用するリソースを低減することができるので、安全で確実にブート時間の短縮を図ることができる。
【0012】
本発明にかかるプログラムはOSがそれぞれ実行のタイミングを制御することができる第1の初期化コードと第2の初期化コードを含んで構成されている。第1の初期化コードと第2の初期化コードはメイン・メモリにロードされたメモリ・イメージにおいて独立したエントリ・ポイントを備えることができる。コンピュータのブート期間中にOSがまず第1の初期化コードを実行する。第1の初期化コードの実行が終了するとプログラムは部分的に起動が完了してアイドル状態に移行する。アイドル状態に移行しているプログラムは、他のプログラムから要求されたときに第1の初期化コードで初期化された本体コードを実行することができる。
【0013】
この手順によれば、分割された初期化コードを有するプログラムはブート期間中には第1の初期化コードだけが実行されるためブート中のリソースの占有時間が減少し、ブート時間の短縮を図ることができる。プログラムの起動イベントは、コンピュータの起動が完了したあとに生成することができる。この起動イベントは、プログラムのウインドウがバックグラウンドからフォアグラウンドに変化したとき、入力デバイスからの入力があったとき、またはシステムにより生成された定期的なイベントのいずれかのタイミングで生成することができる。起動イベントは、OSがブートの完了を検出したときに生成することもできる。
【0014】
第1の初期化コードはコンピュータのブートを完了するために必要な初期化だけを行うコードを含み、第2の初期化コードはプログラムの初期化を完全に終了するためのコードを含むようにすることでブート期間中のシステムの負担を軽減しながらブート完了後に当該プログラムを完全に起動することができる。第1の初期化コードはブート期間中に他のプログラムとの間で実行順序に関する依存関係がある本体コードを初期化することができる。最適化コードは、起動イベントに応じて、第2の初期化コードを実行する前にレジストリから不要な情報を削除することができる。最適化コードは、第2の初期化コードの実行前とは別にあるいは併用して定期的にまたはパワー・オフ直前のような所定のタイミングで実行してもよい。
【0015】
第1の初期化コードと第2の初期化コードを含むプログラムがブート・プログラムを登録する自動起動リストに登録されていないプログラムである場合には、コンピュータのブートが完了してから第1の初期化コードおよび第2の初期化コードを連続して実行することができる。第1の初期化コードと第2の初期化コードを含むプログラムは、オペレーティング・システムのモジュール、デバイス・ドライバ、またはアプリケーションのいずれであってもよい。
【発明の効果】
【0016】
本発明により、短時間でブートできるコンピュータを提供することができた。さらに本発明により、ハードウエアや専用のソフトウエアに依存しないでプログラムが自律的にブート時間を短縮することができるコンピュータを提供することができた。さらに本発明により、安全かつ効果的にブート時間を短縮することができるコンピュータを提供することができた。さらに本発明により、そのようなコンピュータを実現するコンピュータ・プログラムおよびそのようなコンピュータにおけるブート方法を提供することができた。
【図面の簡単な説明】
【0017】
【図1】本実施の形態にかかるコンピュータの主要なハードウエア構成を示す機能ブロック図である。
【図2】コンピュータに実装されるソフトウエアの構成を示す機能ブロック図である。
【図3】コンピュータで生成されたプロセスがOSで制御されて遷移する様子を示す図である。
【図4】分割型プログラムと非分割型プログラムのメモリ・イメージのデータ構造を説明する図である。
【図5】コンピュータにおいて分割型アプリケーションを実行する手順を説明するフローチャートである。
【図6】分割型アプリケーションおよび非分割型アプリケーションを構成するコードの実行の順番を説明する図である。
【発明を実施するための形態】
【0018】
[コンピュータ・システムの構成]
図1は、本実施の形態にかかるコンピュータ10の主要なハードウエア構成を示す機能ブロック図である。コンピュータ10は、それぞれバス23に接続されたCPU11、メイン・メモリ13、入力デバイス15、ハード・ディスク・ドライブ(HDD)17、液晶表示装置(LCD)19、およびBIOS_ROM21などを含んでいる。入力デバイス15は、マウスおよびキーボードとすることができる。LCD19には、アプリケーションのウインドウを表示する。HDD17は、ブート・プログラムおよび非ブート・プログラムを格納する。これらのハードウエア・デバイスの機能は、本実施の形態に関しては周知であり、本発明はハードウエアに依存しないで実行することができるため説明は省略する。
【0019】
[定義]
最初に本明細書において使用する用語を定義する。ブート・プログラムとは、コンピュータの電源が起動されたときに自動的にメイン・メモリ13にロードされて実行されるモジュール、コードまたはファイルなどといわれる実行可能なプログラムまたはDLLファイルをいう。プログラムのロードとは、ディスク・ドライブから読み出されたオブジェクト・コードに対してリンカが他のオブジェクト・コードやライブラリを結合して生成したメモリ・イメージをメイン・メモリに記憶することをいう。プログラムのロードには、当該プログラムの実行という処理を含まない。プログラムの実行状態とは、プリエンプティブなマルチタスキングを行うOSにおいて、当該プログラムを実行するためのプロセスがOSのタスク・スケジューラの制御により実行状態と実行可能状態の間を遷移している状態をいう。
【0020】
プログラムのアイドル状態とは、当該プログラムを実行するためのプロセスが特定のAPI関数が呼び出されることで実行状態から外れてサスペンド状態または実行待ち状態に遷移している状態をいう。OSはサスペンド状態または実行待ち状態のプロセスに、CPU11のタイム・スライスを割り当てることはないが、キーボードやマウスなどからの入力によるイベントが生成したウインドウ・メッセージ、またはOSその他のプログラムが生成した当該プロセスを呼び出すための特定のAPI関数を呼び出すときのプロセス間通信を監視して当該プロセスをレジュームし実行状態に遷移させることができる。
【0021】
プログラムの未実行状態とは、当該プログラムをロードするためのプロセスが未だ生成されていない状態または当該プログラムはロードされているがそれを実行するためのプロセスが未だ生成されていない状態をいう。特別なプログラムを除いて未実行状態のプログラムは、他のプログラムから呼び出されて起動することはできないが、アイドル状態のプログラムは他のプロセスから呼び出されて実行することができる。
【0022】
プログラムの起動完了とは、プログラムの初期化がすべて終了して本来の機能を実現する本体コードが実行される直前の状態またはすべての初期化が終了した状態で当該プログラムがアイドル状態に移行している状態をいう。プログラムがユーザ・インターフェースとなるウインドウを有する場合は、ウインドウが表示されたタイミングをプログラムの起動完了ということができる。
【0023】
さらに本実施の形態におけるプログラムの起動完了には、プログラムの初期化コードの一部が実行されて部分的に初期化が終了し本来の機能の中で初期化が終了した部分の本体コードが実行されているかまたは一部の初期化が終了した状態で当該プログラムがアイドル状態に移行している状態も含む。このように完全な起動は完了していないが一部の本体コードの初期化が完了している状態を部分的な起動完了ということにする。プログラムの依存関係とは、他のプログラムの実行のために呼び出されたときに、サービスを提供するために当該他のプログラムより先に起動を完了しておく必要があるプログラムと当該他のプログラムの間に起動の順序関係がある状態をいう。
【0024】
ブートの完了とは、コンピュータ全体のCPU使用率が所定時間の間所定値以下に維持されている状態をいう。コンピュータ全体のCPU使用率Yは、アイドル・プロセスのユーザ・モード時間をUi、アイドル・プロセスのカーネル・モード時間をKi、経過時間をEtとしたときに次の式でOSの所定のプログラムが計算することができる。
Y=(1−(Ui+Ki)/Et)×100%
【0025】
なお、ブートの完了はコンピュータの起動完了と同義である。上記の定義に基づくと、すべてのブート・プログラムの起動が完了すればコンピュータのブートは完了する。ただし、個々のブート・プログラムの起動完了のタイミングとコンピュータのブートが完了するタイミングは一致せず、ブートが完了する前に一部のブート・プログラムは起動を完了する。
【0026】
[ソフトウエアの構成]
図2は、コンピュータ10に実装されるソフトウエアの構成を示す機能ブロック図である。本実施の形態にかかるソフトウエアは、分割型アプリケーション101、102、非分割型アプリケーション103、OS107、最適化制御プログラム117およびデバイス・ドライバ119で構成されている。分割型アプリケーション101、102、非分割型アプリケーション103は、OS107のサービスを利用しながら実行されるプログラムである。図2に示したソフトウエアはHDD17に格納されており、ブート時にメイン・メモリ13にロードされてCPU11で実行されることによりコンピュータ10において所定の機能が実現される。
【0027】
OS107は、レジストリ109、自動起動リスト111、API(Application Programming Interface)113、およびカーネル・モジュール115を含んで構成されている。OS107は、モジュールが図4に示す分割型プログラム150でない場合は、Windows(登録商標)やMAC(登録商標)などの既存のOSを採用することができる。ただし、分割型プログラム150のデータ構造は、OS107のモジュールにも適用することができるので、その場合は既存のOSに対してその部分に限り変更が必要となる。
【0028】
レジストリ109は、コンピュータ10のハードウエアの設定情報、ソフトウエアの設定情報、セキュリティ情報およびユーザ情報などを記憶するOS107の内部データ・ベースである。ソフトウエアの設定情報には、OS107の設定情報、ユーザが導入したアプリケーションの設定情報および周辺機器に付随して導入したデバイス・ドライバの設定情報が含まれる。自動起動リスト111は、ブート・プログラムの名称およびロードの順番に関する情報を格納する。自動起動リスト111は、ブート・プログラムを登録できるようにユーザに公開するリストと、システムだけが登録できてユーザに非公開のリストのいずれも含んでいる。
【0029】
API113は、分割型アプリケーション101、102および非分割型アプリケーション103がカーネル・モジュール115のサービスを利用するためのインターフェースである。カーネル・モジュール115は、仮想メモリ、デバイス・ドライバ、プロセス管理およびファイル・システムなどのOS107の基本的な機能を提供する複数のモジュールで構成されている。最適化制御プログラム117は、分割型アプリケーション101、102の最適化コード157(図4参照)を定期的に実行する最適化イベントをOS107に送る。デバイス・ドライバ119は、HDD17に対するハードウエア・インターフェースを設定したり、HDD17とOS107との間のデータ転送を制御したりする専用のプログラムである。
【0030】
[プロセス遷移]
図3は、コンピュータ10で生成されたプロセスがOS107で制御されて遷移する様子を示す図である。プロセスはプロセス制御ブロック(PCB)というプロセッサ状態、プロセスの優先度、タイム・スライス情報、プロセスID、およびデバイス情報などを含むデータ構造体である。実行状態(RUN)は、現在プロセスがCPU11で実行されている状態であり、割り当てられたタイム・スライスを消費すると実行可能状態(READY)に移行する。
【0031】
実行可能状態(READY)は、プロセスが実行可能であり優先度の順番に実行されるのを待っている状態で、実行可能キューに登録されたPCBがOS107のプロセス・スケジューラにより所定の順番でCPU11にディスパッチされる。実行待ち状態(WAIT)は、I/Oなどの何らかの条件が成立するまで自ら実行を中断する関数を呼んで実行を待っている状態である。サスペンド状態(SUSPEND)は、他のプロセスによって強制的に待ち状態にさせられた状態である。
【0032】
あるプロセスが他のプロセスを実行状態または実行可能状態からサスペンド状態に移行させたり、サスペンド状態からレジュームして実行可能状態に移行させたりするには、特定のAPI関数を呼び出して行うことができる。このとき、OSがプロセスを直接サスペンドまたはレジュームをするためのAPI関数を提供していない場合は、当該プロセスにより生成されたすべてのスレッドをサスペンドまたはレジュームの対象にしたAPI関数を呼び出すことでサスペンド/レジューム実現することができる。
【0033】
[分割型プログラムと非分割型プログラムの構成]
図4は、分割型プログラムと非分割型プログラムがメイン・メモリに記憶されたときのメモリ・イメージのデータ構造を説明する図である。分割型プログラム150は、分割型アプリケーション101、102のデータ構造に一致し、非分割型プログラム170は非分割型アプリケーション103のデータ構造に一致する。図4は、ブート時にOS107のリンカにより他のオブジェクト・ファイルやライブラリが結合されて、メイン・メモリ13の仮想アドレス空間に展開されたメモリ・イメージを示している。リンカが、HDD17に格納されたオブジェクト・コードの指示にしたがって生成したメモリ・イメージを、OS107のローダに渡すことでメイン・メモリ13に図4のメモリ・イメージが記憶される。
【0034】
分割型プログラム150のメモリ・イメージは、セクション・テーブル151、第1の初期化コード153、第1の本体コード155、最適化コード157、第2の初期化コード159、および第2の本体コード161で構成されている。非分割型プログラム171のメモリ・イメージは、セクション・テーブル171、初期化コード173、および本体コード175で構成されている。
【0035】
分割型プログラム150では、初期化コードがそれぞれ個別のエントリ・ポイント1、3を有する第1の初期化コート153と第2の初期化コード159に分割されているが、非分割型プログラム170では初期化コード173に対するエントリ・ポイントは1個であり、初期化コードは分割されていない点が相違している。非分割型プログラム170のデータ構造は周知である。分割型プログラム150のセクション・テーブル151は、コードおよびデータを記憶するセクションの仮想アドレスを記憶したエントリ・ポイント1、2、3を含む。
【0036】
エントリ・ポイント1は、第1の初期化コード153の先頭の仮想アドレスを指し、エントリ・ポイント2は最適化コード157の先頭アドレスを指し、エントリ・ポイント3は第2の初期化コード159の先頭アドレスを指す。非分割型プログラム170のセクション・テーブル171は、エントリ・ポイント1を含む。エントリ・ポイント1は初期化コード173の先頭アドレスを指す。
【0037】
OS107は、セクション・テーブル151、171のエントリ・ポイントのいずれかを指定して所定のコードだけを実行することができる。したがって、第1の初期化コード153、最適化コード157、および第2の初期化コード159のメイン・メモリ13上での配置は図4(A)に限定されない。また、第1の本体コード155と第2の本体コード161はブロックが分離している必要はなく、両者のコードがひとつのブロックのなかで混在していてもよい。
【0038】
分割型プログラム150の第1の本体コード155と第2の本体コード159を含めた機能と非分割型プログラム170の本体コード175の機能は同一である。第1の初期化コード153はレジストリ109またはその他のデータ・ベースを参照して第1の本体コード155を初期化して実行させる。第2の初期化コード159はレジストリ109またはその他のデータ・ベースを参照して第2の本体コード161を初期化して実行させる。初期化コード173はレジストリ109またはその他のデータ・ベースを参照して本体コード175を初期化して実行させる。
【0039】
第1の本体コード155と第2の本体コード161は、プログラムが目的とする機能を実現するためのコードである。第1の本体コード155と第2の本体コード161は初期化されたときに実行するためのプロセスを生成し、さらにさまざまな機能を実行するスレッドを生成する。実行プロセスは、プログラムがアイドル状態のときにはサスペンド状態または実行待ち状態に遷移する。OS107のスケジューラは、他のプログラムが呼び出すイベントを検出したときにサスペンド状態または実行待ち状態の実行プロセスを実行状態に遷移させる。
【0040】
分割型プログラム150は、初期化コードに対する複数のエントリ・ポイントを備えることにより、ブート期間中に他のプログラムとの間に依存関係がある場合に適用するとブート時間の短縮に効果的なデータ構造を備えている。第1の初期化コード153はブート期間中に実行されて第1の本体コード155を初期化する。ブート時間を短縮するためには、第1の初期化コード153および第1の本体コード155は、ブートを完了するためにブート期間中に必ず実行しなければならないコードだけで構成されていることが望ましい。
【0041】
また、第1の初期化コード153は、第1の本体コード155を簡素に初期化しておき、第1の本体コード155の完全な初期化と第2の本体コード161の初期化を含めた最終的な初期化を第2の初期化コード159に委ねることができる。この場合、第2の初期化コード159は、第1の本体コード155のなかで第1の初期化コード153により初期化されなかった部分を初期化することができる。第2の本体コード161は、分割型プログラム150が所定の機能を実現するためにブートが完了してから初期化してもよいコードで構成することができる。
【0042】
OS107は分割型プログラム150の第1の本体コード155を第2の本体コード161から分割して初期化できるが、非分割型プログラム170では本体コード175を分割して初期化することはできない。第1の初期化コード153および第2の初期化コード159はロードされてからアンロードされるまでの間に一度だけ実行されればよいプログラムであり、実行後にメイン・メモリ13から消去することができる。
【0043】
第1の本体コード155は、他のプログラムとの間に依存関係がある処理だけを行うコードだけで構成されていることが望ましい。依存関係を確保するために、第1の初期化コード153は、第1の本体コード155が他のプログラムに公開するインターフェースを備えている場合はそれを初期化する。また、第1の本体コード155は、ブート期間中に後続のプログラムをロードするためのプロセスを生成するコードを含む。ブート期間中に第1の初期化コード153が実行されて多くのリソースを消費すると、コンピュータ10のブート時間が遅延するので、第1の初期化コード153は実行時にできるだけ少ないリソースを消費するように作成することが望ましい。
【0044】
第1の初期化コード153が本体コード155を初期化するために、コンピュータ10に実装される唯一のハードウエア資源であるHDD17にアクセスする必要がある場合は、第1の初期化コード153はそのHDD17に対するアクセスを最低限に抑えるようにして初期化することが望ましい。たとえば、第1の初期化コード153は、第1の本体コード155を設定するために、HDD17から多量のファイルを読み出す必要がある場合は、依存関係があるプログラムの実行に支障がでない範囲で設定するための最低限のファイルだけを読み出すように設定することが望ましい。
【0045】
分割型プログラム150がデバイス・ドライバの場合は、第1の本体コード155はブート期間中に自らまたは他のプログラムが使用する最低限のハードウエアを設定するコードとすることができる。OS107が提供するサービスは、通常多くのアプリケーションから呼び出される。したがって、分割型プログラム150がアプリケーションの場合は、第1の初期化コード153はポートの設定のようなOS107が提供するサービスを設定するコードとすることができる。
【0046】
ユーザが分割型プログラム150を使用している間に設定したレジストリ109の情報は、一般に当該分割型プログラム150だけが使用するもので、他のプログラムの実行に必要とされることはほとんどない。したがって、第1の初期化コード153は、そのようなレジストリ109の情報を利用しない範囲で第1の本体コード155を設定することができる。この場合、第1の初期化コード153が初期化しなかった第1の本体コード155の部分は、ブートが完了したあとに第2の初期化コード159が初期化することができる。
【0047】
分割型プログラム150が、LCD19にユーザ・インターフェースとなるアプリケーション・ウインドウ(以後、単にウインドウという。)を表示するタイプの場合は、第1の初期化コード153は、第1の本体コード155がウインドウを表示できる程度まで初期化してウインドウを通じて完全な起動をするための起動イベントを受け取ることができるようにすることができる。第1の本体コード155は、第2の初期化コード159を実行するプロセスを生成して、当該プロセスをサスペンド状態に遷移させておき、ロード期間中に他のプログラムから呼び出されたときに当該プロセスを実行状態に遷移させることもできる。第1の初期化コード153の実行が完了すると第1の本体コード155は実行プロセスを生成して分割型プログラム150は部分的に起動が完了する。
【0048】
第2の本体コード161は、他のプログラムとの間に依存関係のないすべての処理を行うコードで構成することができる。第2の初期化コード159が実行されると第2の本体コード161は実行プロセスを生成し、分割型プログラム150は完全に起動する。分割型プログラム150が対話型の場合は、完全に起動するとアイドル状態に移行する。この時点では、第1の本体コード155を実行するプロセスも実行待ち状態またはサスペンド状態に遷移している。分割型プログラム150がデバイス・ドライバの場合は、第2の本体コード161はブート完了後に動作するプログラムが使用するハードウエアを設定するコードとすることができる。
【0049】
分割型プログラム150がアプリケーションの場合は、第2の初期化コード159は、第2の本体コード161に対して当該分割型プログラム150が保有するユーザ・データを使用した設定をするコードまたはユーザが分割型プログラム150を使用している間に設定したレジストリ109の情報を利用して設定するコードとすることができる。
【0050】
分割型プログラム150は、従来の初期化コード173の途中に単にエントリ・ポイントを設けて作成したものではない。分割型プログラム150の作成者は初期化コード173のなかでブート期間中に実行しなければならないコードを第1の初期化コード153としてコーディングし、ブート完了後に実行してもよいコードを第2の初期化コード159としてコーディングすることになる。
【0051】
当該プログラムの特質を最もよく知っているプログラム作成者は、従来の本体コード175の初期化を第1の初期化コード153で行うか第2の初期化コード159で行うかを適切に判断することができる。従来の本体コード175の初期化の実行タイミングを他のプログラムで制御しようとしても個別のエントリ・ポイントがないので実現できない。
【0052】
それに加えて、ブート時の作業や依存関係に基づいて第1の初期化コード153と第2の初期化コード159をコーディングしなければ、依存関係のあるプログラムに本実施の形態のような初期化コードの分割手法を適用することはできない。初期化コードの分割手法を採用すれば、OS107がこれまでと同じタイミングでエントリ・ポイント1を指定すると、ブート期間中は第1の初期化コードが第1の本体コード155を初期化して部分的に起動を完了し、ブート期間中の他のプログラムからの呼び出しに対するサービスを提供することができる。
【0053】
そして、ブート完了後に第2の本体コード161を利用するための起動イベントが生成されたときに、第2の初期化コードが第1の本体コードの最終的な初期化と第2の本体コードの初期化を行うことができる。このような意味で初期化コードの分割手法は、それぞれのブート・プログラムが自律的にブート時間の短縮を図る手法であるといえる。
【0054】
第1の初期化コードが実行される際に使用するレジストリ109の情報は、コンピュータ10の動作にとって基本的なものであるため、一般的に削除することは難しい。そこで最適化コード157は、第2の初期化コード159が実行される際に使用するレジストリ109の情報および分割型プログラム150が保有する、設定のためのユーザ・データをクリーン・アップする。最適化コード157は、たとえば、分割型プログラム150がWebブラウザの場合は、レジストリ109またはWebブラウザ自体が保持するインターネット・キャッシュ、閲覧履歴、またはリンク先のないショートカットなどの不要な情報を削除する。
【0055】
最適化コード157は、分割型プログラム150の作成者が、あらかじめ当該プログラムにとって不要な情報を削除する判断の基準を設定することができるので、レジストリ・クリーナのような他のプログラムが設定した一律の基準で削除するよりもより多くの不要な情報を削除することができる。また、ユーザは最適化コード157を設定して当該アプリケーションにとって最も適切なタイミング、削除する情報の時間的な範囲および内容的な範囲を設定することができる。
【0056】
たとえば、レジストリ・クリーナでは、Webブラウザの1ヶ月前の閲覧履歴までは削除するかもしれないが、最適化コード157は当該分割型プログラム150にとってすべての閲覧履歴を所定の時期に削除することができる。初期化のためにHDD17から読み出す必要がある分割型プログラム150が保持しているユーザ・データの量が少なくなると、ブート時にHDD17を占有する時間および当該ユーザ・データをロードして実行するためにCPU11が提供するタイム・スライスが減少するためにブート時間の短縮を図ることができる。
【0057】
[非分割型アプリケーションの実行手順]
ここで、分割型アプリケーション101、102と対比するために非分割型アプリケーション103のロードおよび実行手順について説明する。OS107は、非分割型アプリケーション103をロードする際に、セクション・テーブル171にイメージ・ベースとRVAで構成されるエントリ・ポイント1を設定し、設定したエントリ・ポイント1に対応する仮想アドレスのセクションにそれぞれ初期化コード173および本体コード175を記憶する。ここに、イメージ・ベースとは、プログラムを仮想アドレス空間にロードする場合の基準となるアドレスに相当する。
【0058】
ロードされたメモリ・イメージのデータ構造は、たとえばBorland C++ Compilerに付属するtdump.exeを使うことで表示および確認することができる。OS107は、非分割型アプリケーション103を所定のセクションにロードしたあとに、エントリ・ポイント1から実行する。非分割型アプリケーション103の初期化コード173は、本体コード175を初期化する。初期化された本体コード175は、実行するためのプロセスを生成して非分割型アプリケーション103の起動は完了する。
【0059】
非分割型アプリケーション103が、イベント・ドリブン・タイプのプログラムである場合は、起動が完了すると本体コード175を実行するプロセスは一旦サスペンド状態または実行待ち状態に遷移する。そして、非分割型アプリケーション103は入力デバイス15によるユーザからの実行イベントやシステムからの実行イベントを待つ。実行イベントを受け取ったOS107はプロセスをレジュームさせて実行可能状態に遷移させる。非分割型アプリケーション103が、実行イベントを必要としないでロード直後から自動的に実行されるプログラムである場合は、アイドル状態に移行しないで本体コード175は初期化コード173に連続して実行される。
【0060】
[分割型アプリケーションの実行手順]
図5は、コンピュータ10において分割型アプリケーション101、102を実行する手順を説明するフローチャートである。分割型アプリケーション101はブート・プログラムとして自動起動リスト111に登録されており、分割型アプリケーション102は登録されていないものとする。ブロック201では、コンピュータ10に電源が投入されBIOS_ROM21のPOSTが実行される。その後、HDD17に格納されたMBRおよびブート・セクタのコードに制御が移る。
【0061】
ここでの起動ルーチンは、パワー・オフ状態から起動するコールド・ブートまたはPOSTのすべてまたは一部が省略されるウォーム・ブートのいずれであってもよい。ただし、ハイバネーション状態で直前のメモリ・イメージをHDD17からメイン・メモリ13に復帰させるレジュームは除く。ブロック203ではOS107のブート・システム・コードが最初に実行されて初期の段階でレジストリ109および自動起動リスト111がロードされる。
【0062】
さらに、カーネル・モジュール115のブートを処理するコードが所定の順番でロードされる。初期の段階でロードされるOS107のモジュールの多くは、ブートを完了するために、ブート期間中に他のプログラムに完全なサービスを提供する必要があるので、分割型プログラム150で構成する必要はない。ブートを開始したOS107はブロック205で、各ブート・プログラムが自動起動リスト111に登録されているか否かを判断する。自動起動リスト111に登録された分割型アプリケーション101の処理はブロック207に移行し、登録されていない分割型アプリケーション102の処理はブロック231に移行して行われる。
【0063】
ブロック207で自動起動リスト111に登録されている分割型アプリケーション101は順番にHDD17から読み出されて実行される。ロードされて実行された分割型アプリケーション101は、後続のブート・プログラムをロードするプロセスを生成する。つづいて、後続のブート・プログラムがさらに後続のブート・プログラムをロードするプロセスを生成する。OS107は、分割型アプリケーション101のメモリ・イメージをセクション単位でメイン・メモリ13に対応する仮想メモリのアドレス空間にロードする。
【0064】
HDD17に格納された分割型アプリケーション101のオブジェクト・コードは図4に示したメモリ・イメージで形成されるようにコーディングされている。OS107のリンカは、オブジェクト・コードの指示にしたがって、他のコードやライブラリィを結合して分割型アプリケーション101のメモリ・イメージを生成し、ローダがそれをメイン・メモリ13に記憶する。
【0065】
OS107は、分割型アプリケーション101をロードする際に、セクション・テーブル151にイメージ・ベースと相対仮想アドレス(RVA)で構成されるエントリ・ポイント1、2、3を設定する。OS107は、設定したエントリ・ポイント1、2、3に対応する仮想アドレスのセクションにそれぞれ第1の初期化コード153と第1の本体コード155、最適化コード157、および第2の初期化コード159と第2の本体コード161を記憶する。
【0066】
ブロック209では、OS107は、メモリ・イメージのロードが完了するとエントリ・ポイント1を指定して第1の初期化コード153を実行する。ロードが完了すると、第1の初期化コード153はOS107の指示により自動的に実行を開始して第1の本体コード155を初期化する。初期化された第1の本体コード155は実行プロセスを生成する。OS107は実行プロセスをサスペンド状態または実行待ち状態に遷移させる。分割型アプリケーション101が、ユーザ・インターフェースとなるウインドウを表示するタイプの場合は、この時点でウインドウを表示して第2の初期化コードを実行する起動イベントを受け取るようにしてもよい。第1の本体コード155は、第2の初期化コード159を実行するプロセスを生成して、ブート期間中に他のプログラムから呼び出されたときに実行できるようにしておいてもよい。ブロック211で分割型アプリケーション101は第1の初期化コード153の実行が完了した時点で部分的な起動が完了しアイドル状態に移行する。
【0067】
アイドル状態に移行した分割型アプリケーション101では、第1の本体コード155を実行するプロセスがサスペンド状態または実行待ち状態に遷移している。他のプログラムがアイドル状態の分割型アプリケーション101を呼び出すと、OS107は当該プロセスを実行状態に遷移させる。したがって、分割型アプリケーション101は第1の初期化コード153の実行が完了した時点で、他のプログラムに対してロード期間中に提供しなければならないサービスを開始する。
【0068】
他の分割型プログラム150が同じような手順でロードされて第1の初期化コード153まで実行される。非分割型アプリケーション103では、ロードされると初期化コード173と本体コード175が実行されていたが、分割型アプリケーション101は第1の初期化コード153の実行により部分的な起動が完了するだけであるために、消費するCPU11やHDD17のリソースが少なくブート時間の短縮を図ることができる。
【0069】
ブロック213ではすべてのブート・プログラムの起動が部分的に完了してCPU使用率が低下するためコンピュータ10のブートが完了する。ブロック215ではOS107が、部分的に起動が完了した分割型アプリケーション101を最終的に起動する起動イベントを監視する。ただし、ブートが完了するタイミングと個別のプログラムが部分的に起動を完了するタイミングは一致しないので、ブロック215の手順はブートの完了前に発生してもよい。
【0070】
起動イベントは、部分的に起動が完了してアイドル状態に移行している分割型アプリケーション101の第2の初期化コード159を実行して完全に起動させるイベントである。起動イベントは、当該分割型アプリケーション101がブロック209でユーザからの入力指示を受け取るウインドウを表示している場合には、当該ウインドウがバックグラウンドからフォアグラウンドに変化した状態を示すイベントや入力デバイス15からの入力イベントとすることができる。さらに起動イベントとして、OS107による、所定のタイミングでの起動イベントやコンピュータ10のブート完了のタイミングでの起動イベントとすることができる。後者の起動イベントは、分割型アプリケーション101がユーザからの入力を待たないで実行される場合にも利用することができる。
【0071】
ブロック217では、起動イベントを受け取ったOS107がエントリ・ポイント2を指定して最適化コード157を実行する。最適化コード157は、レジストリ109および分割型アプリケーション101が保有する設定データから不要な情報を削除してクリーン・アップする。なお、最適化コード157は必ずしも第2の初期化コード159を実行する前に実行する必要はないが、この段階で実行しておくことで、第2の初期化コード159が実行するときに使用するリソースを確実に減少させることができる。最適化コード157をブート期間中に実行しない場合は、エントリ・ポイント2を設けないで、最適化コード157を第2の本体コード161の中に組み込むことができる。
【0072】
最適化コード157はブロック219で最後にエントリ・ポイント3を指定して第2の初期化コード159を実行する。第2の初期化コード159はクリーン・アップされたレジスタ109を参照して第2の本体コード161の初期化と第1の本体コード155に対して必要な初期化を行う。OS107は、初期化された第2の本体コード161が生成した実行のためのプロセスをサスペンド状態または実行待ち状態に遷移させる。OS107は、追加的に初期化された第1の本体コード155により生成された実行のためのプロセスもサスペンド状態または実行待ち状態に遷移させる。
【0073】
この状態で、分割型アプリケーション101は完全に起動が完了して通常の実行状態に移行する。LCD19にウインドウを表示してユーザからの入力を受け付けるタイプのアプリケーションでは、この段階でウインドウを表示することができる。OS107は分割型アプリケーション101が他のプログラムから呼び出されたときにサスペンド状態または実行待ち状態のプロセスを実行状態に遷移させる。第2の本体コード161は、実行される際に、エントリ・ポイント2を指定した最適化コード157を実行するためのプロセスを生成することができる。ブロック251では、OS107は最適化制御プログラム117が最適化イベントを生成したか否かを監視する。
【0074】
OS107は最適化イベントを受け取ると特定のグループの分割型アプリケーション101またはすべての分割型アプリケーション101に対して当該最適化イベントを通知する。最適化イベントを受け取った分割型アプリケーション101の最適化コード157は、レジストリ109および設定に関するユーザ・データから所定の情報を削除する。最適化コード157は、ブロック217およびブロック253またはいずれか一方で実行することができる。最適化制御プログラム117は、コンピュータ10のブートが完了したあとの定期的なタイミングまたはパワー・オフのタイミングで最適化イベントを生成することができる。
【0075】
自動起動リスト111に登録されていない分割型アプリケーション102は、ブート期間中に実行されることはなく、ブート完了後に発生した起動イベントでロードされて実行される。分割型プアプリケーション102を自動起動リスト111に登録しないでもブートが完了できるということは、分割型プアプリケーション102は依存関係がないことが前提になるので本来的に非分割型プログラム170として構成してもよいものである。
【0076】
しかし分割型アプリケーション102は、依存関係がない場合はブート完了後に起動し、将来的に依存関係が発生した場合には、ブート・プログラムとすることができる。ブロック231ではコンピュータ10のブートが完了する。ブロック233ではOS107が、分割型アプリケーション102に対する起動イベントを監視する。分割型アプリケーション102はこの時点では未実行状態なので、分割型アプリケーション102を完全に起動させるためには、起動イベントが必要となる。起動イベントは、入力デバイス15によりOS107のファイル・システムに対してアクセスすることで生成することができる。
【0077】
ブロック235ではこの時点で分割型アプリケーション102がロードされていない場合は、OS107は起動イベントに基づいて、HDD17から分割型アプリケーション102を読み出すためのプロセスを生成する。起動イベントを検出したOS107は分割型アプリケーション102をメイン・メモリ13にロードする。OS107は、メモリ・イメージのロードが完了するとエントリ・ポイント1を指定して第1の初期化コード153を実行する。
【0078】
すでに分割型アプリケーション102がロードされている場合は、OS107は起動イベントに基づいてエントリ・ポイント1から第1の初期化コード153を実行するようにしてもよい。第1の初期化コード153は第1の本体コード155の初期化を行い、第1の本体コード155が実行プロセスを生成するとそれをOS107に通知する。つづいてOS107はブロック237でエントリ・ポイント2を指定して最適化コード155を実行する。最適化コード155は実行が完了するとエントリ・ポイント3を指定してブロック239で第2の初期化コード159を実行する。このようにOS107は、自動起動リスト111に登録されていない分割型アプリケーション102の第1の初期化コード153、最適化コード157、および第2の初期化コード159をブート完了後にアイドル状態を挟まないで連続して実行する。
【0079】
図5の手順では、分割型アプリケーション101、102の実行手順を説明したが、本発明においてOS107はブート期間中に分割型プログラム101、102と並行して非分割型アプリケーション103もロードして実行することができる。分割型プログラム150のデータ構造は、ブートが完了するまでにすべての本体コードを初期化する必要のないアプリケーションおよびOSのサービス・プログラムに適用することができる。
【0080】
また、デバイス・ドライバが、他のプログラムを動作させるためにブート期間中にレジスタを初期化しなければならないコードと、ブートが完了したあとで使用されることが明らかなレジスタを初期化するコードに分かれているような場合は、デバイス・ドライバも分割型プログラム150のように構成することでブート時間の短縮を図ることができる。ブートが完了したあとにオンデマンドで実行することができるタイプのプログラムは、分割型プログラム150から除くことができる。
【0081】
[ブログラムの実行順序]
図6は、図5の手順で行われた分割型アプリケーション101、102および非分割型アプリケーション103を構成するコードの実行の順番を説明する図である。図6(A)は、分割型アプリケーション101を示し、図6(B)は分割型アプリケーション102を示し、図6(C)は自動起動リスト111に登録された非分割型プログラム170を示している。分割型アプリケーション101では、ブート期間中に第1の初期化コード153だけが実行されるので、リソースの消費が少なくOS107および他のブート・プログラムと並行して起動されてもブート時間の遅延に対する影響は少ない。
【0082】
分割型アプリケーション102は、ブート・プログラムでないためブート時間の遅延にはまったく影響を与えない。なお、実行しなければブート時間の遅延に与える影響は少ないので分割型アプリケーション102のロードだけは、ブート期間中に行うこともできる。非分割型プログラム170は、ブートが完了する前に初期化コードの全体が実行されるため、リソースの消費量が多くブート時間の遅延に大きな影響を与える。
【0083】
これまで本発明について図面に示した特定の実施の形態をもって説明してきたが、本発明は図面に示した実施の形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができることはいうまでもないことである。
【符号の説明】
【0084】
10…コンピュータ
150…分割型プログラムのメモリ・イメージのデータ構造
170…非分割型プログラムのメモリ・イメージのデータ構造

【特許請求の範囲】
【請求項1】
コンピュータをブートする方法であって、
メイン・メモリに第1の初期化コードと第2の初期化コードを含むプログラムのメモリ・イメージを記憶するステップと、
ブート期間中に前記第1の初期化コードを実行するステップと、
前記第1の初期化コードの実行が終了したことに応答して前記プログラムをアイドル状態に移行させるステップと、
起動イベントに応答して前記第2の初期化コードを実行するステップと
を有する方法。
【請求項2】
前記起動イベントが前記コンピュータのブートが完了したあとに生成される請求項1に記載の方法。
【請求項3】
前記第1の初期化コードは前記コンピュータのブートを完了するために必要な初期化だけを行うコードを含み、前記第2の初期化コードは前記プログラムの初期化を完全に終了するためのコードを含む請求項1または請求項2に記載の方法。
【請求項4】
前記第1の初期化コードはブート期間中に他のプログラムとの間で実行順序に依存関係がある本体コードを初期化する請求項1から請求項3のいずれかに記載の方法。
【請求項5】
前記第1の初期化コードおよび前記第2の初期化コードのメモリ・イメージは、それぞれ異なるエントリ・ポイントを備えている請求項1から請求項4のいずれかに記載の方法。
【請求項6】
前記起動イベントに応答して前記プログラムのレジストリから所定の情報を削除する最適化コードを前記第2の初期化コードを実行する前に実行するステップを有する請求項1から請求項5のいずれかに記載の方法。
【請求項7】
前記第2の初期化コードの実行が完了したあとに定期的にまたは所定のタイミングで前記プログラムのレジストリから所定の情報を削除する最適化コードを実行するステップを有する請求項1から請求項6のいずれかに記載の方法。
【請求項8】
前記第1の初期化コードの実行が完了したときに前記プログラムがユーザ・インターフェースとなるウインドウをディスプレイに表示するステップを有する請求項1から請求項7のいずれかに記載の方法。
【請求項9】
前記起動イベントが前記プログラムのウインドウがバックグラウンドからフォアグラウンドに変化したとき、入力デバイスからの入力があったとき、またはシステムにより生成された定期的なイベントのいずれかのタイミングで生成される請求項1から請求項8のいずれかに記載の方法。
【請求項10】
前記プログラムがプログラムを登録する自動起動リストに登録されているか否かを判断するステップと、
前記プログラムが前記自動起動リストに登録されていない場合に前記コンピュータのブートが完了してから前記第1の初期化コードおよび前記第2の初期化コードを連続して実行するステップと
を有する請求項1から請求項9のいずれかに記載の方法。
【請求項11】
ブートを開始したコンピュータに、
部分的に実行することが可能なブート・プログラムをロードするステップと、
ブート期間中に前記ブート・プログラムの起動を部分的に完了するステップと、
ブート終了後に前記ブート・プログラムの起動を完全に完了するステップと
を有する処理を実行させるプログラム。
【請求項12】
前記ブート・プログラムが第1の初期化コードと第2の初期化コードを含み、
前記部分的に完了するステップが、前記第1の初期化コードを実行するステップを含み、
前記完全に完了するステップが、前記第2の初期化コードを実行するステップを含む請求項11に記載のプログラム。
【請求項13】
ブートを開始したコンピュータにおいて自動的に起動されるブート・プログラムであって、前記コンピュータに、
オペレーティング・システムにそれぞれエントリ・ポイントを有する第1の初期化コードと第2の初期化コードのメモリ・イメージをメイン・メモリに記憶させるステップと、
ブート期間中に前記第1の初期化コードを実行するステップと、
起動イベントに応答して前記第2の初期化コードを実行するステップと
を有する処理を実行させるブート・プログラム。
【請求項14】
前記メイン・メモリに記憶させるステップが、独立したエントリ・ポイントを備え、レジストリから所定の情報を削除する最適化コードのメモリ・イメージを記憶させるステップを含む請求項13に記載のブート・プログラム。
【請求項15】
前記最適化コードを前記第2の初期化コードを実行する前に前記起動イベントに応答して実行するステップを有する請求項14に記載のブート・プログラム。
【請求項16】
前記ブート・プログラムがオペレーティング・システムのモジュールを含む請求項13から請求項15のいずれかに記載のブート・プログラム。
【請求項17】
前記ブート・プログラムがアプリケーション・プログラムを含む請求項13から請求項16のいずれかに記載のブート・プログラム。
【請求項18】
請求項13から請求項17のいずれかに記載されたブート・プログラムを格納したディスク・ドライブを有するコンピュータ。
【請求項19】
ディスク・ドライブと、
前記ディスク・ドライブに格納され第1の初期化コードと第2の初期化コードを含んで構成されたブート・プログラムと、
前記ブート・プログラムのメモリ・イメージを記憶するメイン・メモリと、
ブート期間中に前記第1の初期化コードを実行して前記ブート・プログラムをアイドル状態に移行させ、起動イベントが発生したときに前記第2の初期化コードを実行する機能を前記コンピュータに実現させるオペレーティング・システムと
を有するコンピュータ。
【請求項20】
前記ブート・プログラムがレジストリから所定の情報を削除する最適化コードを含み、前記オペレーティング・システムは前記第2の初期化コードを実行する機能を実現させる前に前記最適化コードを実行させる機能を前記コンピュータに実現させる請求項19に記載のコンピュータ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2012−98972(P2012−98972A)
【公開日】平成24年5月24日(2012.5.24)
【国際特許分類】
【出願番号】特願2010−246971(P2010−246971)
【出願日】平成22年11月4日(2010.11.4)
【出願人】(505205731)レノボ・シンガポール・プライベート・リミテッド (292)
【復代理人】
【識別番号】100106699
【弁理士】
【氏名又は名称】渡部 弘道
【復代理人】
【識別番号】100077584
【弁理士】
【氏名又は名称】守谷 一雄
【Fターム(参考)】