(57)【特許請求の範囲】
【請求項１】
第１ＯＳ（Operating System）を実行する第１制御手段と、
第２ＯＳを実行する第２制御手段と、
前記第２制御手段によって制御される複数のデバイスと
を備え、
前記第１制御手段は、
前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合、通信路毎に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合、通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア、及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットするリセット手段と、
を備えた電子機器。
【請求項２】
前記リセット手段は、前記第２ＯＳのシステムコールを前記第２制御手段が実行している場合、実行中の前記第２ＯＳのシステムコールを中断させた後、通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットする請求項１に記載の電子機器。
【請求項３】
前記リセット手段は、前記第１制御手段で動作する前記第１ＯＳのソフトウエアであり、通信路毎に設けられ、リセットコマンドを発行することで当該システムコールを実行している前記第２制御手段で動作するソフトウエア及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットする請求項１又は２に記載の電子機器。
【請求項４】
第１ＯＳ（Operating System）を実行する第１制御手段と、
第２ＯＳを実行する第２制御手段と、
前記第２制御手段によって制御される複数のデバイスと
を備え、
前記第１制御手段は、
前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア、及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットするリセット手段と、
前記リセットされた通信路について、前記第２制御手段によって実行されていた前記第２ＯＳのシステムコールに対応するコマンドを前記第２制御手段の記憶領域に再度書き込むコマンド再書込手段と、
を備えた電子機器。
【請求項５】
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２制御手段が実行する第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合、通信路毎に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合、通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア、及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットするリセット手段と、
を備えた制御装置。
【請求項６】
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２制御手段が実行する第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア、及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットするリセット手段と、
前記リセットされた通信路について、前記第２制御手段によって実行されていた前記第２ＯＳのシステムコールに対応するコマンドを前記第２制御手段の記憶領域に再度書き込むコマンド再書込手段と、
を備えた制御装置。
【請求項７】
コンピュータを、
第１制御手段が実行する第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２制御手段が実行する第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合、通信路毎に、前記ステータス読出手段によって読み出されたステータスを廃棄するステータス廃棄手段と、
前記コマンド書込手段による前記コマンドの書き込み後に前記プロセスが再起動された場合、通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア、及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットするリセット手段として機能させるためのプログラム。
【請求項８】
コンピュータを、
第１制御手段が実行する第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２制御手段が実行する第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出されたステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、
通信路毎に、当該システムコールを実行している前記第２制御手段で動作するソフトウエア、及び当該システムコールによって呼び出されたドライバによって制御されているデバイスをリセットするリセット手段と、
前記リセットされた通信路について、前記第２制御手段によって実行されていた前記第２ＯＳのシステムコールに対応するコマンドを前記第２制御手段の記憶領域に再度書き込むコマンド再書込手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電子機器、制御装置及びプログラムに関する。
【背景技術】
【０００２】
特許文献１に記載されたマルチプロセッサシステムの第１のプロセッサは、第１のＯＳで動作中のプロセス１が呼び出した関数を第１のＯＳと第２のＯＳとで共通に解釈されるコマンドに変換して、第２のプロセッサのコマンドバッファ５１に書き込む。また、第１のプロセッサは、書き込まれたコマンドに対応する第２のＯＳのシステムコールの第２のプロセッサによる実行の結果を示すステータスをコマンドバッファから読み出し、当該ステータスをプロセス１が解釈する戻り値に変換してプロセス１に返す。第１のプロセッサは、コマンドのコマンドバッファへの書き込み後にプロセス１が再起動された場合に、読み出されたステータスを廃棄することでコマンドとステータスとの対応関係にずれが生じるのを防ぐ。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１５−５０９７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
本発明は、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を抑制する電子機器、制御装置及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００５】
［１］第１ＯＳ（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()の第３引数で指定されたアドレスにそのデータを書き込む。
【００２８】
＜ステータス廃棄機能＞
次に、ステータス廃棄機能について説明する。コマンドバッファ５１へのコマンド２９の書き込み後にいずれかのプロセスが異常終了した場合に、以下のような問題が発生することがある。ここでは一例として、プロセス１が異常終了した場合について説明する。異常終了前にプロセス１が呼び出した関数２７は、ライブラリ１６によってコマンド２９に変換され、このコマンド２９がコマンドバッファ５１に書き込まれ、ＮＯＴ  ＥＭＰＴＹがＯＳ間通信ドライバ２２に通知される。その後、プロセス１が異常終了しても第２制御手段２００は動作を続けるから、コマンドバッファ５１から読み出されたコマンド２９がシステムコール１１に変換され、このシステムコール１１に従ってドライバ７が処理を実行し、その実行結果を表すステータス３０が生成されてステータスバッファ５２に書き込まれる。しかし、プロセス１が異常終了するとライブラリ１６による処理も終了するので、通信路４７に対するｒｅａｄメソッドは実行されずに、ステータス３０がステータスバッファ５２から読み出されないままとなる。
【００２９】
異常終了したプロセス１が再起動されると、プロセス１に対応するライブラリ１６が通信路４７に対するｏｐｅｎメソッドを実行し、再起動後の最初のコマンド２９が生成され、このコマンド２９がコマンドバッファ５１に書き込まれる。その後、このコマンド２９の実行結果を表すステータス３０がステータスバッファ５２に書き込まれ、ＯＳ間通信ドライバ１９にＮＯＴ  ＥＭＰＴＹが通知される。ところが、プロセス１の異常終了前にコマンドバッファ５１に書き込んだコマンド２９の実行結果を表すステータス３０がステータスバッファ５２に残っているから、このステータス３０がＯＳ間通信ドライバ１９によって読み出されると、コマンド２９とステータス３０との対応関係にずれが生じ、マルチプロセッサシステムが誤動作するおそれがある。そこで、本実施形態では、以下に示すステータス廃棄機能が第１ＯＳ２０に設けられている。ステータス廃棄機能を実現するステータス廃棄手段５３は、通信路毎にＯＳ間通信ドライバ１９に設けられており、ステータス廃棄手段５３による処理は、通信路毎に実行される。
【００３０】
図７は、テーブル５４を示す図である。ステータス廃棄手段５３は、通信路毎にテーブル５４を生成し、生成したテーブル５４をＲＡＭ１０２又はＨＤＤ１０５に記憶する。テーブル５４は、コマンドＩＤ５４１とフラグ５４２とカウンタ５４３とを対応付けたテーブルである。コマンドＩＤ５４１は、コマンド２９の種類を示す識別子であり、コマンドＩＤ３９、コマンドＩＤ３７と同じものである。この例では、コマンド２９はｎ種類であり、コマンドＩＤ５４１として１からｎまでの通し番号が割り当てられている。フラグ５４２は、コマンドＩＤ５４１毎に、当該コマンドＩＤ５４１に対応するコマンド２９の実行結果を示すステータス３０が有効か否かを示すフラグである。フラグ５４２がＯＮならば当該ステータス３０は有効であり、フラグ５４２がＯＦＦならば当該ステータス３０は無効である。フラグ５４２のＯＮとＯＦＦの切り替えについては、後述する。カウンタ５４３は、コマンドＩＤ５４１毎に、当該コマンドＩＤ５４１に対応するコマンド２９のコマンドバッファ５１への書き込み回数から、当該コマンドＩＤ５４１に対応するステータス３０のステータスバッファ５２からの読み出し回数を差し引いた数を表す。
【００３１】
図８は、ステータス廃棄機能の初期化処理の流れ図である。なお、ステータス廃棄手段５３はＯＳ間通信ドライバ１９に設けられているので、ステータス廃棄機能の初期化処理は、ＯＳ間通信ドライバ１９の初期化処理に含まれる。従って、第１ＯＳが起動される度にステータス廃棄機能の初期化処理が実行される。
ステップＳ１０１においては、ステータス廃棄手段５３が、ループカウンタ（初期値は０）に１を加算する。
ステップＳ１０２においては、ステータス廃棄手段５３が、ループカウンタの値に該当するコマンドＩＤ５４１に対応するフラグ５４２をＯＦＦで初期化するとともに、このコマンドＩＤ５４１に対応するカウンタ５４３を０で初期化する。
ステップＳ１０３においては、ステータス廃棄手段５３が、ループカウンタがｎに達したか否かを判定し、ループカウンタがｎに達していないならばステップＳ１０１に戻り、ｎに達したならば処理を終了する。
【００３２】
図９は、ＯＳ間通信ドライバ１９のｏｐｅｎメソッドにおけるステータス廃棄機能の処理の流れ図である。以下の処理は、通信路毎に実行されるが、ここでは、一例として、通信路４７の場合について説明する。
ステップＳ２０１においては、プロセス１がライブラリ１６を呼び出し、ライブラリ１６が通信路４７に対してｏｐｅｎメソッド処理を実行する。そして、ｏｐｅｎメソッド処理の戻り値として、通信路４７を示すファイルディスクリプタがライブラリ１６に返され、これ以降、処理の対象となる通信路４７は、このファイルディスクリプタによって特定される。
【００３３】
ステップＳ２０２においては、ステータス廃棄手段５３が、ループカウンタ（初期値は０）に１を加算する。
ステップＳ２０３においては、ステータス廃棄手段５３が、ループカウンタの値に該当するコマンドＩＤ５４１に対応するフラグ５４２をＯＦＦにする。
ステップＳ２０４においては、ステータス廃棄手段５３が、ループカウンタがｎに達したか否かを判定し、ループカウンタがｎに達していないならばステップＳ２０１に戻り、ｎに達したならば処理を終了する。
【００３４】
なお、図９に示す処理は、ステータス廃棄機能の初期化処理（図８）に続いて実行される場合と、異常終了したプロセス１が再起動されたのに続いて実行される場合とがある。前者の場合、図８の処理によってフラグ５４２がＯＦＦに初期化済みであるから、図９の処理を経てもフラグ５４２はＯＦＦのままである。これに対して、後者の場合、異常終了前にＯＮになっていたフラグが図９の処理によってＯＦＦに書き換えられる。
【００３５】
図１０は、ＯＳ間通信ドライバ１９のｗｒｉｔｅメソッドにおけるステータス廃棄機能の処理の流れ図である。
ステップＳ３０１においては、ライブラリ１６及びＯＳ間通信ドライバ１９がコマンド２９を生成する。具体的には、関数２７に対応するライブラリ１６の処理ルーチンがコマンドデータ３２を生成してＯＳ間通信ドライバ１９に渡す。コマンドデータ３２を受け取ったＯＳ間通信ドライバ１９は、コマンドヘッダ３１を生成し、生成したコマンドヘッダ３１をコマンドデータ３２と結合することによってコマンド２９を生成する。
【００３６】
ステップＳ３０２においては、ＯＳ間通信ドライバ１９が、生成したコマンド２９をＯＳ間通信によってコマンドバッファ５１に書き込む。
ステップＳ３０３においては、ステータス廃棄手段５３が、ステップＳ３０２におけるコマンド２９の書き込みが成功したか否かを判定し、書き込みが成功した場合（ステップＳ３０３：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ３０４に進み、書き込みが失敗した場合（ステップＳ３０３：ＮＯ）には、処理を終了する。
ステップＳ３０４においては、ステータス廃棄手段５３が、ステップＳ３０２でコマンドバッファ５１に書き込まれたコマンド２９に含まれるコマンドＩＤ５４１に対応するフラグ５４２をＯＮに書き換え、当該コマンドＩＤ５４１に対応するカウンタ５４３に１を加算して処理を終了する。
【００３７】
要するに、コマンドバッファ５１へのコマンド２９の書き込みが成功した場合には当該コマンド２９のコマンドＩＤ５４１に対応するフラグ５４２がＯＮに書き換えられるとともにカウンタ５４３に１が加算される。一方、コマンドバッファ５１へのコマンド２９の書き込みが失敗した場合には、当該コマンド２９のコマンドＩＤ５４１に対応するフラグ５４２はＯＦＦのままとなり、カウンタ５４３は加算されない。また、コマンドバッファ５１へのコマンド２９の書き込みが成功した後にプロセス１が異常終了を経て再起動された場合、異常終了前にＯＮになっていたフラグが図９の処理によってＯＦＦに書き換えられる。
【００３８】
図１１は、ＯＳ間通信ドライバ１９のｒｅａｄメソッドにおけるステータス廃棄機能の処理の流れ図である。
ステップＳ４０１においては、ステータス廃棄手段５３が、ＯＳ間通信によりステータスバッファ５２からステータス３０を読み出す。具体的には、ＯＳ間通信ドライバ２２からのＮＯＴ  ＥＭＰＴＹの通知を受け取るまでＯＳ間通信ドライバ１９が待機する。ＮＯＴ  ＥＭＰＴＹの通知を受け取ると、ＯＳ間通信ドライバ１９が、ＯＳ間通信によりステータスバッファ５２からステータス３０を読み出す。
ステップＳ４０２においては、ステータス廃棄手段５３が、ステップＳ４０１におけるステータス３０の読み出しが成功したか否かを判定し、読み出しが成功した場合（ステップＳ４０２：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０３に進み、読み出しが失敗した場合（ステップＳ４０２：ＮＯ）には、ステータス廃棄手段５３は処理を終了する。
【００３９】
ステップＳ４０３においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するフラグ５４２がＯＦＦか否かを判定する。ここで、ステータス３０に含まれるステータスＩＤ４５の最上位ビットを１にマスクすることによって当該ステータスＩＤ４５に対応するコマンドＩＤ５４１が得られる。当該コマンドＩＤ５４１に対応するフラグ５４２がＯＦＦでない場合（ステップＳ４０３：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４０４に進み、当該フラグ５４２がＯＦＦである場合（ステップＳ４０３：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０９に進む。
【００４０】
ステップＳ４０４においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が０か否かを判定する。当該カウンタ５４３が０でない場合（ステップＳ４０４：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４０５に進み、当該カウンタ５４３が０である場合（ステップＳ４０４：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０７に進む。
ステップＳ４０５においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３から１を減算する。
【００４１】
ステップＳ４０６においては、ステータス廃棄手段５３が、ステップＳ４０５で１を減算したカウンタ５４３の値が０か否かを判定する。カウンタ５４３の値が０でない場合（ステップＳ４０６：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４０７に進み、カウンタ５４３の値が０である場合（ステップＳ４０６：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４０８に進む。
ステップＳ４０７においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０を廃棄する。
ステップＳ４０８においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換えて処理を終了する。
【００４２】
ステップＳ４０９においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が０か否かを判定する。カウンタ５４３が０でない場合（ステップＳ４０９：ＮＯ）には、ステータス廃棄手段５３の処理はステップＳ４１０に進み、カウンタ５４３が０である場合（ステップＳ４０９：ＹＥＳ）には、ステータス廃棄手段５３の処理はステップＳ４１１に進む。
ステップＳ４１０においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０に対応するコマンドＩＤ５４１のカウンタ５４３から１を減算する。
ステップＳ４１１においては、ステータス廃棄手段５３が、ステップＳ４０１で読み出したステータス３０を廃棄して処理を終了する。
【００４３】
ステップＳ４０３以降の処理を場合分けすると、次のとおりである。
（１）フラグがＯＮ、カウンタが１の場合（ステップＳ４０３：ＮＯ、ステップＳ４０４：ＮＯ、ステップＳ４０６：ＹＥＳ）
ステータスバッファ５２から読み出されたステータス３０が、コマンドバッファ５１に書き込んだコマンド２９の処理結果に対応していることになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄しない。当該ステータス３０は、ライブラリ１６によって戻り値２８に変換され、プロセス１に返される。また、当該ステータス３０がステータスバッファ５２から読み出されたため、ステータス廃棄手段５３は、当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３から１を減算する（ステップＳ４０５）。また、当該ステータス３０に対応するコマンド２９が処理済みであることになるから、ステータス廃棄手段５３は、当該コマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換える（ステップＳ４０８）。
【００４４】
（２）フラグがＯＮ、カウンタが０でも１でもない場合（ステップＳ４０３：ＮＯ、ステップＳ４０４：ＮＯ、ステップＳ４０５：ＮＯ）
ステータスバッファ５２から読み出したステータス３０が、コマンドバッファ５１に書き込んだコマンド２９の処理結果に対応していないことになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄する（ステップＳ４０７）。また、ステータス３０がステータスバッファ５２から読み出されたため、ステータス廃棄手段５３は、当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３から１を減算する（ステップＳ４０５）。また、当該ステータス３０に対応するコマンド２９は処理済みであることになるから、ステータス廃棄手段５３は、当該コマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換える（ステップＳ４０８）。なお、カウンタが０でも１でもないことから、この場合はマルチプロセッサシステムに何らかの不具合があることになる。
【００４５】
（３）フラグがＯＮ、カウンタが０の場合（ステップＳ４０３：ＮＯ、ステップＳ４０４：ＹＥＳ）
ステータスバッファ５２から読み出したステータス３０が、コマンドバッファ５１に書き込んだコマンド２９の処理結果に対応していないことになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄する（ステップＳ４０７）。当該ステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が０であるため、当該カウンタ５４３の減算は行わない。また、当該ステータス３０に対応するコマンド２９は処理済みであることになるから、ステータス廃棄手段５３は、当該コマンドＩＤ５４１に対応するフラグ５４２をＯＦＦに書き換える（ステップＳ４０８）。なお、カウンタが０であることから、この場合はマルチプロセッサシステムに何らかの不具合があることになる。
【００４６】
（４）フラグがＯＦＦ、カウンタが０でない場合（ステップＳ４０３：ＹＥＳ、ステップＳ４０９：ＮＯ）
異常終了したプロセス１が再起動された場合、図９に示す処理により、すべてのコマンドＩＤに対応するフラグがＯＦＦに書き換えられる。つまり、ステップＳ４０３でフラグ５４２がＯＦＦであるということは、このフラグ５４２のコマンドＩＤ５４１に対応するコマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了を経て再起動されたことを意味する。従って、ステータス廃棄手段５３は、カウンタ５４３から１を減算し（ステップＳ４１０）、ステータスバッファから読み出したステータス３０を廃棄する（ステップＳ４１１）。
【００４７】
（５）フラグがＯＦＦ、カウンタが０の場合（ステップＳ４０３：ＹＥＳ、ステップＳ４０９：ＹＥＳ）
この場合も、（４）と同様に、プロセス１が異常終了を経て再起動されたことになるから、ステータス廃棄手段５３は、読み出したステータス３０を廃棄する（ステップＳ４１１）。ただし、カウンタ５４３が０であるため、カウンタ５４３の減算は行わない。なお、カウンタが０であることから、この場合はマルチプロセッサシステムに何らかの不具合があることになる。
【００４８】
（１）から（５）を分類すると、（１）は、コマンド２９のコマンドバッファ５１への書き込み後、ステータス３０を読み出すまでの間にプロセス１の異常終了やマルチプロセッサシステムの不具合などが発生しなかった場合である。これに対して、（２）と（３）は、マルチプロセッサシステムに何等かの不具合がある場合であり、（４）と（５）は、コマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了し、その後、プロセス１が再起動された場合である。（１）の場合には、ステータス３０は廃棄されずに戻り値２８に変換されてプロセス１に返されるが、それ以外の場合には、ステータス３０が廃棄される。
【００４９】
上記（４）、（５）の場合、タスク２４、ドライバ７又はドライバ７が制御するデバイスの状態と、プロセス１の状態とが整合しない可能性があるため、第１制御手段１００のアプリケーションプログラムの通信路毎に用意されたリセット機能５７は、タスク２４、ドライバ７及びドライバ７が制御するデバイスを再起動するべく、図１２に示すリセット動作を行う。なお、リセット機能５７は、タスク２４、ドライバ７及びドライバ７を再起動するコマンドを発行する。
【００５０】
図１２は、リセット動作を示すフローチャートである。
【００５１】
ステップＳ５０１において、リセット機能５７が、ループカウンタ（初期値は０）に１を加算する。
ステップＳ５０２においては、リセット機能５７が、図１１のステップＳ４０１でステータス廃棄手段５３が読み出したステータス３０に対応するコマンド２９のコマンドＩＤ５４１に対応するカウンタ５４３が１か否かを判定する。当該カウンタ５４３が１である場合（ステップＳ５０２：ＹＥＳ）には、当該コマンドＩＤのコマンドは処理中であり、リセット機能５７の処理はステップＳ５０３に進み、当該カウンタ５４３が１でない場合（ステップＳ５０２：ＮＯ）には、当該コマンドＩＤのコマンドは処理中でないためステップＳ５０３を実行せずに、リセット機能５７の処理はステップＳ５０４に進む。
ステップＳ５０３において、リセット機能５７は、処理中であると特定されたコマンドに対しＡｂｏｒｔコマンドを発行する。
ステップＳ５０４においては、リセット機能５７が、ループカウンタがｎに達したか否かを判定し、ループカウンタがｎに達していないならばステップＳ５０１に戻り、ｎに達したならば処理を終了する。
【００５２】
ステップＳ５０３において発行されたＡｂｏｒｔコマンドは、ＯＳ間通信によってコマンドバッファ５１に書き込まれる。そして、ＯＳ間通信ドライバ１９は、インタラプト５０によりＯＳ間通信ドライバ２２にＮＯＴ  ＥＭＰＴＹを通知する。
【００５３】
ＮＯＴ  ＥＭＰＴＹの通知を受けたＯＳ間通信ドライバ２２は、コマンドバッファ５１からＡｂｏｒｔコマンドであるコマンド２９を読み出し、コマンドヘッダ３１のタスクＩＤ３５によって、タスク２４にコマンド２９を渡す。
【００５４】
Ａｂｏｒｔコマンドであるコマンド２９を受け取ったタスク２４は、処理中のコマンドを中止する。
【００５５】
次に、ステップＳ５０５において、第２ＯＳ２３は、第２制御手段２００において実行されているソフトウエアのうちＡｂｒｏｔコマンドを受け取った通信路のタスク２４に該当するソフトウエア（アプリケーション）をリセットする。
【００５６】
次に、ステップＳ５０６において、第２ＯＳ２３は、第２制御手段２００において実行されているドライバのうちＡｂｒｏｔコマンドを受け取った通信路のドライバ７及びドライバ７に制御されるデバイスをリセットする。
【００５７】
本実施形態によれば、コマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了を経て再起動された場合に、異常終了前にコマンドバッファ５１に書き込んだコマンド２９の実行結果を表すステータス３０が廃棄されるとともに、コマンド２９を処理中のタスク２４及びドライバ７が制御するデバイスがリセットされるから、異常終了したプロセス１だけでなく、タスク２４及びドライバ７を含めた通信路並びにドライバ７に制御されるデバイスをリセットすることができ、さらに他の通信路及び当該通信路のドライバに制御されるデバイスはリセットすることなく動作させることができる。
【００５８】
コマンド２９のコマンドバッファ５１への書き込み後にプロセス１が異常終了を経て再起動された場合に、異常終了前にコマンドバッファ５１に書き込んだコマンド２９の実行結果を表すステータス３０が廃棄されるから、異常終了したプロセス１の再起動後にコマンド２９とステータス３０との対応関係にずれが生じない。また、本実施形態によれば、マルチプロセッサに何らかの不具合がある場合に、読み出されたステータス３０が廃棄されるから、コマンド２９とステータス３０との対応関係にずれが生じない。
【００５９】
なお、プロセス１が異常終了しない場合であっても、上記リセット機能を適用してもよい。例えば、タスク２４、ドライバ７又はドライバ７が制御するデバイスに異常が生じた場合、リセット機能５７を上記と同様に実行し、異常が生じたために処理が完了しなかったコマンド２９を改めてコマンドバッファ５１に書き込むようにしてもよい。
【００６０】
つまり、タスク２４、ドライバ７又はドライバ７が制御するデバイスに異常が生じた場合に、リセット機能５７を実行すると、通信路４７へのファイルディスクリプタの割り当てが失われる。従って、リセット機能５７を実行した場合には、ｏｐｅｎコマンドの再実行が必要となるが、プロセス１は、通信路４７へのファイルディスクリプタの割り当てが失われたことを認識していないため、ｏｐｅｎコマンドを実行せずに関数２７を呼び出してしまう。また、リセット機能５７の実行により、ドライバ７で処理待ちのシステムコール１１も消失してしまうため、ｏｐｅｎコマンドだけでなく、ｉｏｃｔｌコマンド（非同期コマンド）の再実行も必要となる。そこで、コマンド再書込機能が第１ＯＳ２０に設けられている。コマンド再書込機能を実現するコマンド再書込手段５６は、通信路毎にＯＳ間通信ドライバ１９に設けられており、コマンド再書込手段５６による処理は、通信路毎に実行される。
【００６１】
具体的には、コマンドバッファ５１に生成・書き込みされたコマンド２９がｏｐｅｎコマンドである場合には、当該コマンド２９が書込済みｏｐｅｎコマンド保持領域に保持され、当該コマンド２９が非同期コマンドである場合には、当該コマンド２９が書込済みコマンド保持領域に保持され、当該コマンド２９がｏｐｅｎコマンドでも非同期コマンドでもない場合には、当該コマンド２９は書込済みｏｐｅｎコマンド保持領域にも書込済みコマンド保持領域にも保持されないようにする。
【００６２】
なお、ここで、同期コマンドと非同期コマンドとの違いについて説明する。同期コマンドの場合、プロセス１は、呼び出した関数２７に対する戻り値２８が返されるまで次の関数２７の呼び出しを行わない。また、戻り値２８が返されるまでは通常モードから省電力モードへの切り替えは行われない。これに対して、非同期コマンドの場合、プロセス１は、呼び出した関数２７に対する戻り値２８が返されるのを待たずに別の関数２７を呼び出すことが許容される。
【００６３】
そして、コマンド２９のコマンドバッファ５１への書き込み後にリセット機能５７が実行された場合に、書込済みｏｐｅｎコマンド保持領域に保持されたコマンド２９がコマンドバッファ５１に再書込される。従って、リセット機能５７の実行によって消失したシステムコールが、リセット後に再実行される。
【００６４】
（変形例）
実施形態では、デバイス３００としてイメージスキャナ３０１、プリンタ３０２、ＵＩ３０３を備えた画像形成装置１０００に本発明を適用した例を示したが、デバイス３００はいかなるものでもよい。また、デバイス３００の数はいくつでもよい。
実施形態では、第１ＯＳ２０の例としてＬｉｎｕｘ（登録商標）、第２ＯＳの例としてＲＴＯＳを示したが、第１ＯＳ２０、第２ＯＳ２３は、これら以外のＯＳでもよい。
実施形態では、画像形成装置１０００が第１制御手段１００と第２制御手段２００とデバイス３００とを備えた例を示したが、第１制御手段１００の機能を備えた制御装置と、第２制御手段２００及びデバイス３００の機能を備えた画像形成装置とを通信手段で接続することにより、実施形態と同様の機能を実現するようにしてもよい。また、第１制御手段１００の機能を実現するためのプログラムを、光記録媒体、半導体メモリ等、コンピュータで読み取り可能な記録媒体に記録して提供してもよい。また、このプログラムを電気通信回線経由で提供してもよい。
【符号の説明】
【００６５】
１−３ プロセス
７−９ ドライバ
１１   システムコール
１２   戻り値
１６   ライブラリ
１９   ＯＳ間通信ドライバ
２０   第１ＯＳ
２２   ＯＳ間通信ドライバ
２３   第２ＯＳ
２４   タスク
２７   関数
２８   戻り値
２９   コマンド
３０   ステータス
３１   コマンドヘッダ
３２   コマンドデータ
３３   ステータスヘッダ
３４   ステータスデータ
３８   コマンドサイズ
４０   パラメータ
４４   ステータスサイズ
４６   パラメータ
４７−４９    通信路
５０   インタラプト
５１   コマンドバッファ
５２   ステータスバッファ
５３   ステータス廃棄手段
５４   テーブル
５６   コマンド再書込手段
５７   リセット機能
１００ 第１制御手段
１０６ ＬＡＮ端子
１１０ バス
２００ 第２制御手段
２１０ バス
３００ デバイス
３０１ イメージスキャナ
３０２ プリンタ
１０００      画像形成装置
【図１】
0006413813.tif 000002
【図２】
0006413813.tif 000003
【図３】
0006413813.tif 000004
【図４】
0006413813.tif 000005
【図５】
0006413813.tif 000006
【図６】
0006413813.tif 000007
【図７】
0006413813.tif 000008
【図８】
0006413813.tif 000009
【図９】
0006413813.tif 000010
【図１０】
0006413813.tif 000011
【図１１】
0006413813.tif 000012
【図１２】
0006413813.tif 000013