(57)【要約】      （修正有）【課題】情報処理装置の起動時にプログラムが同時実行されることによる起動時間の遅延を抑制する情報処理装置を提供する。【解決手段】複数のＣＰＵ又はマルチコアのＣＰＵを搭載した情報処理装置において、各プログラムモジュールの起動条件が記述された起動条件情報と、第１のプログラムモジュールの前記起動条件情報に記述されている起動条件に基づき、第１のプログラムモジュールの起動に必要な１つ以上の第２のプログラムモジュールを特定する特定手段と、プログラムモジュールを実行しているＣＰＵ又はコアの数情報を記録する数情報記録手段と、前記数情報が閾値未満の場合に、起動条件が満たされている前記第２のプログラムモジュールを、前記数情報が閾値を超えない範囲で起動する起動手段と、を有する。【選択図】図２
2015041186.tif 000002
【特許請求の範囲】
【請求項１】
複数のＣＰＵ又はマルチコアのＣＰＵを搭載した情報処理装置において、
各プログラムモジュールの起動条件が記述された起動条件情報と、
第１のプログラムモジュールの前記起動条件情報に記述されている起動条件に基づき、第１のプログラムモジュールの起動に必要な１つ以上の第２のプログラムモジュールを特定する特定手段と、
プログラムモジュールを実行しているＣＰＵ又はコアの数情報を記録する数情報記録手段と、
前記数情報が閾値未満の場合に、起動条件が満たされている前記第２のプログラムモジュールを、前記数情報が前記閾値を超えない範囲で起動する起動手段と、
を有することを特徴とする情報処理装置。
【請求項２】
前記起動手段は、前記数情報が当該情報処理装置に搭載されたＣＰＵ又はコアの数よりも小さい値になった場合、起動条件が満たされている前記第２のプログラムモジュールを、前記数情報がＣＰＵ又はコアの数を超えない範囲で起動する、
ことを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記起動条件情報に前記第２のプログラムモジュールの起動条件として、他のプログラムモジュールが起動していることが記述されている場合、
前記特定手段は、前記他のプログラムモジュールを、前記第１のプログラムモジュールの起動に必要な前記第２のプログラムモジュールであると特定し、
前記起動手段は、前記第２のプログラムモジュールであると特定された前記他のプログラムモジュールの起動が完了した場合に、前記第２のプログラムモジュールを前記数情報が閾値を超えない範囲で起動する、
ことを特徴とする請求項１又は２記載の情報処理装置。
【請求項４】
前記起動条件情報には、周辺機器が起動することがプログラムモジュールの起動条件として記述されており、
周辺機器が起動したことを検出する周辺機器起動検出手段を有し、
前記周辺機器起動検出手段が、前記第２のプログラムモジュールの前記起動条件情報に記述されている周辺機器が起動したことを検出した場合、前記起動手段は、周辺機器の起動を起動条件とする前記第２のプログラムモジュールを前記数情報が閾値を超えない範囲で起動する、
ことを特徴とする請求項１〜３いずれか１項記載の情報処理装置。
【請求項５】
前記起動条件情報には、プログラムモジュールの起動後に起動される事後起動周辺機器が記述されており、
前記第２のプログラムモジュールの前記起動条件情報に記述された周辺機器が、他のプログラムモジュールの前記起動条件情報に前記事後起動周辺機器として記述されている場合、
前記特定手段は、前記他のプログラムモジュールを、前記第１のプログラムモジュールの起動に必要な前記第２のプログラムモジュールであると特定し、
前記起動手段は、前記第２のプログラムモジュールであると特定された前記他のプログラムモジュールの起動が完了した場合に、前記第２のプログラムモジュールを前記数情報が閾値を超えない範囲で起動する、
ことを特徴とする請求項４記載の情報処理装置。
【請求項６】
前記数情報記録手段が記録する前記数情報はロードアベレージである、
ことを特徴とする請求項１〜４いずれか１項記載の情報処理装置。
【請求項７】
複数のＣＰＵ又はマルチコアのＣＰＵを搭載した情報処理装置に、
第１のプログラムモジュールの起動条件情報に記述されている起動条件に基づき、第１のプログラムモジュールの起動に必要な１つ以上の第２のプログラムモジュールを特定する特定ステップと、
プログラムモジュールを実行しているＣＰＵ又はコアの数情報を記録する数情報記録ステップと、
前記数情報が閾値未満の場合に、起動条件が満たされている前記第２のプログラムモジュールを、前記数情報が閾値を超えない範囲で起動する起動ステップと、
を実行させるプログラム。
【請求項８】
複数のＣＰＵ又はマルチコアのＣＰＵを搭載した情報処理装置の起動方法において、
各プログラムモジュールの起動条件が記述された起動条件情報と、
特定手段が、第１のプログラムモジュールの起動条件情報に記述されている起動条件に基づき、第１のプログラムモジュールの起動に必要な１つ以上の第２のプログラムモジュールを特定するステップと、
数情報記録手段が、プログラムモジュールを実行しているＣＰＵ又はコアの数情報を記録するステップと、
起動手段が、前記数情報が閾値未満の場合に、起動条件が満たされている前記第２のプログラムモジュールを、前記数情報が閾値を超えない範囲で起動するステップと、
を有することを特徴とする起動方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のＣＰＵ又はマルチコアのＣＰＵを搭載した情報処理装置に関する。
【背景技術】
【０００２】
組み込みシステムにおいてもマルチコアＣＰＵが搭載されることが多くなっている。また、組み込み以外の情報処理装置においては、マルチコアＣＰＵが搭載されることがかなり多くなっている。したがって、マルチコアＣＰＵが搭載されている情報処理装置では、マルチコアＣＰＵが搭載されていることを有効利用してシステムを最適化することが好ましい。例えば、ユーザビリティの視点から、電源ＯＮからユーザが使用可能になるまでの時間が短い方が好ましい。このため、マルチコアＣＰＵが搭載されていることを有効利用して起動速度の向上を図ることが求められる。
【０００３】
従来、情報処理装置の起動の高速化についてはいくつかの技術が提案されている（例えば、特許文献１参照。）。特許文献１には、カーネルイメージを複数の区画に分割しておき、分割されたカーネルイメージを複数の区画毎にメモリにロードし、ロードされた区画から順次実行することで起動を高速化する起動方法が開示されている。しかしながら、特許文献１では、カーネル起動以前の処理を高速化するものであり、マルチコアＣＰＵが搭載されていることを有効利用しているとまでは言えない。
【０００４】
カーネルの起動後において、情報処理装置の起動を高速化することについては以下のような技術がある。まず、比較のため、高速化されていない場合の起動方法について説明する。一般的なＵｎｉｘ（登録商標）が搭載された情報処理装置では、initプロセスがシステムの初期化を行う。initプロセスのとしてSysVinitというプログラムが知られており、SysVinitは、/etc/inittabファイルのshellスクリプトの設定内容に従って、ラン・レベル（動作モード）の設定やコンソールの起動、起動用スクリプトの実行などの処理を行う。
【０００５】
このようにSysVinitは、単純に起動したいプロセスとしてshellスクリプトで羅列されたプログラムモジュールをランレベルに応じて管理できるだけのものであった。また、SysVinitによるプログラムモジュールの実行は逐次実行で、情報処理装置のリソース（資源）に関係なくプログラムモジュールが逐次立ち上げられるだけであった。
【０００６】
その後、情報処理装置のイベントを契機にして起動するUpstartと呼ばれるinitプロセスが使用されるようになった。Upstartは、ＵＳＢメモリの装着やＣＤ−ＲＯＭの挿入などのイベントを検知して、それぞれに対応するプログラムモジュールの初期設定を行うイベント駆動型のinitプロセスである。これにより、無駄なプログラムモジュールの起動に起因して長くなっていた起動完了までの時間を短縮したり、資源競合をさけることが可能になっている。なお、Apple社のOSXには、イベント駆動型のinitプロセスとしてLaunchdというinitプロセスが用意されている。
【０００７】
より詳細には、UpstartやLaunchdは、起動される各プログラムモジュールの依存関係を考慮して起動順を制御する。たとえば、ＵＳＢデバイスが準備完了状態にならない状態でＵＳＢに関連したプログラムモジュールを起動することは、起動時のメモリへのロードで資源を消費するばかりで、他のプログラムモジュールの起動を阻害してしまう。また、プログラムモジュールによっては、別のプロセスの起動を待ち合わせないと起動しても意味が無いものがある。Upstartでは、こういった依存関係を記載したスクリプト（起動手順書）を元にプロセスの起動順を制御する。そして、依存関係がなければマルチコアＣＰＵにより資源競合を回避できるので起動時間を短縮できる。
【０００８】
図１は、SysVinit、Upstart、及び、Systemdという各initプロセスの起動処理を模式的に説明する図の一例である。SysVinitでは、各プログラムモジュール（Syslog、D-Bus、Avahi、Bluetooth（登録商標））が逐次立ち上げられている。これに対し、Upstartでは、AvahiとBluetoothの起動を同時並行に行うため、全体の起動時間を短縮できる。
【０００９】
さらに、linuxシステムではUpstart等の発展形としてSystemdというinitプロセスが開発されている。Systemdではプログラムモジュールの初期化を同時実行することで更に高速に起動することを実現している。図１では、Syslog、D-Bus、Avahi及びBluetoothの初期化が同時に実行されているため、Upstartよりもさらに起動時間を短縮できる。
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、Systemdによるプログラムモジュールの起動処理の平行化は、デバイスやプログラムモジュール間の依存関係が満たされている限り無差別に行なわれており、同時にプロセスが起動されることにより却って資源の奪い合いが発生する可能性があるという問題がある。
【００１１】
プログラムモジュールの起動は、プログラムモジュールをＨＤＤなどの記憶装置からＲＡＭなどのメモリにロードし、使用する作業メモリを確保し、ＣＰＵがプログラムモジュールを実行して必要な初期化処理を行うという一連の処理が含まれる。よって、起動処理は負荷がかかりやすい処理である。十分な容量のメモリが搭載されており、多くのコア（例えば４コア以上）を用いたＣＰＵのマルチコア化が当たり前となりつつあるＰＣサーバでは、起動時間に大きな影響は生じにくい。
【００１２】
しかし、メモリ容量やＣＰＵのコア数に制限がある組み込みシステムやコア数が少ないＰＣでは、プログラムモジュールの同時実行が、逆にメモリ確保・ＨＤＤからメモリへの転送などで資源競合による遅延を引き起こし、必ずしも起動時間を短縮化できないおそれがある。起動時間が長くなると、ユーザビリティが低下してしまう。
【００１３】
本発明は、上記課題に鑑み、情報処理装置の起動時にプログラムが同時実行されることによる起動時間の遅延を抑制する情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明は、複数のＣＰＵ又はマルチコアのＣＰＵを搭載した情報処理装置において、各プログラムモジュールの起動条件が記述された起動条件情報と、第１のプログラムモジュールの前記起動条件情報に記述されている起動条件に基づき、第１のプログラムモジュールの起動に必要な１つ以上の第２のプログラムモジュールを特定する特定手段と、プログラムモジュールを実行しているＣＰＵ又はコアの数情報を記録する数情報記録手段と、前記数情報が閾値未満の場合に、起動条件が満たされている前記第２のプログラムモジュールを、前記数情報が閾値を超えない範囲で起動する起動手段と、を有することを特徴とする。
【発明の効果】
【００１５】
情報処理装置の起動時にプログラムが同時実行されることによる起動時間の遅延を抑制する情報処理装置を提供することができる。
【図面の簡単な説明】
【００１６】
【図１】SysVinit、Upstart、及び、Systemdのinitプロセスの起動処理を模式的に説明する図の一例である。
【図２】本実施形態の起動時のプロセス実行を模式的に示す図の一例である。
【図３】画像形成装置のハードウェア構成図の一例である。
【図４】コントローラのメイン制御システムに搭載されるソフトウエアブロックの構成図の一例である。
【図５】起動処理モジュールの構成図の一例である。
【図６】somedaemonの起動スクリプトの一例を示す図である。
【図７】ターゲットリストと一例を示す図である。
【図８】プログラムモジュール間の依存関係を説明する図の一例である。
【図９】ＡＰＰ１とＡＰＰ２の起動時のシーケンス図の一例である。
【図１０】起動処理モジュールの動作手順を示すフローチャート図の一例である。
【図１１】起動処理モジュールが行う各プログラムの起動処理を説明するフローチャート図の一例である。
【発明を実施するための形態】
【００１７】
以下、本発明を実施するための形態について図面を参照しながら説明する。
【００１８】
図２は、情報処理装置の起動時におけるプログラムモジュールの実行を模式的に示す図の一例である。本実施形態の情報処理装置は、無差別にプログラムモジュールを同時に実行するのではなく、利用可能な資源に応じて、起動するプログラムモジュール数を制限することで、資源競合による遅延を抑制する。これにより、単純にsystemdが起動処理を実行する場合よりも、起動時間を短縮できる。
【００１９】
図２において、右向きの白矢印はプログラムモジュールが起動されていることを示す。また、黒い矢印線は、黒矢印の始点にある白矢印と黒矢印の終点にある白矢印の間に依存関係があることを示している。本実施形態のinitプロセスは、以下のように起動時のプログラムモジュールの実行を制御する。
・常に可能な限りプロセッサ数と同じ数のプログラムモジュールを実行させる。
・依存関係を監視しながらプログラムモジュールの起動を制御する。
【００２０】
図２ではＣＰＵの数又はＣＰＵのコア数が３個であるとしている。このため、３つのプログラムモジュールを同時に実行できるが、プログラムモジュールＣはプログラムモジュールＢと依存関係があり、プログラムモジュールＤ，ＥはプログラムモジュールＡと依存関係がある。このため、initプロセスはまず、プログラムモジュールＡ，Ｂのみを実行する。
【００２１】
プログラムモジュールＡの起動が完了すると、initプロセスはプログラムモジュールＡと依存関係があるため実行しなかったプログラムモジュールＤ，Ｅを実行する。また、プログラムモジュールＢの起動が完了すると、initプロセスはプログラムモジュールＢと依存関係があるため実行しなかったプログラムモジュールＣを実行する。
【００２２】
プログラムモジュールＥが実行完了すると、initプロセスはプログラムモジュールＦを実行する。この時、プログラムモジュールＧ又はＨを実行してもよい。そして、initプロセスは、プログラムモジュールＤの実行が完了するとプログラムモジュールＧの実行を開始し、プログラムモジュールＣの実行が完了するとプログラムモジュールＨの実行を開始する。
【００２３】
このように起動時に実行するプログラムモジュールの順番を制御することで、常時、ＣＰＵの数と同じ数以下のプログラムモジュールを実行するので、資源競合が生じにくく、依存関係の制約がなければＣＰＵの数だけ同時実行できる。したがって、逐次実行したり、単純に同時実行したりするよりも起動時間を短縮できる。
【００２４】
〔構成例〕
図３は、画像形成装置のハードウェア構成図の一例を示す。画像形成装置１００は組み込みシステムが搭載された情報処理装置の一例であるので、プロジェクタ、デジタルカメラ、テレビ会議端末、などの組み込みシステムなどでもよい。また、汎用的なＰＣ（Personal  Computer）や、サーバ、タブレット端末、スマートフォンなどの情報処理装置においても本実施形態の起動方法を適用できる。
【００２５】
画像形成装置１００はプリンタ機能を有し、この他、スキャナ、ファクシミリ、コピーなどの機能の１つ以上を搭載している。複合的な機能が搭載されているため、ＭＦＰ（Multifunction Peripheral/Printer/Product）と呼ばれる場合がある。
【００２６】
画像形成装置１００は、エンジン１１、拡張スロット用ボード１２、コントローラ１３、ＵＳＢ Ｉ／Ｆ１４及びＮＩＣ１５を有している。エンジン１１は、プリンタエンジン、スキャナエンジン、ＦＡＸエンジンなどのエンジンである。
【００２７】
コントローラ１３は、エンジン１１を含む画像形成装置１００の全体を制御する。拡張スロット用ボード１２は、搭載されるスロット数を増大するためのボードであり、コントローラ１３と接続されている。拡張ボードには２つのスロット４，５（符号は２１，２２）が搭載されている。
【００２８】
コントローラ１３は、ＣＰＵ２３、ＡＳＩＣ１（符号は２４）、ＭＥＭ２５、ＨＤＤ（Hard Disk Drive）２６、ＳＤ（Secure Digital）２７、ＬＯＧＩＣ２８、ＲＯＭ０（符号は２９），ＲＯＭ１（符号は３０）、ＮＶＲＡＭ（Nonvolatile Random Access Memory）３１、スロット１〜３（符号は３２〜３４）、ＡＳＩＣ２（符号は３６）、及び、操作部３５、を有している。ＣＰＵ２３は、ＨＤＤ２６に記憶されているＯＳやプログラムを実行して、ＡＳＩＣ１，２などを制御して画像形成等を行う。本実施形態のＣＰＵ２３はコアを複数個搭載したマルチコアＣＰＵであるが、複数のＣＰＵを搭載していてもよい。
【００２９】
ＡＳＩＣ１は、ＣＰＵ２３の制御下でＰＣから受信した印刷データを画像データに変換したり、スキャナが読み取った画像データを印刷に適した画像データに変換するなどの画像処理を行う。ＭＥＭ２５は、主に画像データのラインメモリであり、プログラムのワークエリアとしても使用される。
【００３０】
ＨＤＤ２６は、画像データ、管理情報、フォントデータ、ＯＳ、プログラムなどを格納する記憶装置である。転送速度を上げるために２台並列で接続する場合がある。ＳＤ２７は不揮発性のメモリであり、ＳＤ２７にＯＳなどが記憶されていれば画像形成装置１００をブートすることが可能である。また、ＳＤ２７はプログラムの配布用に使用される場合がある。
【００３１】
ＬＯＧＩＣ２８は、ＰＣＩ(Peripheral Component Interconnect)信号からローカルバス信号を作り出すＩＣである。ＲＯＭ０、１はブート可能なRead Only Memoryで、電源オン時に実行されるプログラム（例えばＢＩＯＳ）を格納する。ＮＶＲＡＭ３１は、画像形成装置の設定（画面設定、印刷時の制御用パラメータ、スキャン時の制御用パラメータ、印刷枚数）などを保存する。ＳＬＯＴ１〜５は、ＰＣＩスロットであり、機能を拡張するために使用される。
【００３２】
ＡＳＩＣ２は、ＡＳＩＣ１とＰＣＩで接続され電源制御などを行う。操作部３５は、不図示のＣＰＵを有し予め記憶しているプログラムを実行する独立したモジュールであり、画面表示とユーザ操作の受け付けを行うユーザインタフェースである。
【００３３】
ＵＳＢ Ｉ／Ｆ１４は、外部の機器やＵＳＢメモリと接続するための通信部である。ＮＩＣ１５は、ネットワーク・インタフェースカードであり、ＬＡＮなどのネットワークに接続し、ＰＣ等と通信する。
【００３４】
画像形成装置１００の起動時の動作について説明する。
【００３５】
電源がＯＮされるとエンジン１１は、ＣＰＵ２３により各機能が初期化され、コントローラ１３の初期化が終わって、処理要求コマンドを受信するまで待機状態になる。この初期化の手順が、装置を通常の使用可能な状態とする際に行われる。
【００３６】
コントローラ１３の初期化は、次の手順により行われる。電源が投入されると、まず、ＡＳＩＣ２にリセット信号が入力される。リセット信号が入力されたＡＳＩＣ２は、いくつかに分割された電源系統に順番をつけて、電源が入るように電源ユニットに、信号を送信する。
【００３７】
この結果、それぞれの電源系統から発生したリセット信号が必要なデバイスに分配される。ＣＰＵ２３では、リセット信号がアサートされた後ネゲートされると、リセットベクターの命令をフェッチするため、ＡＳＩＣ１にフェッチ信号を送る。ＡＳＩＣ１は、このフェッチ信号を受け取るとアドレスをデコードして、初期化プログラムの格納されているＲＯＭ０のCS信号をアサートし、ＣＰＵ２３が要求したアドレスの内容（命令コード又はデータ）を読み出して、ＣＰＵ２３へ渡す。
【００３８】
ＣＰＵ２３はＡＳＩＣ１に命令の読み出しを繰り返し要求し、ＡＳＩＣ１は、そのアドレスに応じてＲＯＭ０の命令コード又はデータをＣＰＵ２３へ渡す。このようにしてＣＰＵ２３は、プログラムを実行することができる。ＡＳＩＣ１は、ＲＯＭ０の代わりにＳＤから、直接コード/データを読み出すことができる。
【００３９】
読み出された初期化プログラムによって、ＣＰＵ２３の初期化、ＡＳＩＣ１に接続されるＭＥＭ２５とＡＳＩＣ２の初期化、ＡＳＩＣ１から出ている２種類のＰＣＩバスの初期化、エンジン１１の初期化、操作部３５の初期化、ＨＤＤ２６の初期化、ＮＩＣ１５の初期化、また、必要に応じて、ＳＬＯＴ１〜５の初期化を行う。その後、画像形成装置１００は汎用ＯＳを起動して、次にアプリケーションを起動する。
【００４０】
図４は、コントローラ１３のメイン制御システムに搭載されるソフトウエアブロックの構成図の一例である。
【００４１】
画像形成装置１００は、アプリケーションとして、PRINT-APL（プリントアプリケーション）４１、COPY-APL（コピーアプリケーション）４２、FAX-APL（ＦＡＸアプリケーション）４３、SCAN-APL（スキャナアプリケーション）４４、及び、NETWORK-APL（ネットワークアプリケーション）４５、を有している。各アプリケーションはジョブの実行条件を設定するためのＵＩ画面を表示し、また、ユーザの設定を受け付ける。なお、アプリケーションとは、汎用ＯＳに比べて比較的上位の階層のプログラムの呼称に過ぎず、アプリケーションも組み込みプログラムの一種である。
【００４２】
サービス-API４６は、アプリケーションがサービス層のサービスを読み出すためのアプリケーションプログラミングインターフェースである。サービス層には、ＥＣＳ（エンジンコントロールサービス）４７、ＭＣＳ（メモリコントロールサービス）４８、ＯＣＳ（オペレーションパネルコントロールサービス）４９、ＦＣＳ（ＦＡＸコントロールサービス）５０、ＮＣＳ（ネットワークコントロールサービス）５１、ＳＣＳ（システムコントロールサービス）５２、及び、ＳＲＭ（システムリソースマネジャー）５３がある。
【００４３】
起動処理モジュール５４は、initプロセスを実行するプログラムである。詳しくは後述する。汎用ＯＳ５５は、例えばＵＮＩＸ（登録商標）、ＬＩＮＵＸ（登録商標）などのＯＳである。エンジンコマンドＩ／Ｆ５６は、汎用ＯＳ５５がエンジン１１と通信するためのプログラミングインターフェースである。エンジン１１はエンジン本体である。ハードウェア５７は、コントローラ１３のハードウェアリソース（ＣＰＵやＭＥＭなど）を意味している。
【００４４】
〔起動処理モジュール〕
図５は、起動処理モジュール５４の構成図の一例を示す。
【００４５】
起動スクリプト：起動すべきプログラムの詳細を記載したスクリプトである。起動スクリプト６１はプログラムモジュール毎に予め用意されている。起動スクリプト６１はＨＤＤのファイルシステムに記憶されている。詳細は図６にて説明する。
ターゲットリスト：最終的に起動しなければならないプログラムモジュールのリストである。このプログラムモジュールは例えばアプリケーションである。ターゲットリストにおける記述順が、起動の優先順位となる。ターゲットリスト６２はＨＤＤのファイルシステムに記憶されている。詳細は図７にて説明する。
【００４６】
メイン：起動処理モジュール５４のメインルーチンである。起動時にターゲットリスト６２を読み出すことができる。メイン６３は、以下のサブルーチンの処理結果に基づいて各プログラムモジュールの起動を行う。
【００４７】
起動スクリプト解析部：ターゲットリスト６２に記述されたアプリケーションの起動に必要な記述を起動スクリプト６１から読み出し、各プログラムモジュールの依存関係を特定する。例えば、あるプログラムモジュールの起動には別のプログラムモジュールの起動が必要であること、ＵＳＢＩ／ＦなどのデバイスがReady状態であることが必要であること、などを特定する。なお、デバイスやハードウェアは特許請求の範囲の周辺機器の一例である。
【００４８】
なお、起動スクリプト解析部は、起動スクリプトに記述された依存関係において、監視すべきシステムリソースを決定する。ＣＰＵ以外のシステムリソースとしては、起動スクリプトに例えばファイルが作成されることが記述されている場合、ファイルの実体が保持されるメモリ（ＭＥＭ２５）などが該当する。
【００４９】
プログラム状態監視部：ターゲットリスト６２に記述されたアプリケーションにたどり着くまでに起動しなければならないプログラムモジュールが起動されたか否かを監視する。起動スクリプト解析部６４が、例えば、アプリケーションの起動にプログラムモジュールaの起動が必要であり、プログラムモジュールaの起動にはプログラムモジュールｂの起動が必要であると特定したとする。この場合、プログラム状態監視部６５は、プログラムモジュールａ，ｂの実行状態を監視する。
【００５０】
デバイス監視部：ターゲットリスト６２に記述されたアプリケーションにたどり着くまでに起動していなければならないデバイスを監視する。起動スクリプト解析部６４が、アプリケーションの起動に、ＨＤＤ２６がマウントされること、ＵＳＢＩ／ＦがReady状態になること、が必要であると特定したとする。この場合、デバイス監視部６６は、ＨＤＤ２６がマウントされたか否か，ＵＳＢＩ／ＦがReady状態になったか否かを監視する。
【００５１】
リソース監視部：監視しなければならないシステムリソースを監視する。システムリソースは例えばＣＰＵリソース、メモリ（メモリの空き容量やメモリにファイルが作成された否か）などである。
【００５２】
ＣＰＵリソースの監視には、例えばロードアベレージを使用する（ロードアベレージは特許請求の範囲の数情報の一例である）。ロードアベレージはＵＮＩＸ系のＯＳが提供するＣＰＵ２３に加わっている負荷の大きさを示す指標である。ロードアベレージは １ＣＰＵ で処理可能な処理量を１とした場合のＣＰＵリソースの要求量を反映した値である。例えば、１プログラムが１ＣＰＵ を専有し続けるとロードアベレージは次第に１に近付く。２つのプログラムが２つのＣＰＵを占有し続けるとロードアベレージは２に近づく。１ＣＰＵしかないコンピュータで１つのプログラムが１ＣＰＵを専有し、もう１つのプログラムが実行待ちの場合、ロードアベレージは２になる。したがって、ロードアベレージが、画像形成装置１００が有するＣＰＵ２３の数よりも約１小さくなれば、ＣＰＵリソースに空きができたと判定できる。
【００５３】
この他、ＣＰＵリソースの監視に、ＣＰＵ負荷率などを用いていてもよい。予めＣＰＵ負荷率と何個のコアを専有しているかを対応づけておけば、ＣＰＵ負荷率から専有されているコア数を特定できる。
【００５４】
メモリ負荷の監視には例えばメモリ使用量を使用する。ＯＳはメモリ使用量をリアルタイムに提供するのでそれを利用する。メモリ使用量により、物理メモリ量、使用中のメモリの容量、物理メモリ使用率などを検出できる。
【００５５】
〔起動スクリプト〕
図６は、somedaemonの起動スクリプト６１の一例を示す図である。起動スクリプト６１は、起動処理モジュール５４が、プログラムモジュールの起動の動作を決定し、各プログラムモジュールを起動させるためのテキストになっている。図６では、一般的なセクションの記述例を示す。
「Ｕｎｉｔ」セクションの「Description="somedaemon description."」はプログラムモジュール名を指定している。なお、プログラムモジュールはダエモン（デーモンとも言う）と呼ばれる場合がある。
「Ｕｎｉｔ」セクションの「Requires="mounted /somedir"」は、このプログラムモジュールを起動するための事前条件を示す（特許請求の範囲の起動条件の一例である）。この例では/somedirがマウントされることを条件としている。何が事前条件となるかはプログラムモジュールにより様々であり、例えば、プログラムモジュールの起動が事前条件となる場合がある。
「Ｕｎｉｔ」セクションの「Effect="created /var/XXX"」は、この起動スクリプト６１が実行されることで将来生じる情報処理装置のイベントを表す。これ例では、varというディレクトリに"XXX"というファイルが作成されることを意味している。Effectはプログラムモジュールの事後条件を規定する。他の起動スクリプト６１でRequireされているEffectのイベントのみが、起動処理モジュール５４にとって有効な記載となる。なお、事後条件は特許請求の範囲の事後起動周辺機器の一例である。
【００５６】
例えば、Ａというプログラムモジュールの起動スクリプト６１のRequiresが、Ｂというプログラムモジュールの起動スクリプト６１のEffectのイベントを事前条件とする場合、起動処理モジュール５４にとってＢというプログラムモジュールの起動スクリプト６１のEffectの記述が有効になる。この場合、プログラムモジュールＡは、プログラムモジュールＢと依存関係にある。
【００５７】
「Service」セクションの「ExecStart="/somedir/bin/somedaemon.sh"」は、起動するプログラムモジュールとその記憶場所（Ｐａｔｈ）とが記述されている。ここには、シェルスクリプトが記述される場合がある。
【００５８】
〔ターゲットリスト〕
図７は、ターゲットリスト６２の一例を示す図である。ターゲットリスト６２は、情報処理装置が起動したいと考えるプログラムモジュール（具体的にはアプリケーションであるが、アプリケーションもプログラムモジュールの一種である）のリストである。複数のプログラムモジュールがある場合は上位のプログラムモジュールの方が、優先度が高いと判定される。図７の例ではＡｐｐ１がＡｐｐ２よりも優先されて起動される。例えば、ＡＰＰ１を起動する場合、起動スクリプト解析部６４は、ＡＰＰ１を起動するために事前に起動しなければならないプログラムモジュールやデバイスを起動スクリプト６１により特定できる。
【００５９】
ターゲットリスト６２には、アプリケーション以外のプログラムモジュールのリストが記載されていてもよいが、アプリケーションを起動するためにすでに起動されたプログラムモジュールは起動する必要がない。
【００６０】
〔依存関係〕
図８は、プログラムモジュール間の依存関係を説明する図の一例である。矢印は起動の依存関係を示しており、矢印の終点のプログラムモジュールは矢印の始点のプログラムモジュールが起動することを起動の条件としている。また、矢印には、矢印の終点のプログラムモジュールにとって事前条件となるイベントが記載されている。この事前条件は、起動スクリプト６１のRequires 又はRequiresとEffectで定まる、
例えば、ＫＭＭからＳＣＳに向かう矢印には"Create /var/XXX"と記載されているが、これは、ＫＭＭが起動することで/var/に"XXX"ファイルが生成されることを示している。つまり、ＳＣＳは/var/に"XXX"ファイルが生成されることを起動の条件（つまり事前条件）としている。
【００６１】
同様に、ｕｓｂｄが起動してid＝"XXX"が"attached"されることが、ＯＣＳと指紋認証モジュールが起動することの条件となっている。"attached"は、ｕｓｂｄの起動に伴ってＵＳＢデバイスが接続されたこと（ＯＳ上のデバイスドライバが有効になったこと）を意味する。また、"ｉｄ"はポートＩＤを意味していて、何番目のＵＳＢポートにＵＳＢデバイスがつながっているかを示す。
【００６２】
ｕｓｂｄはＵＳＢデバイスが接続されたことを検知してデバイス監視部に通知する（または、デバイス監視部がｕｓｂｄの状態を監視している）。
【００６３】
したがって、ＵＳＢ Ｉ／Ｆ１４に操作部デバイスのモジュールが接続され、ｕｓｂｄが使用可能であるというイベントをデバイス監視部が検出して、起動処理モジュールがＯＣＳ（操作部を管理する）を起動している。
【００６４】
指紋認証モジュールに関しても同様で、ＵＳＢ Ｉ／Ｆ１４に指紋認証用のデバイスが装着されて指紋認証デバイスが利用可能になったことを、デバイス監視部が検知する。指紋認証モジュールの起動条件が満たされたら、起動処理モジュールが指紋認証モジュールを起動する。
【００６５】
図８の例では、ＡＰＰ１を起動するために、ＳＣＳ、ＮＣＳ、ＯＣＳの起動が必要であり、ＳＣＳを起動するためにＫＭＭを起動することが必要であること、ＯＣＳを起動するためにｕｓｂｄを起動することが必要であること、ｕｓｂｄを起動するためにＵＳＢ Ｉ／Ｆ１４がReady状態であること、が必要である。
【００６６】
起動処理モジュール５４は、ターゲットリスト６２から優先順位順にアプリケーション名を読み出し、該アプリケーションの起動スクリプト６１を読み出して、事前条件を確認する。事前条件があれば、その事前条件を満たすために起動が必要なプログラムモジュールを、起動スクリプト６１に基づき特定する。また、事前条件が要求するイベントを事後条件とするプログラムモジュールを起動スクリプト６１から検索する。このように、事前条件と事後条件を辿ることでＡＰＰ１の起動に必要なプログラムモジュールをすべて特定できる。
【００６７】
〔シーケンス〕
図９は、ＡＰＰ１とＡＰＰ２の起動時のシーケンス図の一例を示す。図９のシーケンスは、図８の依存関係に基づいている。また、ＣＰＵ２３の数又はＣＰＵ２３のコア数は２つであるとする。
【００６８】
横向きの矢印は、各プロセスによりＣＰＵ２３が専有され起動中であることを示しており、矢印の終端がプログラムモジュールの終了ではない。また、実際のプログラムモジュールは動作によっては間欠的にＣＰＵ２３を専有する可能性があるがそれは表現されていない。
【００６９】
図８の依存関係によれば、ＡＰＰ１を起動するために、起動処理モジュール５４は、最初にＫＭＭとＮＣＳを起動し、ＵＳＢ Ｉ／Ｆ１４がReady状態であることが必要であると判断する。
ｔ１：ＣＰＵ２３が２個なのでメイン６３は、ＫＭＭとＮＣＳの起動を開始する。ＣＰＵが空いていることはリソース監視部が監視している。
ｔ２：デバイス監視部６６は、ｕｓｂｄの起動に必要なデバイスとして監視していた、ＵＳＢ Ｉ／Ｆ１４がReadyになったことを検出する。
ｔ３：プログラム状態監視部６５はＫＭＭの起動の完了を検出する。また、リソース監視部６７は、ロードアベレージが１近くに低下したこと（少なくとも２未満になったこと）を検出する。これにより、メイン６３は、ｕｓｂｄの起動を開始する。ロードアベレージは再度、約２に近い値となる。
ｔ４：プログラム状態監視部６５はＮＣＳの起動の完了を検出する。また、リソース監視部６７は、ロードアベレージが１近くに低下したこと（少なくとも２未満になったこと）を検出する。これにより、メイン６３は、ＳＣＳの起動を開始する。ロードアベレージは再度、約２に近い値となる。
ｔ５：プログラム状態監視部６５はｕｓｂｄの起動の完了を検出する。また、リソース監視部６７は、ロードアベレージが１近くに低下したこと（少なくとも２未満になったこと）を検出する。これにより、メイン６３は、ＯＣＳの起動を開始する。ロードアベレージは再度、約２に近い値となる。
ｔ６：デバイス監視部６６は、ＡＰＰ２の起動に必要なデバイスとして監視していた、ＨＤＤ２６がReadyになったことを検出する。しかし、ＡＰＰ１の起動が完了していないので、メイン６３はＡＰＰ２の起動を開始しない。
ｔ７：プログラム状態監視部６５はＳＣＳとＯＣＳの起動の完了を検出する。これにより、プログラム状態監視部６５は、ＡＰＰ１の起動に必要なプログラムモジュールの起動が完了したと判定する。よって、メイン６３は、ＡＰＰ１の起動を開始する。
ｔ８：プログラム状態監視部６５は、ＡＰＰ１の起動が完了したことを検出する。すでにＨＤＤ２６がReadyになっているので、メイン６３はＡＰＰ２の起動を開始する。
【００７０】
以上により、ターゲットリスト６２にある２つ目のターゲット（アプリケーション）まで全ての起動が完了する。
【００７１】
〔動作手順〕
図１０は、起動処理モジュール５４の動作手順を示すフローチャート図の一例を示す。図１０の手順は汎用ＯＳ５５がinitプロセスを開始することでスタートする。なお、起動スクリプト６１とターゲットリスト６２は例えばＨＤＤ２６のファイルシステム上にファイルとして存在しているものとする。
【００７２】
まず、メイン６３は、ファイルシステムから起動スクリプト６１とターゲットリスト６２を読み出す（Ｓ１０）。ＭＥＭなどのメモリ上に、起動スクリプト内部データとターゲットリスト６２が配置される。
【００７３】
起動スクリプト解析部６４は、監視すべきデバイスを抽出し、起動の完了の有無を登録するためのテーブルなどに登録する（Ｓ２０）。具体的には、ターゲットリスト６２の優先順位順にアプリケーション名を読み出し、該アプリケーションの起動スクリプト６１を読み出す。この起動スクリプト６１により、プログラムモジュール間の依存関係を特定し、アプリケーションの起動に必要なプログラムモジュールが必要とするデバイスを特定する。
【００７４】
次に、リソース監視部６７は、監視リソースを抽出し、監視リソース（資源）の状態を登録するためのテーブルなどに登録する（Ｓ３０）。資源は、例えばＣＰＵリソース、メモリ（空き容量、ファイルが生成されたか否か）などであるが、本実施形態では主にＣＰＵ２３を資源として説明する。
【００７５】
次に、起動処理モジュール５４は、図１１に示す起動処理を実行する（Ｓ４０）。
【００７６】
図１１は、起動処理モジュール５４が行う各プログラムの起動処理を説明するフローチャート図の一例である。起動処理では、メモリ上のターゲットリスト６２のアプリケーションを全て起動させる。
【００７７】
メイン６３は、ターゲットリスト６２から優先順位にしたがって１つアプリケーション名を取り出す（Ｓ４１）。
【００７８】
次に、メイン６３は起動スクリプト解析部６４により、アプリケーションの起動スクリプト６１を読み出し、アプリケーションの起動に必要なすべての起動候補のプログラムモジュールを特定する（Ｓ４２）。
【００７９】
メイン６３は、リソース監視部６７が監視するＣＰＵリソースであるロードアベレージがＣＰＵ数又はコア数よりも十分に小さいか否かを判定する（Ｓ４３）。十分に小さい値は、ＣＰＵ数又はコア数が２個の場合は、例えば１〜１．５などである。また、ステップＳ４３では一定時間、ロードアベレージがＣＰＵ数又はコア数よりも十分に小さいか否かを判定してもよい。これにより、ロードアベレージが短時間に増減した場合にＣＰＵリソースの状態を正確に判定しやすくなる。
【００８０】
ロードアベレージがＣＰＵ数よりも十分に小さくない場合（Ｓ４３のＮｏ）、起動処理モジュール５４はロードアベレージが低下するまでスリープする（Ｓ４４）。例えば、スケジューラにより実行待ち状態にされる。
【００８１】
ロードアベレージがＣＰＵ数よりも十分に小さい場合（Ｓ４３のＹｅｓ）、メイン６３は、起動候補のプログラムモジュールのうち、事前条件を満たし、かつ、プログラム状態監視部６５に実行状態又は起動済みで登録されていない起動候補を実行する。事前条件には、デバイスの起動も含まれる。
【００８２】
また、プログラム状態監視部６５は、実行した起動候補のプログラムモジュールを実行済みとしてテーブルに登録する。事前条件を満たしていない起動候補については事前条件を満たすまで待機する。
【００８３】
メイン６３は、起動候補が空になったか否かを判定する（Ｓ４６）。
【００８４】
起動候補が空になっていない場合（Ｓ４６のＮｏ）、メイン６３はステップＳ４２以降の処理を繰り返す。
【００８５】
起動候補が空になった場合（Ｓ４６のＹｅｓ）、メイン６３はターゲットリスト６２が空になったか否かを判定する（Ｓ４７）。
【００８６】
ターゲットリスト６２が空でない場合（Ｓ４７のＹｅｓ）、メイン６３はステップＳ４１以降の処理を繰り返す。
【００８７】
ターゲットリスト６２が空である場合（Ｓ４７のＮｏ）、メイン６３は起動処理を終了する。以上により、ターゲットリスト６２に記述されているアプリケーションを優先順位にしたがって起動できる。また、起動の際、依存関係を満たしたプログラムモジュールをＣＰＵ２３の数だけ同時実行できる。したがって、資源競合が生じにくく、逐次実行したり、単純に同時実行したりするよりも起動時間を短縮できる。
【符号の説明】
【００８８】
１１      エンジン
１３      コントローラ
１４      ＵＳＢ  Ｉ／Ｆ
１５      ＮＩＣ
２３      ＣＰＵ
２６      ＨＤＤ
５４      起動処理モジュール
５５      汎用ＯＳ
６１      起動スクリプト
６２      ターゲットリスト
６３      メイン
６４      起動スクリプト解析部
６５      プログラム状態監視部
６６      デバイス監視部
６７      リソース監視部
１００    画像形成装置
【先行技術文献】
【特許文献】
【００８９】
【特許文献１】特開２００９−１０４４４３号公報
【図１】
2015041186.tif 000003
【図２】
2015041186.tif 000004
【図３】
2015041186.tif 000005
【図４】
2015041186.tif 000006
【図５】
2015041186.tif 000007
【図６】
2015041186.tif 000008
【図７】
2015041186.tif 000009
【図８】
2015041186.tif 000010
【図９】
2015041186.tif 000011
【図１０】
2015041186.tif 000012
【図１１】
2015041186.tif 000013