(57)【要約】【課題】マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐこと。【解決手段】第１制御手段１００は、第１ＯＳ２０上で動作中のプロセス１が呼び出した関数２７を第１ＯＳ２０と第２ＯＳ２３とで共通に解釈されるコマンド２９に変換し、変換されたコマンド２９を第２制御手段２００のコマンドバッファ５１に書き込む。第１制御手段１００は、書き込まれたコマンド２９に対応する第２ＯＳ２３のシステムコールの第２制御手段２００による実行の結果を示すステータス３０をコマンドバッファ５１から読み出し、当該ステータス３０をプロセス１が解釈する戻り値２８に変換してプロセス１に返す。第１制御手段１００は、コマンド２９のコマンドバッファ５１への書き込み後にプロセス１が再起動された場合に、読み出されたステータス３０を廃棄する。【選択図】図４
2015005097.tif 000002
【特許請求の範囲】
【請求項１】
第１ＯＳ（Operating System）を実行する第１制御手段と、
第２ＯＳを実行する第２制御手段と、
前記第２制御手段によって制御されるデバイスと
を備え、
前記第１制御手段は、
前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段と
を備えた電子機器。
【請求項２】
前記コマンドが前記記憶領域に書き込まれた場合にＯＮを示し、前記プロセスが再起動された場合にＯＦＦを示すフラグを、前記コマンドの種類毎に記憶するフラグ記憶手段を備え、
前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグがＯＦＦを示す場合に、当該ステータスを廃棄する
請求項１に記載の電子機器。
【請求項３】
コマンドの種類毎に、前記コマンド書込手段によるコマンドの書き込み回数から、前記ステータス読出手段による当該コマンドの種類に対応するステータスの読み出し回数を差し引いた数を示すカウンタを記憶するカウンタ記憶手段を備え、
前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に、当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグが有効を示し、且つ、当該ステータスに対応するコマンドの種類と対応付けて前記カウンタ記憶手段に記憶されているカウンタが１を示さない場合に、当該ステータスを廃棄する
請求項２に記載の電子機器。
【請求項４】
前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段と
を備えた請求項１乃至３のいずれか一項に記載の電子機器。
【請求項５】
第１ＯＳを実行する第１制御手段と、
第２ＯＳを実行する第２制御手段と、
前記第２制御手段によって制御されるデバイスと
を備え、
前記第１制御手段は、
前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段と
を備えた電子機器。
【請求項６】
前記コマンド再書込手段は、前記第２ＯＳの再起動後にｏｐｅｎコマンドに対応するステータスが前記ステータス読出手段によって読み出された場合に、当該ステータスに含まれるファイルディスクリプタを引数とするコマンドを前記記憶領域に書き込む
請求項４又は５に記載の電子機器。
【請求項７】
前記デバイスは、画像データに基づいて画像を形成する請求項１乃至６のいずれか一項に記載の電子機器。
【請求項８】
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２の制御装置の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２の制御装置による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段と
を備えた制御装置。
【請求項９】
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、
前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２の制御装置の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２の制御装置による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段と
を備えた制御装置。
【請求項１０】
コンピュータを、
第１ＯＳ上で動作中のプロセスが呼び出した関数を、前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２のコンピュータの記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２のコンピュータによる実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段
として機能させるためのプログラム。
【請求項１１】
コンピュータを、
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、
前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２のコンピュータの記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２のコンピュータによる実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段
として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電子機器、制御装置及びプログラムに関する。
【背景技術】
【０００２】
特許文献１に記載されたマルチプロセッサシステムは、第１のプロセッサが、第１のプロセッサの内部表記の可変長の要求情報をシステムの標準表記に変換して要求情報バッファに書き込む。続いて、第２のプロセッサが、要求情報バッファから読み出した要求情報を解析し、要求情報で指定された実行プログラムを実行し、実行の結果を表す第２のプロセッサの内部表記の可変長の応答情報を作成し、作成した応答情報を標準表記に変換して応答情報バッファに書き込む。そして、第１のプロセッサが、応答情報バッファから読み出した応答情報を第１のプロセッサの内部表記に変換する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第２９７６５７６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
本発明は、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐことを目的とする。
【課題を解決するための手段】
【０００５】
請求項１に係る発明は、第１ＯＳ（Operating System）を実行する第１制御手段と、第２ＯＳを実行する第２制御手段と、前記第２制御手段によって制御されるデバイスとを備え、前記第１制御手段は、前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段とを備えた電子機器を提供する。
【０００６】
請求項２に係る発明は、請求項１に記載の電子機器において、前記コマンドが前記記憶領域に書き込まれた場合にＯＮを示し、前記プロセスが再起動された場合にＯＦＦを示すフラグを、前記コマンドの種類毎に記憶するフラグ記憶手段を備え、前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグがＯＦＦを示す場合に、当該ステータスを廃棄する。
請求項３に係る発明は、請求項２に記載の電子機器において、コマンドの種類毎に、前記コマンド書込手段によるコマンドの書き込み回数から、前記ステータス読出手段による当該コマンドの種類に対応するステータスの読み出し回数を差し引いた数を示すカウンタを記憶するカウンタ記憶手段を備え、前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に、当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグが有効を示し、且つ、当該ステータスに対応するコマンドの種類と対応付けて前記カウンタ記憶手段に記憶されているカウンタが１を示さない場合に、当該ステータスを廃棄する。
請求項４に係る発明は、請求項１乃至３のいずれか一項に記載の電子機器において、前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段とを備える。
【０００７】
請求項５に係る発明は、第１ＯＳを実行する第１制御手段と、第２ＯＳを実行する第２制御手段と、前記第２制御手段によって制御されるデバイスとを備え、前記第１制御手段は、前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段とを備えた電子機器を提供する。
請求項６に係る発明は、請求項４又は５に記載の電子機器において、前記コマンド再書込手段は、前記第２ＯＳの再起動後にｏｐｅｎコマンドに対応するステータスが前記ステータス読出手段によって読み出された場合に、当該ステータスに含まれるファイルディスクリプタを引数とするコマンドを前記記憶領域に書き込む。
請求項７に係る発明は、請求項１乃至６のいずれか一項に記載の電子機器において、前記デバイスは、画像データに基づいて画像を形成する。
【０００８】
請求項８に係る発明は、第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２の制御装置の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２の制御装置による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段とを備えた制御装置を提供する。
請求項９に係る発明は、第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２の制御装置の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２の制御装置による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段とを備えた制御装置を提供する。
【０００９】
請求項１０に係る発明は、コンピュータを、第１ＯＳ上で動作中のプロセスが呼び出した関数を、前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２のコンピュータの記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２のコンピュータによる実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段として機能させるためのプログラムを提供する。
請求項１１に係る発明は、コンピュータを、第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２のコンピュータの記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２のコンピュータによる実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持されたコマンドを前記記憶領域に書き込むコマンド再書込手段として機能させるためのプログラムを提供する。
【発明の効果】
【００１０】
請求項１、４、５、７、８、９、１０、１１に係る発明によれば、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐことができる。
請求項２に係る発明によれば、読み出されたステータスに対応するコマンドの種類毎にステータスを廃棄するか否かを判断することができる。
請求項３に係る発明によれば、プログラムの再起動を伴わないプロセッサの不具合がある場合であっても、プロセッサの誤動作を防ぐことができる。
請求項６に係る発明によれば、第２ＯＳの再起動後にファイルが特定できなくなることを防ぐことができる。
【図面の簡単な説明】
【００１１】
【図１】実施形態のハードウェア構成を示す図。
【図２】シングルプロセッサシステムの基本的なソフトウェア構成を示す図。
【図３】マルチプロセッサシステムの基本的なソフトウェア構成を示す図。
【図４】実施形態に係るマルチプロセッサシステムのソフトウェア構成を示す図。
【図５】コマンド２９のフォーマットを示す図。
【図６】ステータス３０のフォーマットを示す図。
【図７】テーブル５４を示す図。
【図８】ステータス廃棄機能の初期化処理の流れ図。
【図９】ｏｐｅｎメソッドにおけるステータス廃棄機能の処理の流れ図。
【図１０】ｗｒｉｔｅメソッドにおけるステータス廃棄機能の処理の流れ図。
【図１１】ｒｅａｄメソッドにおけるステータス廃棄機能の処理の流れ図。
【図１２】テーブル５７を示す図。
【図１３】テーブル５８を示す図。
【図１４】コマンド再書込機能の初期化処理の流れ図。
【図１５】ｗｒｉｔｅメソッドにおけるコマンド再書込機能の処理の流れ図。
【図１６】ｒｅａｄメソッドにおけるコマンド再書込機能の処理の流れ図。
【図１７】省電力モードに復帰した場合のｏｐｅｎコマンドの再書込処理の流れ図。
【図１８】省電力モードに復帰した場合の非同期コマンドの再書込処理の流れ図。
【発明を実施するための形態】
【００１２】
本実施形態は、２つのＣＰＵ（Central Processing Unit）を備えた、いわゆるマルチプロセッサシステムを基本構成とするが、ここで、シングルプロセッサシステムとマルチプロセッサシステムの基本的なソフトウェア構成について説明する。なお、以下の説明では、便宜上、ソフトウェアの構成要素を動作の主体とする。
【００１３】
図１は、シングルプロセッサシステムの基本的なソフトウェア構成を示す図である。ＯＳ（Operating System）１０には、デバイス（図示省略）を制御するドライバ７、８、９が備えられている。プロセス１、２、３は、アプリケーションプログラムを構成するプロセスである。プロセス１、２、３は、それぞれＡＰＩ（Application Programming Interface）４、５、６を介したシステムコール１１によってドライバ７、８、９を呼び出す。呼び出されたドライバ７、８、９は、システムコール１１の内容に応じた処理を実行し、それぞれの処理の実行結果を表す戻り値１２をＡＰＩ４、５、６を介してプロセス１、２、３に返す。
【００１４】
図２は、マルチプロセッサシステムの基本的なソフトウェア構成を示す図である。プロセス１、２、３は第１制御手段１００側で動作し、ドライバ７、８、９は第２制御手段２００側で動作するため、プロセス１、２、３は、第１ＯＳ２０の共有ライブラリを介してシステムコール１１を実行する。具体的には、ＡＰＩ１３、１４、１５で呼び出されるシステムコール１１をライブラリ１６、１７、１８で解釈される関数２７に予め対応付けておいてもよいし、あるいは、プロセス１、２、３が関数２７を直接呼び出すように構成されていてもよい。関数２７が呼び出されると、ライブラリ１６、１７、１８は、第２ＯＳ２３にこの関数２７の内容を渡すために、この関数２７を第１ＯＳ２０と第２ＯＳ２３とで共通に解釈されるコマンド２９に変換してＯＳ間通信ドライバ１９に渡す。ＯＳ間通信ドライバ１９は、このコマンド２９をＯＳ間通信によってＯＳ間通信ドライバ２２に送信する。ＯＳ間通信のインターフェースはいかなる方式でもよいが、本実施形態では、ＰＣＩ（Peripheral Component Interconnect）Ｅｘｐｒｅｓｓ（登録商標。以下、ＰＣＩｅと略す。）を用いた例を示す。
【００１５】
ＯＳ間通信ドライバ２２は、受信したコマンド２９をタスク２４、２５、２６に渡す。コマンド２９を受け取ったタスク２４、２５、２６は、コマンド２９を、それぞれドライバ７、８、９で解釈されるシステムコール１１に変換し、それぞれＡＰＩ４、５、６を介したシステムコール１１によってドライバ７、８、９を呼び出す。呼び出されたドライバ７、８、９は、システムコール１１の内容に応じた処理を実行し、それぞれの処理の実行結果を表す戻り値１２をＡＰＩ４、５、６を介してタスク２４、２５、２６に返す。
【００１６】
戻り値１２を受け取ったタスク２４、２５、２６は、第１ＯＳに戻り値１２の内容を渡すために、この戻り値１２を第１ＯＳ２０と第２ＯＳ２３とで共通に解釈されるステータス３０に変換してＯＳ間通信ドライバ２２に渡す。ＯＳ間通信ドライバ２２は、このステータス３０をＯＳ間通信によってＯＳ間通信ドライバ１９に送信する。ＯＳ間通信ドライバ１９は、受信したステータス３０をライブラリ１６、１７、１８に渡す。ステータス３０を受け取ったライブラリ１６、１７、１８は、それぞれステータス３０をプロセス１、２、３で解釈される戻り値２８に変換し、この戻り値２８をそれぞれＡＰＩ１３、１４、１５を介してプロセス１、２、３に返す。このようにして、シングルプロセッサシステムにおいてプロセス１、２、３がドライバ７、８、９を直接呼び出した場合と同じ処理結果が、マルチプロセッサシステムによって得られる。
【００１７】
次に、実施形態の構成について説明する。図３は、実施形態のハードウェア構成を示す図である。図４は、実施形態のソフトウェア構成を示す図である。画像形成装置１０００は、本発明に係る電子機器の一例である。画像形成装置１０００の主な構成要素は、第１制御手段１００、第２制御手段２００及びデバイス３００である。第１制御手段１００は、第２制御手段２００を制御する。第２制御手段２００は、デバイス３００を制御する。
【００１８】
第１制御手段１００は、ＣＰＵ１０１などの演算装置、ＲＡＭ（Random Access Memory）１０２やＲＯＭ（Read Only Memory）１０３などの記憶装置、通信Ｉ／Ｆ（Interface）１０４、ＨＤＤ（Hard Disk Drive）１０５などの外部記憶装置及びＬＡＮ（Local Area Network）端子１０６を備え、これらの構成要素はバス１１０に接続されている。ＣＰＵ１０１は、ＲＡＭ１０２をワークエリアとして、プログラムを実行する。ＲＯＭ１０３には、ブートローダなどが記憶されている。通信Ｉ／Ｆ１０４は、例えばＰＣＩｅのスロットであり、第２制御手段２００に備えられたＰＣＩｅのスロットである通信Ｉ／Ｆ２０４と信号線で接続される。ＨＤＤ１０５には、第１ＯＳ２０やアプリケーションプログラムなどが記憶されており、画像形成装置１０００に電源が投入されると、ＣＰＵ１０１がＲＯＭ１０３からブートローダを読み出し、ブートローダに記述されている手順に従ってＨＤＤ１０５から第１ＯＳ２０を読み出して実行する。第１ＯＳ２０は、例えばＬｉｎｕｘ（登録商標）である。ＬＡＮ端子１０６には信号線が接続され、ＣＰＵ１０１は、ＬＡＮ経由で外部の情報処理装置などと通信する。
【００１９】
第２制御手段２００は、ＣＰＵ２０１などの演算装置、ＲＡＭ２０２やＲＯＭ２０３などの記憶装置及び通信Ｉ／Ｆ２０４を備え、これらの構成要素はバス２１０に接続されている。ＣＰＵ２０１は、ＲＡＭ２０２をワークエリアとして、プログラムを実行する。ＲＯＭ２０３には、第２ＯＳ２３が記憶されており、ＣＰＵ２０１は、第１制御手段１００からの命令に従ってＲＯＭ２０３から第２ＯＳ２３を読み出して実行する。第２ＯＳ２３は、例えばＲＴＯＳ（Real Time OS）であり、デバイス３００を制御するドライバの機能を備える。
【００２０】
画像形成装置１０００は、１つ以上のデバイス３００を備える。デバイス３００は、例えばイメージスキャナ３０１、プリンタ３０２、ＵＩ（User Interface）３０３などである。なお、デバイスの数は、いくつでもよい。イメージスキャナ３０１は、例えば、光源、光学系、撮像素子など（図示省略）を備え、光源が原稿に光を照射し、原稿で反射された反射光が光学系を介して撮像素子に入射し、撮像素子が原稿の画像を表す信号を生成して出力する。プリンタ３０２は、例えば、画像データに基づくトナー像を形成するプリントエンジン、紙などの記録媒体を収容する収容部、記録媒体を搬送路に沿って搬送する搬送機構など（図示省略）を備え、第１制御手段１００から第２制御手段２００を介して供給された画像データに基づく画像を電子写真方式で記録媒体に印刷する。ＵＩ３０３は、例えば、タッチパネルやキーパッドなど（図示省略）を備え、ユーザによる操作を受け付ける。タッチパネルには、ユーザが画像形成装置１０００を操作するための仮想的な操作子や、画像形成装置１０００の状態を表す情報などが表示される。キーパッドは、画像形成装置１０００の動作の開始や停止を指示するためのキーや、数字を入力するためのテンキーなどを備える。
【００２１】
本実施形態では、ＯＳ間通信ドライバ１９とＯＳ間通信ドライバ２２とがコマンドバッファ５１及びステータスバッファ５２を介してコマンド２９及びステータス３０のやりとりを行う。コマンドバッファ５１及びステータスバッファ５２は、ＲＡＭ２０２の記憶領域を利用してもよいし、ＲＡＭ２０２とは別のメモリを第２制御手段２００に設けて、このメモリの記憶領域をコマンドバッファ５１及びステータスバッファ５２として用いてもよい。コマンドバッファ５１及びステータスバッファ５２は、例えばＦＩＦＯ（First In, First Out）方式のバッファであり、それぞれの記憶領域の状態を表すＦＵＬＬ／ＮＯＴ  ＦＵＬＬ／ＥＭＰＴＹ／ＮＯＴ  ＥＭＰＴＹ情報をインタラプト５０によってＯＳ間通信ドライバ１９及びＯＳ間通信ドライバ２２に通知する機能を有する。
【００２２】
一例として、プロセス１が以下に示す関数２７を呼び出す例について説明する。この例では、プロセス１がライブラリ１６の関数２７を直接呼び出すように構成されており、各関数の戻り値２８のエラーチェックは省略されている。
int param[4] = [0, 0, 0, 0] ;
fd = do_open(DRV_1, 0, 0);                        /* １番目の関数呼び出し */
status = do_ioctl(fd, DRV_1_READ_PARAM, &param);  /* ２番目の関数呼び出し */
status = do_close(fd) ;                           /* ３番目の関数呼び出し */
【００２３】
図５は、コマンド２９のフォーマットを示す図である。コマンド２９は、第１ＯＳ２０と第２ＯＳ２３とで共通に解釈される情報であり、コマンドヘッダ３１とコマンドデータ３２とを含む。プロセス１が関数２７を呼び出すと、関数２７に対応するライブラリ１６の処理ルーチンがコマンドデータ３２を生成する。コマンドデータ３２は、コマンドＩＤ（Identifier）３９とパラメータ４０とを含む可変長のデータである。処理ルーチンは、コマンド２９の種類を表す識別子をコマンドＩＤ３９に設定し、関数２７の引数をパラメータ４０に設定する。処理ルーチンは、このようにして生成したコマンドデータ３２をＯＳ間通信ドライバ１９に渡す。
【００２４】
ここで、上記の関数呼び出しの例で２番目に呼び出される関数であるdo_ioctl()の第３引数が記憶領域の論理アドレスを示すポインタになっているが、第１制御手段１００と第２制御手段２００とで論理アドレスが異なる場合、このポインタをそのまま第２制御手段２００に渡しても第２制御手段２００はそのポインタが指し示す記憶領域へアクセスすることができないため、処理ルーチンは、コマンドデータ３２の生成時に、ポインタの値ではなく、そのポインタが指し示す記憶領域（４Ｂｙｔｅ×４＝１６Ｂｙｔｅ）をパラメータ４０として設定する。上記の例では、ポインタが指し示す領域が０で初期化されているので、パラメータ４０に設定された記憶領域も０で初期化される。
【００２５】
コマンドデータ３２を受け取ったＯＳ間通信ドライバ１９は、ＯＳ間通信ドライバ２２とのＯＳ間通信に必須の情報であるコマンドヘッダ３１を生成する。コマンドヘッダ３１は、タスクＩＤ３５と通信路ＩＤ３６とコマンドＩＤ３７とコマンドサイズ３８とを含む。ＯＳ間通信ドライバ１９は、コマンドデータ３２の解釈を行う第２ＯＳ２３側のタスク２４の識別子をタスクＩＤ３５に設定し、ＯＳ間通信の通信路４７の識別子を通信路ＩＤ３６に設定し、コマンドデータ３２のコマンドＩＤ３９の設定値をコマンドＩＤ３７に設定し、コマンドデータ３２のサイズをコマンドサイズ３８に設定する。ＯＳ間通信ドライバ１９は、このようにして生成したコマンドヘッダ３１をコマンドデータ３２と結合することによってコマンド２９を生成し、生成したコマンド２９をＯＳ間通信によってコマンドバッファ５１に書き込む。そして、ＯＳ間通信ドライバ１９は、インタラプト５０によりＯＳ間通信ドライバ２２にＮＯＴ  ＥＭＰＴＹを通知する。
【００２６】
ＮＯＴ  ＥＭＰＴＹの通知を受けたＯＳ間通信ドライバ２２は、コマンドバッファ５１からコマンド２９を読み出し、コマンドヘッダ３１のタスクＩＤ３５によって、このコマンド２９を処理するタスクを判別する。この例では、タスク２４がコマンド２９を処理するタスクであるので、ＯＳ間通信ドライバ２２は、タスク２４にコマンド２９を渡す。ＯＳ間通信ドライバ２２は、コマンドバッファ５１が空になるまでコマンド２９をタスク２４に渡すことを繰り返し、コマンドバッファ５１が空になったならば、ＯＳ間通信ドライバ１９からＮＯＴ  ＥＭＰＴＹが通知されるのを待つ。
【００２７】
コマンド２９を受け取ったタスク２４は、コマンドデータ３２をドライバ７で解釈されるシステムコール１１に変換し、ＡＰＩ４を介してドライバ７を呼び出す。ここで、上記の関数呼び出しの例におけるdo_ioctl()に対応するパラメータ４０は、前述のとおり、論理アドレスを示すポインタではなく、そのポインタが指し示す記憶領域（４Ｂｙｔｅ×４＝１６Ｂｙｔｅ）であるから、タスク２４は、その記憶領域を第２制御手段２００のメモリ上で確保し、確保した記憶領域を初期化し、その記憶領域のポインタをシステムコール１１の第３引数として設定する。ドライバ７は、システムコール１１を実行し、実行の結果を表す戻り値１２をタスク２４に返す。タスク２４は、この戻り値１２に基づいて、ステータス３０を生成する。
【００２８】
図６は、ステータス３０のフォーマットを示す図である。ステータス３０は、第１ＯＳ２０と第２ＯＳ２３とで共通に解釈される情報であり、ステータスヘッダ３３とステータスデータ３４とを含む。ステータスデータ３４は、ステータスＩＤ４５とパラメータ４６とを含む可変長のデータである。タスク２４は、システムコール１１に対応するステータスの種類を示す識別子をステータスＩＤ４５に設定する。ここで、タスク２４は、ステータスＩＤ４５の最上位ビットを１にマスクすることによって当該ステータスＩＤ４５に対応するコマンドＩＤ３９が得られるように、ステータスＩＤ４５を設定する。タスク２４は、ドライバ７から受け取った戻り値１２をパラメータ４６に設定する。ここで、戻り値１２が正常終了を示す場合、上記の関数呼び出しの例における２番目の関数do_ioctl()に対応するシステムコール１１の第３引数に設定したポインタが指し示す記憶領域にデータが書き込まれているので、タスク２４は、戻り値１２に加えて、そのデータもパラメータ４６に設定する。
【００２９】
ステータスヘッダ３３は、タスクＩＤ４１と通信路ＩＤ４２とステータスＩＤ４３とステータスサイズ４４とを含む。タスク２４は、コマンド２９に設定されていたタスクＩＤ３５の設定値をタスクＩＤ４１に設定し、コマンド２９に設定されていた通信路ＩＤ３６の設定値を通信路ＩＤ４２に設定する。タスク２４は、ステータスデータ３４のステータスＩＤ４５の設定値をステータスＩＤ４３に設定し、ステータスデータ３４のサイズをステータスサイズ４４に設定する。タスク２４は、このようにして生成したステータス３０を、ＯＳ間通信ドライバ２２に渡す。ステータス３０を受け取ったＯＳ間通信ドライバ２２は、ステータス３０をステータスバッファ５２に書き込む。そして、ＯＳ間通信ドライバ２２は、インタラプト５０によりＯＳ間通信ドライバ１９にＮＯＴ  ＥＭＰＴＹを通知する。
【００３０】
ＮＯＴ  ＥＭＰＴＹの通知を受けたＯＳ間通信ドライバ１９は、ＯＳ間通信によりステータスバッファ５２からステータス３０を読み出し、ステータスヘッダ３３の通信路ＩＤ４２から、このステータスデータ３４を処理するライブラリを判別する。この例では、ライブラリ１６がステータスデータ３４を処理するので、ＯＳ間通信ドライバ１９は、ライブラリ１６にステータス３０を渡す。ＯＳ間通信ドライバ１９は、ステータスバッファ５２が空になるまで、ステータス３０をライブラリ１６に渡すことを繰り返し、ステータスバッファ５２が空になったならば、ＯＳ間通信ドライバ２２からＮＯＴ  ＥＭＰＴＹが通知されるのを待つ。
【００３１】
ステータス３０を受け取ったライブラリ１６は、ステータスデータ３４をプロセス１で解釈される戻り値２８に変換し、戻り値２８をプロセス１に返す。ここで、上記の関数呼び出しの例における２番目の関数do_ioctl()に対応するステータスデータ３４には、戻り値２８に変換される情報に加えてデータが設定されているので、ライブラリ１６は、do_ioctl()の第３引数で指定されたアドレスにそのデータを書き込む。
【００３２】
＜ステータス廃棄機能＞
次に、ステータス廃棄機能について説明する。コマンドバッファ５１へのコマンド２９の書き込み後にいずれかのプロセスが異常終了した場合に、以下のような問題が発生することがある。ここでは一例として、プロセス１が異常終了した場合について説明する。異常終了前にプロセス１が呼び出した関数２７は、ライブラリ１６によってコマンド２９に変換され、このコマンド２９がコマンドバッファ５１に書き込まれ、ＮＯＴ  ＥＭＰＴＹがＯＳ間通信ドライバ２２に通知される。その後、プロセス１が異常終了しても第２制御手段２００は動作を続けるから、コマンドバッファ５１から読み出されたコマンド２９がシステムコール１１に変換され、このシステムコール１１に従ってドライバ７が処理を実行し、その実行結果を表すステータス３０が生成されてステータスバッファ５２に書き込まれる。しかし、プロセス１が異常終了するとライブラリ１６による処理も終了するので、通信路４７に対するｒｅａｄメソッドは実行されずに、ステータス３０がステータスバッファ５２から読み出されないままとなる。
【００３３】
異常終了したプロセス１が再起動されると、プロセス１に対応するライブラリ１６が通信路４７に対するｏｐｅｎメソッドを実行し、再起動後の最初のコマンド２９が生成され、このコマンド２９がコマンドバッファ５１に書き込まれる。その後、このコマンド２９の実行結果を表すステータス３０がステータスバッファ５２に書き込まれ、ＯＳ間通信ドライバ１９にＮＯＴ  ＥＭＰＴＹが通知される。ところが、プロセス１の異常終了前にコマンドバッファ５１に書き込んだコマンド２９の実行結果を表すステータス３０がステータスバッファ５２に残っているから、このステータス３０がＯＳ間通信ドライバ１９によって読み出されると、コマンド２９とステータス３０との対応関係にずれが生じ、マルチプロセッサシステムが誤動作するおそれがある。そこで、本実施形態では、以下に示すステータス廃棄機能が第１ＯＳ２０に設けられている。ステータス廃棄機能を実現するステータス廃棄手段５３は、通信路毎にＯＳ間通信ドライバ１９に設けられており、ステータス廃棄手段５３による処理は、通信路毎に実行される。
【００３４】
図７は、テーブル５４を示す図である。ステータス廃棄手段５３は、通信路毎にテーブル５４を生成し、生成したテーブル５４をＲＡＭ１０２又はＨＤＤ１０５に記憶する。テーブル５４は、コマンドＩＤ５４１とフラグ５４２とカウンタ５４３とを対応付けたテーブルである。コマンドＩＤ５４１は、コマンド２９の種類を示す識別子であり、コマンドＩＤ３９、コマンドＩＤ３７と同じものである。この例では、コマンド２９はｎ種類であり、コマンドＩＤ５４１として１からｎまでの通し番号が割り当てられている。フラグ５４２は、コマンドＩＤ５４１毎に、当該コマンドＩＤ５４１に対応するコマンド２９の実行結果を示すステータス３０が有効か否かを示すフラグである。フラグ５４２がＯＮならば当該ステータス３０は有効であり、フラグ５４２がＯＦＦならば当該ステータス３０は無効である。フラグ５４２のＯＮとＯＦＦの切り替えについては、後述する。カウンタ５４３は、コマンドＩＤ５４１毎に、当該コマンドＩＤ５４１に対応するコマンド２９のコマンドバッファ５１への書き込み回数から、当該コマンドＩＤ５４１に対応するステータス３０のステータスバッファ５２からの読み出し回数を差し引いた数を表す。
【００３５】
図８は、ステータス廃棄機能の初期化処理の流れ図である。なお、ステータス廃棄手段５３はＯＳ間通信ドライバ１９に設けられているので、ステータス廃棄機能の初期化処理は、ＯＳ間通信ドライバ１９の初期化処理に含まれる。従って、第１ＯＳが起動される度にステータス廃棄機能の初期化処理が実行される。
ステップＳ１０１においては、ステータス廃棄手段５３が、ループカウンタ（初期値は０）に１を加算する。
ステップＳ１０２においては、ステータス廃棄手段５３が、ループカウンタの値に該当するコマンドＩＤ５４１に対応するフラグ５４２をＯＦＦで初期化するとともに、このコマンドＩＤ５４１に対応するカウンタ５４３を０で初期化する。
ステップＳ１０３においては、ステータス廃棄手段５３が、ループカウンタがｎに達したか否かを判定し、ループカウンタがｎに達していないならばステップＳ１０１に戻り、ｎに達したならば処理を終了する。
【００３６】
図９は、ＯＳ間通信ドライバ１９のｏｐｅｎメソッドにおけるステータス廃棄機能の処理の流れ図である。以下の処理は、通信路毎に実行されるが、ここでは、一例として、通信路４７の場合について説明する。
ステップＳ２０１においては、プロセス１がライブラリ１６を呼び出し、ライブラリ１６が通信路４７に対してｏｐｅｎメソッド処理を実行する。そして、ｏｐｅｎメソッド処理の戻り値として、通信路４７を示すファイルディスクリプタがライブラリ１６に返され、これ以降、処理の対象となる通信路４７は、このファイルディスクリプタによって特定される。
【００３７】
ステップＳ２０２においては、ステータス廃棄手段５３が、ループカウンタ（初期値は０）に１を加算する。
ステップＳ２０３においては、ステータス廃棄手段５３が、ループカウンタの値に該当するコマンドＩＤ５４１に対応するフラグ５４２をＯＦＦにする。
ステップＳ２０４においては、ステータス廃棄手段５３が、ループカウンタがｎに達したか否かを判定し、ループカウンタがｎに達していないならばステップＳ２０１に戻り、ｎに達したならば処理を終了する。
【００３８】
なお、図９に示す処理は、ステータス廃棄機能の初期化処理（図８）に続いて実行される場合と、異常終了したプロセス１が再起動されたのに続いて実行される場合とがある。前者の場合、図８の処理によってフラグ５４２がＯＦＦに初期化済みであるから、図９の処理を経てもフラグ５４２はＯＦＦのままである。これに対して、後者の場合、異常終了前にＯＮになっていたフラグが図９の処理によってＯＦＦに書き換えられる。
【００３９】
図１０は、ＯＳ間通信ドライバ１９のｗｒｉｔｅメソッドにおけるステータス廃棄機能の処理の流れ図である。
ステップＳ３０１においては、ライブラリ１６及びＯＳ間通信ドライバ１９がコマンド２９を生成する。具体的には、関数２７に対応するライブラリ１６の処理ルーチンがコマンドデータ３２を生成してＯＳ間通信ドライバ１９に渡す。コマンドデータ３２を受け取ったＯＳ間通信ドライバ１９は、コマンドヘッダ３１を生成し、生成したコマンドヘッダ３１をコマンドデータ３２と結合することによってコマンド２９を生成する。
【００４０】
ステップＳ３０２においては、ＯＳ間通信ドライバ１９が、生成したコマンド２９をＯＳ間通信によってコマンドバッファ５１に書き込む。
ステップＳ３０３においては、ステータス廃棄手段５３が、ステップＳ３０２におけるコマンド２９の書き込みが成功したか否かを判定し、書き込みが成功した場合（ステップＳ３０３：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ３０４に進み、書き込みが失敗した場合（ステップＳ３０３：ＮＯ）には、処理を終了する。
ステップＳ３０４においては、ステータス廃棄手段５３が、ステップＳ３０２でコマンドバッファ５１に書き込まれたコマンド２９に含まれるコマンドＩＤ５４１に対応するフラグ５４２をＯＮに書き換え、当該コマンドＩＤ５４１に対応するカウンタ５４３に１を加算して処理を終了する。
【００４１】
要するに、コマンドバッファ５１へのコマンド２９の書き込みが成功した場合には当該コマンド２９のコマンドＩＤ５４１に対応するフラグ５４２がＯＮに書き換えられるとともにカウンタ５４３に１が加算される。一方、コマンドバッファ５１へのコマンド２９の書き込みが失敗した場合には、当該コマンド２９のコマンドＩＤ５４１に対応するフラグ５４２はＯＦＦのままとなり、カウンタ５４３は加算されない。また、コマンドバッファ５１へのコマンド２９の書き込みが成功した後にプロセス１が異常終了を経て再起動された場合、異常終了前にＯＮになっていたフラグが図９の処理によってＯＦＦに書き換えられる。
【００４２】
図１１は、ＯＳ間通信ドライバ１９のｒｅａｄメソッドにおけるステータス廃棄機能の処理の流れ図である。
ステップＳ４０１においては、ステータス廃棄手段５３が、ＯＳ間通信によりステータスバッファ５２からステータス３０を読み出す。具体的には、ＯＳ間通信ドライバ２２からのＮＯＴ  ＥＭＰＴＹの通知を受け取るまでＯＳ間通信ドライバ１９が待機する。ＮＯＴ  ＥＭＰＴＹの通知を受け取ると、ＯＳ間通信ドライバ１９が、ＯＳ間通信によりステータスバッファ５２からステータス３０を読み出す。
ステップＳ４０２においては、ステータス廃棄手段５３が、ステップＳ４０１におけるステータス３０の読み出しが成功したか否かを判定し、読み出しが成功した場合（ステップＳ４０２：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０３に進み、読み出しが失敗した場合（ステップＳ４０２：ＮＯ）には、ステータス廃棄手段５３は処理を終了する。
【００４３】
ステップＳ４０３においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するフラグ５４２がＯＦＦか否かを判定する。ここで、ステータス３０に含まれるステータスＩＤ４５の最上位ビットを１にマスクすることによって当該ステータスＩＤ４５に対応するコマンドＩＤ５４１が得られる。当該コマンドＩＤ５４１に対応するフラグ５４２がＯＦＦでない場合（ステップＳ４０３：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４０４に進み、当該フラグ５４２がＯＦＦである場合（ステップＳ４０３：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０９に進む。
【００４４】
ステップＳ４０４においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が０か否かを判定する。当該カウンタ５４３が０でない場合（ステップＳ４０４：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４０５に進み、当該カウンタ５４３が０である場合（ステップＳ４０４：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０７に進む。
ステップＳ４０５においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３から１を減算する。
【００４５】
ステップＳ４０６においては、ステータス廃棄手段５３が、ステップＳ４０５で１を減算したカウンタ５４３の値が０か否かを判定する。カウンタ５４３の値が０でない場合（ステップＳ４０６：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４０７に進み、カウンタ５４３の値が０である場合（ステップＳ４０６：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０８に進む。
ステップＳ４０７においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０を廃棄する。
ステップＳ４０８においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換えて処理を終了する。
【００４６】
ステップＳ４０９においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が０か否かを判定する。カウンタ５４３が０でない場合（ステップＳ４０９：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４１０に進み、カウンタ５４３が０である場合（ステップＳ４０９：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４１１に進む。
ステップＳ４１０においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンドＩＤ５４１のカウンタ５４３から１を減算する。
ステップＳ４１１においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０を廃棄して処理を終了する。
【００４７】
ステップＳ４０３以降の処理を場合分けすると、次のとおりである。
（１）フラグがＯＮ、カウンタが１の場合（ステップＳ４０３：ＮＯ、ステップＳ４０４：ＮＯ、ステップＳ４０６：ＹＥＳ）
ステータスバッファ５２から読み出されたステータス３０が、コマンドバッファ５１に書き込んだコマンド２９の処理結果に対応していることになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄しない。当該ステータス３０は、ライブラリ１６によって戻り値２８に変換され、プロセス１に返される。また、当該ステータス３０がステータスバッファ５２から読み出されたため、ステータス廃棄手段５３は、当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３から１を減算する（ステップＳ４０５）。また、当該ステータス３０に対応するコマンド２９が処理済みであることになるから、ステータス廃棄手段５３は、当該コマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換える（ステップＳ４０８）。
【００４８】
（２）フラグがＯＮ、カウンタが０でも１でもない場合（ステップＳ４０３：ＮＯ、ステップＳ４０４：ＮＯ、ステップＳ４０５：ＮＯ）
ステータスバッファ５２から読み出したステータス３０が、コマンドバッファ５１に書き込んだコマンド２９の処理結果に対応していないことになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄する（ステップＳ４０７）。また、ステータス３０がステータスバッファ５２から読み出されたため、ステータス廃棄手段５３は、当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３から１を減算する（ステップＳ４０５）。また、当該ステータス３０に対応するコマンド２９は処理済みであることになるから、ステータス廃棄手段５３は、当該コマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換える（ステップＳ４０８）。なお、カウンタが０でも１でもないことから、この場合はマルチプロセッサシステムに何らかの不具合があることになる。
【００４９】
（３）フラグがＯＮ、カウンタが０の場合（ステップＳ４０３：ＮＯ、ステップＳ４０４：ＹＥＳ）
ステータスバッファ５２から読み出したステータス３０が、コマンドバッファ５１に書き込んだコマンド２９の処理結果に対応していないことになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄する（ステップＳ４０７）。当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が０であるため、当該カウンタ５４３の減算は行わない。また、当該ステータス３０に対応するコマンド２９は処理済みであることになるから、ステータス廃棄手段５３は、当該コマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換える（ステップＳ４０８）。なお、カウンタが０であることから、この場合はマルチプロセッサシステムに何らかの不具合があることになる。
【００５０】
（４）フラグがＯＦＦ、カウンタが０でない場合（ステップＳ４０３：ＹＥＳ、ステップＳ４０９：ＮＯ）
異常終了したプロセス１が再起動された場合、図９に示す処理により、すべてのコマンドＩＤに対応するフラグがＯＦＦに書き換えられる。つまり、ステップＳ４０３でフラグ５４２がＯＦＦであるということは、このフラグ５４２のコマンドＩＤ５４１に対応するコマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了を経て再起動されたことを意味する。従って、ステータス廃棄手段５３は、カウンタ５４３から１を減算し（ステップＳ４１０）、ステータスバッファから読み出したステータス３０を廃棄する（ステップＳ４１１）。
【００５１】
（５）フラグがＯＦＦ、カウンタが０の場合（ステップＳ４０３：ＹＥＳ、ステップＳ４０９：ＹＥＳ）
この場合も、（４）と同様に、プロセス１が異常終了を経て再起動されたことになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄する（ステップＳ４１１）。ただし、カウンタ５４３が０であるため、カウンタ５４３の減算は行わない。なお、カウンタが０であることから、この場合はマルチプロセッサシステムに何らかの不具合があることになる。
【００５２】
（１）から（５）を分類すると、（１）は、コマンド２９のコマンドバッファ５１への書き込み後、ステータス３０を読み出すまでの間にプロセス１の異常終了やマルチプロセッサシステムの不具合などが発生しなかった場合である。これに対して、（２）と（３）は、マルチプロセッサシステムに何等かの不具合がある場合であり、（４）と（５）は、コマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了し、その後、プロセス１が再起動された場合である。（１）の場合には、ステータス３０は廃棄されずに戻り値２８に変換されてプロセス１に返されるが、それ以外の場合には、ステータス３０が廃棄される。
【００５３】
本実施形態によれば、コマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了を経て再起動された場合に、異常終了前にコマンドバッファ５１に書き込んだコマンド２９の実行結果を表すステータス３０が廃棄されるから、異常終了したプロセス１の再起動後にコマンド２９とステータス３０との対応関係にずれが生じない。また、本実施形態によれば、マルチプロセッサに何らかの不具合がある場合に、読み出されたステータス３０が廃棄されるから、コマンド２９とステータス３０との対応関係にずれが生じない。
【００５４】
＜コマンド再書込機能＞
次に、コマンド再書込機能について説明する。画像形成装置１０００は、通常モード又は省電力モードで動作する。通常モードにおいては、画像形成の指示が入力され次第、画像形成が開始される。通常モードにおいて継続して画像形成の指示が入力されない時間の長さが閾値に達すると、画像形成装置１０００は省電力モードに遷移し、第２制御手段２００及びデバイス３００への電力供給が止められ、第２制御手段２００で動作していた第２ＯＳ２３（ＲＴＯＳ）が強制終了される。省電力モードから通常モードへの復帰が指示されると、第２制御手段２００及びデバイス３００への電力供給が再開され、第２ＯＳ２３が再起動され、第２制御手段２００及びデバイス３００の初期化が行なわれる。初期化が完了すると、画像形成の指示に応じて画像形成が行われる。
【００５５】
ここで、省電力モードに遷移した場合、第２ＯＳが強制終了されるため、通信路４７へのファイルディスクリプタの割り当てが失われる。従って、通常モードに復帰した場合には、ｏｐｅｎコマンドの再実行が必要となるが、プロセス１は、通信路４７へのファイルディスクリプタの割り当てが失われたことを認識していないため、ｏｐｅｎコマンドを実行せずに関数２７を呼び出してしまう。また、省電力モードでは、ドライバ７で処理待ちのシステムコール１１も消失してしまうため、ｏｐｅｎコマンドだけでなく、ｉｏｃｔｌコマンド（非同期コマンド）の再実行も必要となる。そこで、本実施形態では、以下に示すコマンド再書込機能が第１ＯＳ２０に設けられている。コマンド再書込機能を実現するコマンド再書込手段５６は、通信路毎にＯＳ間通信ドライバ１９に設けられており、コマンド再書込手段５６による処理は、通信路毎に実行される。なお、非同期コマンドと同期コマンドの違いについては後述する。
【００５６】
図１２は、テーブル５７を示す図である。コマンド再書込手段５６は、通信路毎にテーブル５７を生成し、生成したテーブル５７をＲＡＭ１０２又はＨＤＤ１０５に記憶する。テーブル５７は、コマンドＩＤ５７１と、フラグ５７２と、カウンタ５７３と、書込済みコマンド保持領域へのポインタ５７４とを対応付けたテーブルである。コマンドＩＤ５７１、フラグ５７２、カウンタ５７３は、ステータス廃棄機能のテーブル５４におけるコマンドＩＤ５４１、フラグ５４２、カウンタ５４３と同じものである。ＯＳ間通信ドライバ１９は、コマンドバッファ５１に書き込んだコマンド２９の複製をＲＡＭ１０２等の記憶領域に書き込む。この記憶領域を、書込済みコマンド保持領域といい、この記憶領域の論理アドレスを示すポインタが、書込済みコマンド保持領域へのポインタ５７４である。
【００５７】
図１３は、テーブル５８を示す図である。コマンド再書込手段５６は、通信路毎にテーブル５８を生成し、生成したテーブル５８をＲＡＭ１０２又はＨＤＤ１０５に記憶する。テーブル５８は、仮想ｆｄ５８１と、実ｆｄ５８２と、書込済みｏｐｅｎコマンド保持領域へのポインタ５８３とを対応付けたテーブルである。仮想ｆｄ５８１は、ｏｐｅｎコマンドで開かれたファイルに対して第１制御手段１００が割り当てる仮想的なファイルディスクリプタである。実ｆｄ５８２は、当該ファイルに対して第２制御手段２００が割り当てるファイルディスクリプタである。ＯＳ間通信ドライバ１９は、コマンドバッファ５１に書き込んだｏｐｅｎコマンドの複製をＲＡＭ１０２等の記憶領域に書き込む。この記憶領域を、書込済みｏｐｅｎコマンド保持領域といい、この記憶領域の論理アドレスを示すポインタが、書込済みｏｐｅｎコマンド保持領域へのポインタ５８３である。
【００５８】
図１４は、コマンド再書込機能の初期化処理の流れ図である。なお、コマンド再書込手段５６はＯＳ間通信ドライバ１９に設けられているので、コマンド再書込機能の初期化処理は、ＯＳ間通信ドライバ１９の初期化処理に含まれる。従って、第１ＯＳが起動される度にコマンド再書込機能の初期化処理が実行される。
ステップＳ５０１においては、コマンド再書込手段５６が、前述のステップＳ１０１からステップＳ１０３と同様の手順により、テーブル５７のフラグ５７２をＯＦＦで初期化し、カウンタ５７３を０で初期化する。
【００５９】
ステップＳ５０２においては、コマンド再書込手段５６が、ループカウンタ（初期値は０）に１を加算する。
ステップＳ５０３においては、コマンド再書込手段５６が、ループカウンタの値に該当するコマンドＩＤ５７１に対応する書込済みコマンド保持領域へのポインタ５７４をＮＵＬＬで初期化する。
ステップＳ５０４においては、コマンド再書込手段５６が、ループカウンタがｎに達したか否かを判定し、ループカウンタがｎに達していないならばステップＳ５０２に戻り、ｎに達したならばステップＳ５０５の処理に進む。
ステップＳ５０５においては、コマンド再書込手段５６が、書込済みｏｐｅｎコマンド保持領域へのポインタ５８３をＮＵＬＬで初期化する。
ステップＳ５０６においては、コマンド再書込手段５６が、仮想ｆｄ５８１を正の値ｘで初期化し、実ｆｄ５８２を−１で初期化する。
【００６０】
図１５は、ＯＳ間通信ドライバ１９のｗｒｉｔｅメソッドにおけるコマンド再書込機能の処理の流れ図である。以下の処理は、通信路毎に実行されるが、ここでは、一例として、通信路４７の場合について説明する。
ステップＳ６０１においては、コマンド再書込手段５６が、前述のステップＳ３０１からステップＳ３０４と同様の手順で処理を実行する。すなわち、コマンド再書込手段５６は、コマンド２９の生成、及び、当該コマンド２９のコマンドバッファ５１への書き込みを行い、当該コマンド２９の書き込みが成功した場合には、当該コマンド２９に含まれるコマンドＩＤ５７１に対応するフラグ５７２をＯＮに書き換え、当該コマンドＩＤ５７１に対応するカウンタ５７３に１を加算して処理を終了する。ここで、コマンド再書込手段５６は、仮想ｆｄ５８１を実ｆｄ５８２に変換する。第２制御手段２００が再起動された場合、再起動後にｏｐｅｎコマンドで通信路４７に割り当てられるファイルディスクリプタが再起動前のファイルディスクリプタと異なる場合があり、その場合、再起動前のファイルディスクリプタを用いると第１制御手段１００が誤った通信路を特定するからである。なお、当該コマンド２９がｏｐｅｎコマンドである場合、このコマンド２９の実行結果としてのファイルディスクリプタは、後述するｒｅａｄメソッドによるステータス３０の読み出しによって取得されるため、この段階における仮想ｆｄ５８１の実ｆｄ５８２への変換は意味を持たない。
【００６１】
ステップＳ６０２においては、コマンド再書込手段５６が、ステップＳ６０１で生成・書き込みされたコマンド２９がｏｐｅｎコマンドであるか否かをコマンドＩＤ５７１によって判定し、ｏｐｅｎコマンドである場合（ステップＳ６０２：ＹＥＳ）には、ステップＳ６０３の処理に進み、ｏｐｅｎコマンドでない場合（ステップＳ６０２：ＮＯ）には、ステップＳ６０４の処理に進む。
ステップＳ６０３においては、コマンド再書込手段５６が、当該コマンド２９（ｏｐｅｎコマンド）の保持領域を確保し、この保持領域に当該コマンド２９の複製を書き込み、この保持領域の論理アドレスを書込済みｏｐｅｎコマンド保持領域へのポインタ５８３に設定する。
【００６２】
ステップＳ６０４においては、コマンド再書込手段５６が、ステップＳ６０１で生成・書き込みされたコマンド２９が非同期コマンドであるか否かを判定する。コマンド再書込手段５６は、コマンド２９の種類と同期コマンド／非同期コマンドの区別との対応関係を記憶しており、この対応関係に基づいて当該コマンド２９の判定を行う。当該コマンド２９が非同期コマンドである場合（ステップＳ６０４：ＹＥＳ）には、コマンド再書込手段の処理はステップＳ６０５に進み、非同期コマンドでない場合（ステップＳ６０４：ＮＯ）には、処理を終了する。
【００６３】
ここで、同期コマンドと非同期コマンドとの違いについて説明する。同期コマンドの場合、プロセス１は、呼び出した関数２７に対する戻り値２８が返されるまで次の関数２７の呼び出しを行わない。また、戻り値２８が返されるまでは通常モードから省電力モードへの切り替えは行われない。これに対して、非同期コマンドの場合、プロセス１は、呼び出した関数２７に対する戻り値２８が返されるのを待たずに別の関数２７を呼び出すことが許容される。また、戻り値２８が返されるのを待たずに通常モードから省電力モードへの切り替えが行われることがあり得る。
【００６４】
ステップＳ６０５においては、コマンド再書込手段５６が、当該コマンド２９（非同期コマンド）の保持領域を確保し、この保持領域に当該コマンド２９の複製を書き込み、この保持領域の論理アドレスを、当該コマンド２９のコマンドＩＤ５７１に対応する書込済みコマンド保持領域へのポインタ５７４に設定する。
【００６５】
要するに、ステップＳ６０１で生成・書き込みされたコマンド２９がｏｐｅｎコマンドである場合には、当該コマンド２９が書込済みｏｐｅｎコマンド保持領域に保持され、当該コマンド２９が非同期コマンドである場合には、当該コマンド２９が書込済みコマンド保持領域に保持され、当該コマンド２９がｏｐｅｎコマンドでも非同期コマンドでもない場合には、当該コマンド２９は書込済みｏｐｅｎコマンド保持領域にも書込済みコマンド保持領域にも保持されない。
【００６６】
図１６は、ＯＳ間通信ドライバ１９のｒｅａｄメソッドにおけるコマンド再書込機能の処理の流れ図である。
ステップＳ７０１においては、コマンド再書込手段５６が、前述のステップＳ４０１からステップＳ４１１と同様の手順で処理を実行する。すなわち、コマンド再書込手段５６は、ＯＳ間通信ドライバ２２からＮＯＴ  ＥＭＰＴＹの通知を受け取ると、ステータスバッファ５２からステータス３０を読み出し、ステータス３０の読み出しが成功したならば、当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応付けられたフラグ５４２とカウンタ５４３とに基づいて、当該ステータス３０の廃棄、フラグ５４２の書き換え、カウンタ５４３の減算などの処理を行う。
【００６７】
ステップＳ７０２においては、コマンド再書込手段５６が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９がｃｌｏｓｅコマンドか否かを判定する。ここで、ステータス３０に含まれるステータスＩＤ４５の最上位ビットを１にマスクすることによって当該ステータスＩＤ４５に対応するコマンドＩＤが得られるので、コマンド再書込手段５６は、このコマンドＩＤに基づいてコマンドの種類を特定する。コマンド再書込手段５６は、読み出したステータス３０に対応するコマンド２９がｃｌｏｓｅコマンドである場合（ステップＳ７０２：ＹＥＳ）には、ステップＳ７０３の処理に進み、ｃｌｏｓｅコマンドでない場合（ステップＳ７０２：ＮＯ）には、ステップＳ７０５の処理に進む。
【００６８】
ｃｌｏｓｅコマンドに対応するステータス３０が読み出されたということは、その後、省電力モードに遷移したとしても、省電力モードからの復帰時にｏｐｅｎコマンドを再実行する必要がないことを意味する。従って、ステップＳ７０３においては、コマンド再書込手段５６が、書込済みｏｐｅｎコマンド保持領域を解放し、書込済みｏｐｅｎコマンド保持領域へのポインタ５７４にＮＵＬＬを設定する。つまり、ｏｐｅｎコマンドは書込済みｏｐｅｎコマンド保持領域から削除される。
ステップＳ７０４においては、コマンド再書込手段５６が、実ｆｄ５８２に−１を設定する。
【００６９】
ステップＳ７０５においては、コマンド再書込手段５６が、当該ステータス３０に対応するコマンド２９が非同期コマンドであるか否かを判定し、非同期コマンドである場合（ステップＳ７０５：ＹＥＳ）には、ステップＳ７０６の処理に進み、非同期コマンドでない場合（ステップＳ７０５：ＮＯ）には、ステップＳ７０７の処理に進む。
【００７０】
非同期コマンドに対応するステータス３０が読み出されたということは、その後、省電力モードに遷移したとしても、省電力モードからの復帰時にこの非同期コマンドを再実行する必要がないことを意味する。従って、ステップＳ７０６においては、コマンド再書込手段５６が、当該コマンド２９が書き込まれている書込済みコマンド保持領域を解放し、当該コマンド２９のコマンドＩＤ５７１に対応する書込済みコマンド保持領域へのポインタ５７４にＮＵＬＬを設定する。つまり、当該コマンド２９は書込済みコマンド保持領域から削除される。
【００７１】
ステップＳ７０７においては、コマンド再書込手段５６が、当該ステータス３０に対応するコマンド２９がｏｐｅｎコマンドであり、且つ、当該ステータス３０のパラメータ４６に含まれるファイルディスクリプタが０以上であるか否かを判定する。当該コマンド２９がｏｐｅｎコマンドであり、且つ、ファイルディスクリプタが０以上である場合（ステップＳ７０７：ＹＥＳ）には、コマンド再書込手段５６の処理はステップＳ７０８に進む。ここで、ｏｐｅｎコマンドに対応するステータス３０が読み出されたということは、その後、省電力モードに遷移した場合に、省電力モードからの復帰時にこのｏｐｅｎコマンドを再実行する必要があることを意味する。従って、コマンド再書込手段５６は、書込済みｏｐｅｎコマンド保持領域からｏｐｅｎコマンドを削除しない。
【００７２】
ステップＳ７０８においては、コマンド再書込手段５６が、ステータス３０のパラメータ４６に含まれるファイルディスクリプタを実ｆｄ５８２に設定する。つまり、通信路４７に対して第２制御手段２００が割り当てたファイルディスクリプタが、実ｆｄ５８２に設定される。
ステップＳ７０９においては、コマンド再書込手段５６が、ステータス３０のパラメータ４６に含まれるファイルディスクリプタを仮想ｆｄ５８１に変換する。この変換により、プロセス１には、戻り値として仮想ｆｄ５８１が返される。
なお、この後、図１５に示すｗｒｉｔｅメソッドが実行された場合、コマンド再書込手段５６は、前述のとおり、仮想ｆｄ５８１を実ｆｄ５８２に変換する。つまり、次回のｗｒｉｔｅメソッドにおいては、実ｆｄ５８２を引数とするコマンド２９が生成される。
【００７３】
図１７は、省電力モードに復帰した場合のｏｐｅｎコマンドの再書込処理の流れ図である。
ステップＳ８０１においては、コマンド再書込手段５６が、テーブル５８の書込済みｏｐｅｎコマンドの保持領域へのポインタ５８３がＮＵＬＬか否かを判定する。ＮＵＬＬでない場合（ステップＳ８０１：ＮＯ）には、コマンド再書込手段５６はステップＳ８０２の処理に進み、ＮＵＬＬである場合（ステップＳ８０１：ＹＥＳ）には、処理を終了する。
【００７４】
書込済みｏｐｅｎコマンドの保持領域へのポインタ５８３がＮＵＬＬであるということは、省電力モードからの復帰に伴って図１４の処理により当該ポインタがＮＵＬＬに初期化されたことを意味し、ｏｐｅｎコマンドの再書き込みが必要となる。従って、ステップＳ８０２においては、コマンド再書込手段５６が、コマンド２９（ｏｐｅｎコマンド）をコマンドバッファ５１に書き込む。
ステップＳ８０３においては、コマンド再書込手段５６が、ステータス３０を廃棄する。ｏｐｅｎコマンドの再書込においては、図１０に示す通常の書き込みの場合と違って、コマンドのコマンドバッファへの書き込みが成功した場合にカウンタに１を加算せず、ステータス３０から実ｆｄ５８２を取り出した後、このステータス３０を廃棄し、テーブル５８の書込済みｏｐｅｎコマンドの保持領域へのポインタ５８３はそのまま維持する。
【００７５】
図１８は、省電力モードに復帰した場合の非同期コマンドの再書込処理の流れ図である。
ステップＳ９０１においては、コマンド再書込手段５６が、テーブル５７の書込済みコマンドの保持領域へのポインタ５７４がＮＵＬＬか否かを判定する。ＮＵＬＬでない場合（ステップＳ９０１：ＮＯ）には、コマンド再書込手段５６はステップＳ９０２の処理に進み、ＮＵＬＬである場合（ステップＳ９０１：ＹＥＳ）には、処理を終了する。
書込済みコマンドの保持領域へのポインタ５７４がＮＵＬＬであるということは、省電力モードからの復帰に伴って図１４の処理により当該ポインタがＮＵＬＬに初期化されたことを意味し、当該コマンドの再書き込みが必要となる。従って、ステップＳ９０２においては、コマンド再書込手段５６が、コマンド２９（非同期コマンド）をコマンドバッファ５１に書き込む。非同期コマンドの再書込においては、テーブル５７の非同期コマンドに対応するカウンタ５７３は既に１になっているので、書込済みコマンド保持領域へのポインタ５７４はそのまま維持する。
【００７６】
本実施形態によれば、コマンド２９のコマンドバッファ５１への書き込み後に省電力モードへの遷移と通常モードへの復帰が行われた場合に、省電力モードへの遷移前にコマンドバッファ５１に書き込んだコマンド２９がコマンドバッファ５１に再書込される。従って、省電力モードへの遷移によって消失したシステムコールが、通常モードへの復帰後に再実行される。
【００７７】
（変形例）
（変形例１）
実施形態では、デバイス３００としてイメージスキャナ３０１、プリンタ３０２、ＵＩ３０３を備えた画像形成装置１０００に本発明を適用した例を示したが、デバイス３００はいかなるものでもよい。また、デバイス３００の数はいくつでもよい。
実施形態では、第１ＯＳ２０の例としてＬｉｎｕｘ（登録商標）、第２ＯＳの例としてＲＴＯＳを示したが、第１ＯＳ２０、第２ＯＳ２３は、これら以外のＯＳでもよい。
実施形態では、画像形成装置１０００が第１制御手段１００と第２制御手段２００とデバイス３００とを備えた例を示したが、第１制御手段１００の機能を備えた制御装置と、第２制御手段２００及びデバイス３００の機能を備えた画像形成装置とを通信手段で接続することにより、実施形態と同様の機能を実現するようにしてもよい。また、第１制御手段１００の機能を実現するためのプログラムを、光記録媒体、半導体メモリ等、コンピュータで読み取り可能な記録媒体に記録して提供してもよい。また、このプログラムを電気通信回線経由で提供してもよい。
【００７８】
（変形例２）
複数の非同期コマンドの間で実行の順序が定められている場合には、非同期コマンドに対応するステータス３０を受信した後に次の非同期コマンドを書き込むようにしてもよい。この場合、テーブル５７に非同期コマンドの実行の順序を示すフィールドを追加し、この順序に従って非同期コマンドをコマンドバッファ５１に書き込むようにしてもよい。
【符号の説明】
【００７９】
１、２、３…プロセス、４、５、６…ＡＰＩ、７、８、９…ドライバ、１１…システムコール、１２…戻り値、１３、１４、１５…ＡＰＩ、１６、１７、１８…ライブラリ、１９…ＯＳ間通信ドライバ、２０…第１ＯＳ、２１…ＰＣＩｅ、２２…ＯＳ間通信ドライバ、２３…第２ＯＳ、２４、２５、２６…タスク、２７…関数、２８…戻り値、２９…コマンド、３０…ステータス、４７、４８、４９…通信路、５０…インタラプト、５１…コマンドバッファ、５２…ステータスバッファ、５３…ステータス廃棄手段、５４…テーブル、５６…コマンド再書込手段、５７、５８…テーブル、１０００…画像形成装置、１００…第１制御手段、１０１…ＣＰＵ、１０２…ＲＡＭ、１０３…ＲＯＭ、１０４…通信Ｉ／Ｆ、１０５…ＨＤＤ、１０６…ＬＡＮ端子、１１０…バス、２００…第２制御手段、２０１…ＣＰＵ、２０２…ＲＡＭ、２０３…ＲＯＭ、２０４…通信Ｉ／Ｆ、バス…２１０、３００…デバイス、３０１…イメージスキャナ、３０２…プリンタ、３０３…ＵＩ
【図１】
2015005097.tif 000003
【図２】
2015005097.tif 000004
【図３】
2015005097.tif 000005
【図４】
2015005097.tif 000006
【図５】
2015005097.tif 000007
【図６】
2015005097.tif 000008
【図７】
2015005097.tif 000009
【図８】
2015005097.tif 000010
【図９】
2015005097.tif 000011
【図１０】
2015005097.tif 000012
【図１１】
2015005097.tif 000013
【図１２】
2015005097.tif 000014
【図１３】
2015005097.tif 000015
【図１４】
2015005097.tif 000016
【図１５】
2015005097.tif 000017
【図１６】
2015005097.tif 000018
【図１７】
2015005097.tif 000019
【図１８】
2015005097.tif 000020