(57)【要約】【課題】関数を呼び出したスレッドを識別できる情報を付加して、関数からコマンドに変換できる電子機器を提供する。【解決手段】プロセス内には複数のスレッドが実行されており、関数は、そのスレッドが呼び出しており、第１変換手段は、関数が多重実行可能である場合、スレッドを識別するスレッド識別情報を付加したコマンドに変換し、ステータス読出手段は、ステータスとともにスレッド識別情報を読み出し、第２変換手段は、ステータス読出手段によって読み出されたスレッド識別情報にしたがって、ステータスをスレッドが解釈する戻り値に変換する。【選択図】図４
2019028557.tif 000002
【特許請求の範囲】
【請求項１】
第１ＯＳによる制御を実行する第１制御手段と、
第２ＯＳによる制御を実行する第２制御手段と、
前記第２制御手段によって制御されるデバイスと
を備え、
前記第１制御手段は、
前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段
を備え、
前記プロセス内には複数のスレッドが実行されており、前記関数は、該スレッドが呼び出しており、
前記第１変換手段は、前記関数が多重実行可能である場合、前記スレッドを識別するスレッド識別情報を付加したコマンドに変換し、
前記ステータス読出手段は、前記ステータスとともにスレッド識別情報を読み出し、
前記第２変換手段は、前記ステータス読出手段によって読み出された前記スレッド識別情報にしたがって、ステータスを前記スレッドが解釈する戻り値に変換する、
電子機器。
【請求項２】
前記第１変換手段は、前記関数に前記スレッド識別情報が付加されている場合は、該スレッド識別情報を付加したコマンドに変換する、
請求項１に記載の電子機器。
【請求項３】
前記第１変換手段は、前記関数に前記スレッド識別情報が付加されていない場合は、スレッド識別情報を生成し、生成したスレッド識別情報を付加したコマンドに変換する、
請求項１に記載の電子機器。
【請求項４】
前記第１変換手段は、前記関数が多重実行可能でない場合は、該関数を呼び出したスレッドにエラーを返信する、
請求項１に記載の電子機器。
【請求項５】
前記第１変換手段は、前記関数に前記スレッド識別情報が付加されている場合であって、前記関数が多重実行可能でないときは、スレッド識別情報を無効化し、該関数を呼び出したスレッドにエラーを返信する、
請求項４に記載の電子機器。
【請求項６】
前記第１変換手段は、前記関数に前記スレッド識別情報が付加されていない場合であって、前記関数が多重実行可能でないときは、該関数を呼び出したスレッドにエラーを返信する、
請求項４に記載の電子機器。
【請求項７】
前記コマンド書込手段による前記コマンドの書き込み後、前記ステータス読出手段によって前記ステータスが読み出される前に前記プロセスが再起動された場合に、前記プロセスの再起動後に前記ステータス読出手段によって読み出された前記ステータスを廃棄するステータス廃棄手段
をさらに備えた請求項１から６のいずれか一項に記載の電子機器。
【請求項８】
前記コマンドが前記記憶領域に書き込まれた場合にＯＮを示し、前記プロセスが再起動された場合にＯＦＦを示すフラグを、前記コマンドの種類毎に記憶するフラグ記憶手段を備え、
前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグがＯＦＦを示す場合に、当該ステータスを廃棄する、
請求項７に記載の電子機器。
【請求項９】
コマンドの種類毎に、前記コマンド書込手段によるコマンドの書き込み回数から、前記ステータス読出手段による当該コマンドの種類に対応するステータスの読み出し回数を差し引いた数を示すカウンタを記憶するカウンタ記憶手段を備え、
前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に、当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグが有効を示し、かつ、当該ステータスに対応するコマンドの種類と対応付けて前記カウンタ記憶手段に記憶されているカウンタが１を示さない場合に、当該ステータスを廃棄する、
請求項８に記載の電子機器。
【請求項１０】
前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、
前記コマンド書込手段による前記コマンドの書き込み後、当該コマンドに対応する前記第２ＯＳのシステムコールが前記第２制御手段によって実行される前に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持された前記コマンドを前記記憶領域に書き込むコマンド再書込手段
をさらに備えた請求項７から９のいずれか一項に記載の電子機器。
【請求項１１】
前記コマンド再書込手段は、前記第２ＯＳの再起動後にｏｐｅｎコマンドに対応するステータスが前記ステータス読出手段によって読み出された場合に、当該ステータスに含まれるファイルディスクリプタを引数とするコマンドを前記記憶領域に書き込む、
請求項９又は１０に記載の電子機器。
【請求項１２】
前記デバイスは、画像データに基づいて画像を形成する、
請求項１から１１のいずれか一項に記載の電子機器。
【請求項１３】
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２の制御装置の記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２の制御装置による実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段
を備え、
前記プロセス内には複数のスレッドが実行されており、前記関数は、該スレッドが呼び出しており、
前記第１変換手段は、前記関数が多重実行可能である場合、前記スレッドを識別するスレッド識別情報を付加したコマンドに変換し、
前記ステータス読出手段は、前記ステータスとともにスレッド識別情報を読み出し、
前記第２変換手段は、前記ステータス読出手段によって読み出された前記スレッド識別情報にしたがって、ステータスを前記スレッドが解釈する戻り値に変換する、
制御装置。
【請求項１４】
コンピュータを、
第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、
前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２のコンピュータの記憶領域に書き込むコマンド書込手段と、
前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２のコンピュータによる実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、
前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段
として機能させ、
前記プロセス内には複数のスレッドが実行されており、前記関数は、該スレッドが呼び出しており、
前記第１変換手段は、前記関数が多重実行可能である場合、前記スレッドを識別するスレッド識別情報を付加したコマンドに変換し、
前記ステータス読出手段は、前記ステータスとともにスレッド識別情報を読み出し、
前記第２変換手段は、前記ステータス読出手段によって読み出された前記スレッド識別情報にしたがって、ステータスを前記スレッドが解釈する戻り値に変換する、
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電子機器、制御装置及びプログラムに関する。
【背景技術】
【０００２】
特許文献１には、新たな命令及びデータ伝達方式の追加をしたり、どちらかのプロセッサが別な物理的制限を持つプロセッサに変更された場合にも、柔軟に対処し得るマルチプロセッサ制御方式を提供することを課題とし、第１のプロセッサを持つ処理装置に対し、第２のプロセッサを持つ処理装置が接続されたマルチプロセッサシステムにおいて、第１のプロセッサの内部表記とシステムの標準表記との変換をする第１の変換手段を有し、かつ第２のプロセッサに対して、実行プログラム名と手続名とデータ部を含みかつそのデータ部を前記実行プログラム及び手続の種類に応じて可変長とした内部表記の要求情報を第１の変換手段で標準表記に変換して送出し、応答の種類に応じて可変長とした標準表記の応答情報を受取り第１の変換手段で内部表記に変換する第１の処理手段と、前記第１の処理手段からの標準表記に変換された可変長の要求情報を保持する要求情報バッファと、応答の種類により可変長とした標準表記の応答情報を保持する応答情報バッファと、第１の処理手段からの要求情報により起動され、要求情報バッファから要求情報を取り出す要求取り出し手段と、第２のプロセッサの内部表記とシステムの標準表記との変換をする第２の変換手段を有し、かつ、要求情報バッファから取り出した要求情報を解析して、要求情報で指定された実行プログラムを第２のプロセッサで実行させると共に、その実行の結果を応答の種類に応じて可変長とした内部表記の応答情報を作成し、その応答情報を第２の変換手段で内部表記から標準表記へ変換して保持する第２の処理手段と、第２の処理手段の実行完了により起動され、第２の処理手段から応答情報を取り出し前記応答情報バッファへ送る応答送り出し手段とを備えたことが開示されている。
【０００３】
特許文献２には、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐことを課題とし、第１ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）を実行する第１制御手段と、第２ＯＳを実行する第２制御手段と、前記第２制御手段によって制御されるデバイスとを備え、前記第１制御手段は、前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段と、前記コマンド書込手段による前記コマンドの書き込み後、前記ステータス読出手段によって前記ステータスが読み出される前に前記プロセスが再起動された場合に、前記プロセスの再起動後に前記ステータス読出手段によって読み出された前記ステータスを廃棄するステータス廃棄手段とを備えたことが開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第２９７６５７６号公報
【特許文献２】特開２０１５−００５０９７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
複数のＯＳを制御して、異なる関数をそれぞれ異なるデバイスで同時に実行させるマルチプロセッサ制御技術がある。このマルチプロセッサ制御技術では、１種類の関数を複数の異なるデバイスで同時に実行させることは考慮されていないため、コマンドの元となる関数を呼び出したスレッドを識別できない。
本発明は、関数を呼び出したスレッドを識別できる情報を付加して、関数からコマンドに変換できる電子機器、制御装置及びプログラムを提供することを目的としている。
【課題を解決するための手段】
【０００６】
かかる目的を達成するための本発明の要旨とするところは、次の各項の発明に存する。
請求項１の発明は、第１ＯＳによる制御を実行する第１制御手段と、第２ＯＳによる制御を実行する第２制御手段と、前記第２制御手段によって制御されるデバイスとを備え、前記第１制御手段は、前記第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと前記第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを前記第２制御手段の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２制御手段による実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段を備え、前記プロセス内には複数のスレッドが実行されており、前記関数は、該スレッドが呼び出しており、前記第１変換手段は、前記関数が多重実行可能である場合、前記スレッドを識別するスレッド識別情報を付加したコマンドに変換し、前記ステータス読出手段は、前記ステータスとともにスレッド識別情報を読み出し、前記第２変換手段は、前記ステータス読出手段によって読み出された前記スレッド識別情報にしたがって、ステータスを前記スレッドが解釈する戻り値に変換する、電子機器である。
【０００７】
請求項２の発明は、前記第１変換手段は、前記関数に前記スレッド識別情報が付加されている場合は、該スレッド識別情報を付加したコマンドに変換する、請求項１に記載の電子機器である。
【０００８】
請求項３の発明は、前記第１変換手段は、前記関数に前記スレッド識別情報が付加されていない場合は、スレッド識別情報を生成し、生成したスレッド識別情報を付加したコマンドに変換する、請求項１に記載の電子機器である。
【０００９】
請求項４の発明は、前記第１変換手段は、前記関数が多重実行可能でない場合は、該関数を呼び出したスレッドにエラーを返信する、請求項１に記載の電子機器である。
【００１０】
請求項５の発明は、前記第１変換手段は、前記関数に前記スレッド識別情報が付加されている場合であって、前記関数が多重実行可能でないときは、スレッド識別情報を無効化し、該関数を呼び出したスレッドにエラーを返信する、請求項４に記載の電子機器である。
【００１１】
請求項６の発明は、前記第１変換手段は、前記関数に前記スレッド識別情報が付加されていない場合であって、前記関数が多重実行可能でないときは、該関数を呼び出したスレッドにエラーを返信する、請求項４に記載の電子機器である。
【００１２】
請求項７の発明は、前記コマンド書込手段による前記コマンドの書き込み後、前記ステータス読出手段によって前記ステータスが読み出される前に前記プロセスが再起動された場合に、前記プロセスの再起動後に前記ステータス読出手段によって読み出された前記ステータスを廃棄するステータス廃棄手段をさらに備えた請求項１から６のいずれか一項に記載の電子機器である。
【００１３】
請求項８の発明は、前記コマンドが前記記憶領域に書き込まれた場合にＯＮを示し、前記プロセスが再起動された場合にＯＦＦを示すフラグを、前記コマンドの種類毎に記憶するフラグ記憶手段を備え、前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグがＯＦＦを示す場合に、当該ステータスを廃棄する、請求項７に記載の電子機器である。
【００１４】
請求項９の発明は、コマンドの種類毎に、前記コマンド書込手段によるコマンドの書き込み回数から、前記ステータス読出手段による当該コマンドの種類に対応するステータスの読み出し回数を差し引いた数を示すカウンタを記憶するカウンタ記憶手段を備え、前記ステータス廃棄手段は、前記ステータス読出手段によるステータスの読み出し後に、当該ステータスに対応するコマンドの種類と対応付けて前記フラグ記憶手段に記憶されているフラグが有効を示し、かつ、当該ステータスに対応するコマンドの種類と対応付けて前記カウンタ記憶手段に記憶されているカウンタが１を示さない場合に、当該ステータスを廃棄する、請求項８に記載の電子機器である。
【００１５】
請求項１０の発明は、前記第１変換手段によって変換されたコマンドを保持するコマンド保持手段と、前記コマンド書込手段による前記コマンドの書き込み後、当該コマンドに対応する前記第２ＯＳのシステムコールが前記第２制御手段によって実行される前に前記第２ＯＳが再起動された場合に、前記コマンド保持手段によって保持された前記コマンドを前記記憶領域に書き込むコマンド再書込手段をさらに備えた請求項７から９のいずれか一項に記載の電子機器である。
【００１６】
請求項１１の発明は、前記コマンド再書込手段は、前記第２ＯＳの再起動後にｏｐｅｎコマンドに対応するステータスが前記ステータス読出手段によって読み出された場合に、当該ステータスに含まれるファイルディスクリプタを引数とするコマンドを前記記憶領域に書き込む、請求項９又は１０に記載の電子機器である。
【００１７】
請求項１２の発明は、前記デバイスは、画像データに基づいて画像を形成する、請求項１から１１のいずれか一項に記載の電子機器である。
【００１８】
請求項１３の発明は、第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２の制御装置の記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２の制御装置による実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段を備え、前記プロセス内には複数のスレッドが実行されており、前記関数は、該スレッドが呼び出しており、前記第１変換手段は、前記関数が多重実行可能である場合、前記スレッドを識別するスレッド識別情報を付加したコマンドに変換し、前記ステータス読出手段は、前記ステータスとともにスレッド識別情報を読み出し、前記第２変換手段は、前記ステータス読出手段によって読み出された前記スレッド識別情報にしたがって、ステータスを前記スレッドが解釈する戻り値に変換する、制御装置である。
【００１９】
請求項１４の発明は、コンピュータを、第１ＯＳ上で動作中のプロセスが呼び出した関数を前記第１ＯＳと第２ＯＳとで共通に解釈されるコマンドに変換する第１変換手段と、前記第１変換手段によって変換されたコマンドを、前記第２ＯＳを実行する第２のコンピュータの記憶領域に書き込むコマンド書込手段と、前記コマンド書込手段によって書き込まれたコマンドに対応する前記第２ＯＳのシステムコールの前記第２のコンピュータによる実行の結果を示すステータスが前記記憶領域に書き込まれたことを示す通知を受けた場合に当該ステータスを前記記憶領域から読み出すステータス読出手段と、前記ステータス読出手段によって読み出された前記ステータスを前記プロセスが解釈する戻り値に変換し、当該戻り値を前記プロセスに返す第２変換手段として機能させ、前記プロセス内には複数のスレッドが実行されており、前記関数は、該スレッドが呼び出しており、前記第１変換手段は、前記関数が多重実行可能である場合、前記スレッドを識別するスレッド識別情報を付加したコマンドに変換し、前記ステータス読出手段は、前記ステータスとともにスレッド識別情報を読み出し、前記第２変換手段は、前記ステータス読出手段によって読み出された前記スレッド識別情報にしたがって、ステータスを前記スレッドが解釈する戻り値に変換する、プログラムである。
【発明の効果】
【００２０】
請求項１の電子機器によれば、関数を呼び出したスレッドを識別できる情報を付加して、関数からコマンドに変換できる。
【００２１】
請求項２の電子機器によれば、関数にスレッド識別情報が付加されている場合は、そのスレッド識別情報を付加したコマンドに変換することができる。
【００２２】
請求項３の電子機器によれば、関数にスレッド識別情報が付加されていない場合は、スレッド識別情報を生成し、生成したスレッド識別情報を付加したコマンドに変換することができる。
【００２３】
請求項４の電子機器によれば、関数が多重実行可能でない場合は、その関数を呼び出したスレッドにエラーを返信することができる。
【００２４】
請求項５の電子機器によれば、関数にスレッド識別情報が付加されている場合であって、関数が多重実行可能でないときは、スレッド識別情報を無効化し、その関数を呼び出したスレッドにエラーを返信することができる。
【００２５】
請求項６の電子機器によれば、関数にスレッド識別情報が付加されていない場合であって、関数が多重実行可能でないときは、その関数を呼び出したスレッドにエラーを返信することができる。
【００２６】
請求項７の電子機器によれば、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐことができる。
【００２７】
請求項８の電子機器によれば、読み出されたステータスに対応するコマンドの種類毎にステータスを廃棄するか否かを判断することができる。
【００２８】
請求項９の電子機器によれば、プログラムの再起動を伴わないプロセッサの不具合がある場合であっても、プロセッサの誤動作を防ぐことができる。
【００２９】
請求項１０の電子機器によれば、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐことができる。
【００３０】
請求項１１の電子機器によれば、第２ＯＳの再起動後にファイルが特定できなくなることを防ぐことができる。
【００３１】
請求項１２の電子機器によれば、マルチプロセッサシステムのプロセッサ間でのコマンドの受け渡し後にいずれかのプロセッサでプログラムが再起動された場合の誤動作を防ぐことができる。
【００３２】
請求項１３の制御装置によれば、関数を呼び出したスレッドを識別できる情報を付加して、関数からコマンドに変換できる。
【００３３】
請求項１４のプログラムによれば、関数を呼び出したスレッドを識別できる情報を付加して、関数からコマンドに変換できる。
【図面の簡単な説明】
【００３４】
【図１】従来システム（多重コール禁止／シングルプロセッサ）の例を示している。
【図２】従来システム（多重コール禁止／マルチプロセッサ）の例を示している。
【図３】従来システム（多重コール許可／シングルプロセッサ）の例を示している。
【図４】本実施の形態のシステム（多重コール許可／マルチプロセッサ）の例を示している。
【図５】本実施の形態を実現するコンピュータのハードウェア構成例を示すブロック図である。
【図６】従来システムにおけるコマンドフォーマットの例を示している。
【図７】従来システムにおけるステータスフォーマットの例を示している。
【図８】コマンドフォーマットの例を示している。
【図９】ステータスフォーマットの例を示している。
【図１０】本実施の形態におけるシステム（多重実行判別機能）の例を示している。
【図１１】本実施の形態における多重実行判別機能の例を示している。
【図１２】本実施の形態における多重実行判別機能の各コマンドＩＤ毎の構成内訳図の例を示している。
【図１３】本実施の形態における実施例（不要なステータス廃棄機能）の例を示している。
【図１４】本実施の形態における不要なステータス廃棄機能の例を示している。
【図１５】本実施の形態における不要なステータス廃棄機能の各コマンドＩＤ毎の構成内訳図の例を示している。
【図１６】本実施の形態における実施例（コマンド再発行機能）の例を示している。
【図１７】本実施の形態におけるコマンド再発行機能の例を示している。
【図１８】本実施の形態におけるコマンド再発行機能の各コマンドＩＤ毎の構成内訳図の例を示している。
【図１９】本実施の形態におけるコマンド再発行機能のｏｐｅｎコマンド再発行機能の構成内訳図の例を示している。
【図２０】多重実行判別機能のコマンド発行処理シーケンスの例を示している。
【図２１】多重実行判別機能のコマンド発行処理シーケンスの例を示している。
【図２２】不要なステータス廃棄機能の初期化処理シーケンスの例を示している。
【図２３】不要なステータス廃棄機能のｏｐｅｎメソッド内での処理シーケンスの例を示している。
【図２４】不要なステータス廃棄機能のｗｒｉｔｅメソッド内での処理シーケンスの例を示している。
【図２５】不要なステータス廃棄機能のｒｅａｄメソッド内での処理シーケンスの例を示している。
【図２６】コマンド再発行機能の初期化処理シーケンスの例を示している。
【図２７】コマンド再発行機能のｗｒｉｔｅメソッド内での処理シーケンスの例を示している。
【図２８】コマンド再発行機能のｒｅａｄメソッド内での処理シーケンスの例を示している。
【発明を実施するための形態】
【００３５】
図面に基づき本発明を実現するにあたっての好適な一実施の形態の例を説明する。
なお、モジュールとは、一般的に論理的に分離可能なソフトウェア（コンピュータ・プログラム）、ハードウェア等の部品を指す。したがって、本実施の形態におけるモジュールはコンピュータ・プログラムにおけるモジュールのことだけでなく、ハードウェア構成におけるモジュールも指す。それゆえ、本実施の形態は、それらのモジュールとして機能させるためのコンピュータ・プログラム（コンピュータにそれぞれの手順を実行させるためのプログラム、コンピュータをそれぞれの手段として機能させるためのプログラム、コンピュータにそれぞれの機能を実現させるためのプログラム）、システム及び方法の説明をも兼ねている。ただし、説明の都合上、「記憶する」、「記憶させる」、これらと同等の文言を用いるが、これらの文言は、実施の形態がコンピュータ・プログラムの場合は、記憶装置に記憶させる、又は記憶装置に記憶させるように制御するという意味である。また、モジュールは機能に一対一に対応していてもよいが、実装においては、１モジュールを１プログラムで構成してもよいし、複数モジュールを１プログラムで構成してもよく、逆に１モジュールを複数プログラムで構成してもよい。また、複数モジュールは１コンピュータによって実行されてもよいし、分散又は並列環境におけるコンピュータによって１モジュールが複数コンピュータで実行されてもよい。なお、１つのモジュールに他のモジュールが含まれていてもよい。また、以下、「接続」とは物理的な接続の他、論理的な接続（データの授受、指示、データ間の参照関係等）の場合にも用いる。「予め定められた」とは、対象としている処理の前に定まっていることをいい、本実施の形態による処理が始まる前はもちろんのこと、本実施の形態による処理が始まった後であっても、対象としている処理の前であれば、そのときの状況・状態にしたがって、又はそれまでの状況・状態にしたがって定まることの意を含めて用いる。「予め定められた値」が複数ある場合は、それぞれ異なった値であってもよいし、２以上の値（もちろんのことながら、全ての値も含む）が同じであってもよい。また、「Ａである場合、Ｂをする」という記載は、「Ａであるか否かを判断し、Ａであると判断した場合はＢをする」の意味で用いる。ただし、Ａであるか否かの判断が不要である場合を除く。また、「Ａ、Ｂ、Ｃ」等のように事物を列挙した場合は、断りがない限り例示列挙であり、その１つのみを選んでいる場合（例えば、Ａのみ）を含む。
また、システム又は装置とは、複数のコンピュータ、ハードウェア、装置等がネットワーク（一対一対応の通信接続を含む）等の通信手段で接続されて構成されるほか、１つのコンピュータ、ハードウェア、装置等によって実現される場合も含まれる。「装置」と「システム」とは、互いに同義の用語として用いる。もちろんのことながら、「システム」には、人為的な取り決めである社会的な「仕組み」（社会システム）にすぎないものは含まない。
また、各モジュールによる処理毎に又はモジュール内で複数の処理を行う場合はその処理毎に、対象となる情報を記憶装置から読み込み、その処理を行った後に、処理結果を記憶装置に書き出すものである。したがって、処理前の記憶装置からの読み込み、処理後の記憶装置への書き出しについては、説明を省略する場合がある。なお、ここでの記憶装置としては、ハードディスク、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、外部記憶媒体、通信回線を介した記憶装置、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）内のレジスタ等を含んでいてもよい。
【００３６】
本実施の形態は、２つのＣＰＵを備えた、いわゆるマルチプロセッサシステムを基本構成とするが、ここで、シングルプロセッサシステムとマルチプロセッサシステムの基本的なソフトウェア構成について説明する。なお、以下の説明では、便宜上、ソフトウェアの構成要素を動作の主体とする。
特許文献１に記載の技術は、第１のプロセッサと第２のプロセッサ間での要求情報とその応答情報の種類は複数サポートされているが、１つの種類の要求情報とその応答情報を複数実行することは想定されていない。また、特許文献２に記載の技術では、例外処理に対応しているが、１つの種類の要求情報とその応答情報を複数実行することは想定されていない。
【００３７】
図１は、従来システム（多重コール禁止／シングルプロセッサ）の例を示している。ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）には、デバイス（図示省略）を制御するドライバ８が備えられている。プロセス１は、アプリケーションプログラムを構成するプロセスである。プロセス１では、スレッド［１］：２、スレッド［２］：３、スレッド［３］：４がそれぞれＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）５、６、７を介したシステムコール１０によってドライバ８を呼び出す。呼び出されたドライバ８は、システムコール１０の内容に応じた処理を実行し、それぞれの処理の実行結果を表す戻り値１１をＡＰＩ５、６、７を介してプロセス１に返す。このシステムでは、シングルプロセッサ上での多重コール禁止のシステムを示している。
【００３８】
図２は、従来システム（多重コール禁止／マルチプロセッサ）の例を示している。ただし、本実施の形態のベースシステムになり得るものである。プロセス１は第１制御手段側で動作し、ドライバ８は第２制御手段側で動作するため、プロセス１内のスレッド［１］：２、スレッド［２］：３、スレッド［３］：４は、第１ＯＳ１７の共有ライブラリ１５を介してシステムコール１０を実行する。具体的には、ＡＰＩ１２、１３、１４で呼び出されるシステムコール１０をライブラリ１５で解釈される関数２１に予め対応付けていてもよいし、あるいは、プロセス１が関数２１を直接呼び出すように構成されていてもよい。関数２１が呼び出されると、ライブラリ１５は、第２ＯＳ９にこの関数２１の内容を渡すために、この関数２１を第１ＯＳ１７と第２ＯＳ９とで共通に解釈されるコマンド２９に変換してＯＳ間通信ドライバ１６に渡す。ＯＳ間通信ドライバ１６は、このコマンド２９をＯＳ間通信によってＰＣｌｅ１８を介してＯＳ間通信ドライバ１９に送信する。ＯＳ間通信のインターフェースはいかなる方式でもよいが、本実施形態では、ＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）Ｅｘｐｒｅｓｓ（登録商標。以下、ＰＣＩｅと略す。）を用いた例を示す。
【００３９】
ＯＳ間通信ドライバ１９は、受信したコマンド２９をタスク２０に渡す。コマンド２９を受け取ったタスク２０は、コマンド２９を、それぞれドライバ８で解釈されるシステムコール１０に変換し、それぞれＡＰＩ５、６、７を介したシステムコール１０によってドライバ８を呼び出す。呼び出されたドライバ８は、システムコール１０の内容に応じた処理を実行し、それぞれの処理の実行結果を表す戻り値１１をＡＰＩ５、６、７を介してタスク２０に返す。
【００４０】
戻り値１１を受け取ったタスク２０は、第１ＯＳ１７に戻り値１１の内容を渡すために、この戻り値１１を第１ＯＳ１７と第２ＯＳ９とで共通に解釈されるステータス３０に変換してＯＳ間通信ドライバ１９に渡す。ＯＳ間通信ドライバ１９は、このステータス３０をＯＳ間通信によってＯＳ間通信ドライバ１６に送信する。ＯＳ間通信ドライバ１６は、受信したステータス３０をライブラリ１５に渡す。ステータス３０を受け取ったライブラリ１５は、それぞれステータス３０をプロセス１で解釈される戻り値２２に変換し、この戻り値２２をそれぞれＡＰＩ１２、１３、１４を介してプロセス１に返す。このようにして、シングルプロセッサシステムにおいてプロセス１がドライバ８を直接呼び出した場合と同じ処理結果が、マルチプロセッサシステムによって得られる。
【００４１】
図３は、従来システム（多重コール許可／シングルプロセッサ）の例を示している。図１に示したシステム例では、ＡＰＩ５はドライバ８と１つのスレッド［１］：２だけの間にあったが、図３に示すシステム例では、ＡＰＩ５はドライバ８と２つのスレッド（スレッド［１］：２、スレッド［２］：３）の間にある。これによって、スレッド［１］：２、スレッド［２］：３とでシステムコール１０を同時実行できるようにしている。つまり、１つのＡＰＩに対して、複数のシステムコール１０が同時実行できるようになっている。
【００４２】
図４は、本実施の形態のシステム（多重コール許可／マルチプロセッサ）の例を示している。図２に示したシステム例では、ＡＰＩ１２はライブラリ１５と１つのスレッド［１］：２だけの間にあり、ＡＰＩ５はドライバ８と１つのタスク２０だけの間にあったが、図４に示すシステム例では、ＡＰＩ１２はライブラリ１５と２つのスレッド（スレッド［１］：２、スレッド［２］：３）の間にあり、ＡＰＩ５はドライバ８と２つのコタスク（コタスク［１］：２５、コタスク［２］：２６）の間にある。これによって、スレッド［１］：２、スレッド［２］：３とで関数２１を同時実行できるようにしている。つまり、１つのＡＰＩに対して、複数の関数２１が同時実行できるようになっている。
なお、第１ＯＳによる制御を実行する第１制御手段１００は、プロセス１、ＡＰＩ１２、ＡＰＩ１３、ライブラリ１５、ＯＡ間通信ドライバ１６、第１ＯＳ１７によって構成されている。第２制御手段２００は、ＯＡ間通信ドライバ１９、タスク２０、ＡＰＩ５、ＡＰＩ６、ドライバ８を有する第２ＯＳ９によって構成されている。
ライブラリ１５は、第１ＯＳ１７上で動作中のプロセス１が呼び出した関数２１を第１ＯＳ１７と第２ＯＳ９とで共通に解釈されるコマンド２９に変換する。そして、その変換されたコマンドを第２ＯＳ９がアクセス可能な記憶領域に書き込む。
そして、その書き込まれたコマンドに対応する第２ＯＳ９のシステムコールのドライバ８によって制御されるデバイス３００による実行の結果を示すステータス３０が記憶領域に書き込まれたことを示す通知を受けた場合に、そのステータス３０を記憶領域から読み出す。次に、その読み出されたステータス３０をプロセスが解釈する戻り値２２に変換し、その戻り値２２をプロセス１に返す。
この場合、プロセス１には複数のスレッド（図４の例では、スレッド［１］：２、スレッド［２］：３、スレッド［３］：４）が実行されており、関数２１は、そのスレッドが呼び出す。ライブラリ１５は、関数２１が多重実行可能であるか否かを判断し、多重実行可能であると判断した場合、スレッドを識別するスレッド識別情報を付加したコマンド２９に変換する。そして、ステータス３０とともにスレッド識別情報を読み出し、その読み出されたスレッド識別情報にしたがって、ステータス３０をスレッドが解釈する戻り値２２に変換する。
【００４３】
本実施の形態では、ＯＳ間通信を使用するライブラリ毎に、各ライブラリがサポートする関数それぞれが多重実行可能か否かを判別する多重実行判別機能を備えている。
そして、ＯＳ間通信を使用するライブラリ１５は、上位ソフトウェア（プロセス１又はスレッド）からユーザＩＤが指定された場合には、指定された関数２１が多重実行可能か否かを多重実行判別機能により判定する。そして、実行可能な場合には、そのユーザＩＤを有効として、そのユーザＩＤを付加したコマンド２９を発行する。また、上位ソフトウェア（プロセス１又はスレッド）からユーザＩＤが指定されていない場合には、多重実行判別機能によりその関数が実行可能な場合には、ユーザＩＤを割り振り、そのユーザＩＤを付加したコマンド２９を発行する。
また、ＯＳ間通信を使用するライブラリ１５は、上位ソフトウェア（プロセス１又はスレッド）からユーザＩＤが指定された場合には、指定された関数が多重実行可能か否かを多重実行判別機能により判定する。そして、実行可能でない場合には、そのユーザＩＤを無効として、上位ソフトウェア（プロセス１又はスレッド）にエラーを返す。また、上位ソフトウェア（プロセス１又はスレッド）からユーザＩＤが指定されていない場合には、多重実行判別機能によりその関数が実行可能でない場合には、上位ソフトウェア（プロセス１又はスレッド）にエラーを返す。
【００４４】
これらの処理によって、１つの種類の要求情報とその応答情報を複数実行可能とすることにより同時実行が可能となるので、複数のスレッドからそれぞれ１つの種類の要求情報とその応答情報を処理すること（並列処理）が可能となる。
さらに、ライブラリの多重実行判別機能のみでユーザＩＤを割り振らず、上位ソフトウェアからのユーザＩＤの指定を優先させることにより、最終段の処理（第２のプロセッサ上で動作するドライバ内における連続するハードウェア処理など）を固定することができるようになる。
【００４５】
次に、図５の例を用いて、本実施の形態のハードウェア構成について説明する。画像形成装置１０００は、本実施の形態に係る電子機器の一例である。画像形成装置１０００の主な構成要素は、第１制御手段１００、第２制御手段２００及びデバイス３００である。第１制御手段１００は、第２制御手段２００を制御する。第２制御手段２００は、デバイス３００を制御する。なお、画像形成装置１０００として、例えば、複写機、ファックス、スキャナ、プリンタ、複合機（スキャナ、プリンタ、複写機、ファックス等のいずれか２つ以上の機能を有している画像処理装置）等がある。
【００４６】
第１制御手段１００は、ＣＰＵ１０１などの演算装置、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０２やＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０３などの記憶装置、通信Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）１０４、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）１０５などの外部記憶装置及びＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）端子１０６を備え、これらの構成要素はバス１１０に接続されている。ＣＰＵ１０１は、ＲＡＭ１０２をワークエリアとして、プログラムを実行する。ＲＯＭ１０３には、ブートローダなどが記憶されている。通信Ｉ／Ｆ１０４は、例えばＰＣＩｅのスロットであり、第２制御手段２００に備えられたＰＣＩｅのスロットである通信Ｉ／Ｆ２０４と信号線で接続される。ＨＤＤ１０５には、第１ＯＳ１７やアプリケーションプログラムなどが記憶されており、画像形成装置１０００に電源が投入されると、ＣＰＵ１０１がＲＯＭ１０３からブートローダを読み出し、ブートローダに記述されている手順にしたがってＨＤＤ１０５から第１ＯＳ１７を読み出して実行する。第１ＯＳ１７は、例えばＬｉｎｕｘ（登録商標）である。ＬＡＮ端子１０６には信号線が接続され、ＣＰＵ１０１は、ＬＡＮ経由で外部の情報処理装置などと通信する。
【００４７】
第２制御手段２００は、ＣＰＵ２０１などの演算装置、ＲＡＭ２０２やＲＯＭ２０３などの記憶装置及び通信Ｉ／Ｆ２０４を備え、これらの構成要素はバス２１０に接続されている。ＣＰＵ２０１は、ＲＡＭ２０２をワークエリアとして、プログラムを実行する。ＲＯＭ２０３には、第２ＯＳ９が記憶されており、ＣＰＵ２０１は、第１制御手段１００からの命令にしたがってＲＯＭ２０３から第２ＯＳ９を読み出して実行する。第２ＯＳ９は、例えばＲＴＯＳ（Ｒｅａｌ  Ｔｉｍｅ  ＯＳ）であり、デバイス３００を制御するドライバの機能を備える。
【００４８】
画像形成装置１０００は、１つ以上のデバイス３００を備える。デバイス３００は、画像データに基づいて画像を形成する装置、例えば、イメージスキャナ３０１、プリンタ３０２、ＵＩ（Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）３０３、圧縮／伸長装置３０４などである。なお、デバイスの数は、いくつでもよい。イメージスキャナ３０１は、例えば、光源、光学系、撮像素子など（図示省略）を備え、光源が原稿に光を照射し、原稿で反射された反射光が光学系を介して撮像素子に入射し、撮像素子が原稿の画像を表す信号を生成して出力する。プリンタ３０２は、例えば、画像データに基づくトナー像を形成するプリントエンジン、紙などの記録媒体を収容する収容部、記録媒体を搬送路に沿って搬送する搬送機構など（図示省略）を備え、第１制御手段１００から第２制御手段２００を介して供給された画像データに基づく画像を電子写真方式で記録媒体に印刷する。ＵＩ３０３は、例えば、タッチパネルやキーパッドなど（図示省略）を備え、ユーザによる操作を受け付ける。タッチパネルには、ユーザが画像形成装置１０００を操作するための仮想的な操作子や、画像形成装置１０００の状態を表す情報などが表示される。キーパッドは、画像形成装置１０００の動作の開始や停止を指示するためのキーや、数字を入力するためのテンキーなどを備える。圧縮／伸長装置３０４は、イメージスキャナ３０１が読み込んだ画像を圧縮したり、受け取った圧縮画像を伸長してプリンタ３０２で印刷できる画像に変換したりする。
【００４９】
なお、図５示す画像形成装置１０００のハードウェア構成は、１つの構成例を示すものであり、本実施の形態は、図５に示す構成に限らず、本実施の形態において説明したモジュールを実行可能な構成であればよい。例えば、一部のモジュールを専用のハードウェア（例えば特定用途向け集積回路（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ：ＡＳＩＣ）等）で構成してもよく、一部のモジュールは外部のシステム内にあり通信回線で接続している形態でもよく、さらに図５示すシステムが複数互いに通信回線によって接続されていて互いに協調動作するようにしてもよい。
【００５０】
本実施の形態では、図１０の例に示すように、ＯＳ間通信ドライバ１６とＯＳ間通信ドライバ１９とがコマンドバッファ１０２９及びステータスバッファ１０３０を介してコマンド２９及びステータス３０のやりとりを行う。コマンドバッファ１０２９及びステータスバッファ１０３０は、ＲＡＭ２０２の記憶領域を利用してもよいし、ＲＡＭ２０２とは別のメモリを第２制御手段２００に設けて、このメモリの記憶領域をコマンドバッファ１０２９及びステータスバッファ１０３０として用いてもよい。コマンドバッファ１０２９及びステータスバッファ１０３０は、例えばＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ，  Ｆｉｒｓｔ  Ｏｕｔ）方式のバッファであり、それぞれの記憶領域の状態を表すＦＵＬＬ／ＮＯＴ  ＦＵＬＬ／ＥＭＰＴＹ／ＮＯＴ  ＥＭＰＴＹ情報をインタラプト２８によってＯＳ間通信ドライバ１６及びＯＳ間通信ドライバ１９に通知する機能を有する。
【００５１】
一例として、プロセス１が以下に示す関数２１を呼び出す例について説明する。この例では、プロセス１がライブラリ１５の関数２１を直接呼び出すように構成されており、各関数の戻り値２２のエラーチェックは省略されている。
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) ;                           /* ３番目の関数呼び出し */
【００５２】
図６は、従来システムにおけるコマンド２９のフォーマットを示す図である。コマンド２９は、第１ＯＳ１７と第２ＯＳ９とで共通に解釈される情報であり、コマンドヘッダ３１とコマンドデータ３２とを含む。プロセス１が関数２１を呼び出すと、関数２１に対応するライブラリ１５の処理ルーチンがコマンドデータ３２を生成する。コマンドデータ３２は、コマンドＩＤ（Ｉｄｅｎｔｉｆｉｅｒ）３９とパラメータ４０とを含む可変長のデータである。処理ルーチンは、コマンド２９の種類を表す識別子をコマンドＩＤ３９に設定し、関数２１の引数をパラメータ４０に設定する。処理ルーチンは、このようにして生成したコマンドデータ３２をＯＳ間通信ドライバ１６に渡す。
【００５３】
ここで、上記の関数呼び出しの例で２番目に呼び出される関数であるdo_ioctl()の第３引数が記憶領域の論理アドレスを示すポインタになっているが、第１制御手段１００と第２制御手段２００とで論理アドレスが異なる場合、このポインタをそのまま第２制御手段２００に渡しても第２制御手段２００はそのポインタが指し示す記憶領域へアクセスすることができないため、処理ルーチンは、コマンドデータ３２の生成時に、ポインタの値ではなく、そのポインタが指し示す記憶領域（４Ｂｙｔｅ×４＝１６Ｂｙｔｅ）をパラメータ４０として設定する。上記の例では、ポインタが指し示す領域が０で初期化されているので、パラメータ４０に設定された記憶領域も０で初期化される。
【００５４】
コマンドデータ３２を受け取ったＯＳ間通信ドライバ１６は、ＯＳ間通信ドライバ１９とのＯＳ間通信に必須の情報であるコマンドヘッダ３１を生成する。コマンドヘッダ３１は、タスクＩＤ３５と通信路ＩＤ３６とコマンドＩＤ３７とコマンドサイズ３８とを含む。ＯＳ間通信ドライバ１６は、コマンドデータ３２の解釈を行う第２ＯＳ９側のタスク２０（又はコタスク［１］：２５）の識別子をタスクＩＤ３５に設定し、ＯＳ間通信の通信路２７の識別子を通信路ＩＤ３６に設定し、コマンドデータ３２のコマンドＩＤ３９の設定値をコマンドＩＤ３７に設定し、コマンドデータ３２のサイズをコマンドサイズ３８に設定する。ＯＳ間通信ドライバ１６は、このようにして生成したコマンドヘッダ３１をコマンドデータ３２と結合することによってコマンド２９を生成し、生成したコマンド２９をＯＳ間通信によってコマンドバッファ１０２９に書き込む。そして、ＯＳ間通信ドライバ１６は、インタラプト２８によりＯＳ間通信ドライバ１９にＮＯＴ  ＥＭＰＴＹを通知する。
【００５５】
ＮＯＴ  ＥＭＰＴＹの通知を受けたＯＳ間通信ドライバ１９は、コマンドバッファ１０２９からコマンド２９を読み出し、コマンドヘッダ３１のタスクＩＤ３５によって、このコマンド２９を処理するタスク（又はコタスク）を判別する。この例では、コタスク［１］：２５がコマンド２９を処理するタスクであるので、ＯＳ間通信ドライバ１９は、コタスク［１］：２５にコマンド２９を渡す。ＯＳ間通信ドライバ１９は、コマンドバッファ１０２９が空になるまでコマンド２９をコタスク［１］：２５に渡すことを繰り返し、コマンドバッファ１０２９が空になったならば、ＯＳ間通信ドライバ１６からＮＯＴ  ＥＭＰＴＹが通知されるのを待つ。
【００５６】
コマンド２９を受け取ったコタスク［１］：２５は、コマンドデータ３２をドライバ８で解釈されるシステムコール１０に変換し、ＡＰＩ５を介してドライバ８を呼び出す。ここで、上記の関数呼び出しの例におけるdo_ioctl()に対応するパラメータ４０は、前述のとおり、論理アドレスを示すポインタではなく、そのポインタが指し示す記憶領域（４Ｂｙｔｅ×４＝１６Ｂｙｔｅ）であるから、コタスク［１］：２５は、その記憶領域を第２制御手段２００のメモリ上で確保し、確保した記憶領域を初期化し、その記憶領域のポインタをシステムコール１０の第３引数として設定する。ドライバ８は、システムコール１０を実行し、実行の結果を表す戻り値１１をコタスク［１］：２５に返す。コタスク［１］：２５は、この戻り値１１に基づいて、ステータス３０を生成する。
【００５７】
図７は、従来システムにおけるステータス３０のフォーマットを示す図である。ステータス３０は、第１ＯＳ１７と第２ＯＳ９とで共通に解釈される情報であり、ステータスヘッダ３３とステータスデータ３４とを含む。ステータスデータ３４は、ステータスＩＤ４５とパラメータ４６とを含む可変長のデータである。コタスク［１］：２５は、システムコール１０に対応するステータスの種類を示す識別子をステータスＩＤ４５に設定する。ここで、コタスク［１］：２５は、ステータスＩＤ４５の最上位ビットを１にマスクすることによって当該ステータスＩＤ４５に対応するコマンドＩＤ３９が得られるように、ステータスＩＤ４５を設定する。コタスク［１］：２５は、ドライバ８から受け取った戻り値１１をパラメータ４６に設定する。ここで、戻り値１１が正常終了を示す場合、上記の関数呼び出しの例における２番目の関数do_ioctl()に対応するシステムコール１０の第３引数に設定したポインタが指し示す記憶領域にデータが書き込まれているので、コタスク［１］：２５は、戻り値１１に加えて、そのデータもパラメータ４６に設定する。
【００５８】
ステータスヘッダ３３は、タスクＩＤ４１と通信路ＩＤ４２とステータスＩＤ４３とステータスサイズ４４とを含む。コタスク［１］：２５は、コマンド２９に設定されていたタスクＩＤ３５の設定値をタスクＩＤ４１に設定し、コマンド２９に設定されていた通信路ＩＤ３６の設定値を通信路ＩＤ４２に設定する。コタスク［１］：２５は、ステータスデータ３４のステータスＩＤ４５の設定値をステータスＩＤ４３に設定し、ステータスデータ３４のサイズをステータスサイズ４４に設定する。コタスク［１］：２５は、このようにして生成したステータス３０を、ＯＳ間通信ドライバ１９に渡す。ステータス３０を受け取ったＯＳ間通信ドライバ１９は、ステータス３０をステータスバッファ１０３０に書き込む。そして、ＯＳ間通信ドライバ１９は、インタラプト２８によりＯＳ間通信ドライバ１６にＮＯＴ  ＥＭＰＴＹを通知する。
【００５９】
ＮＯＴ  ＥＭＰＴＹの通知を受けたＯＳ間通信ドライバ１６は、ＯＳ間通信によりステータスバッファ１０３０からステータス３０を読み出し、ステータスヘッダ３３の通信路ＩＤ４２から、このステータスデータ３４を処理するライブラリを判別する。この例では、ライブラリ１５がステータスデータ３４を処理するので、ＯＳ間通信ドライバ１６は、ライブラリ１５にステータス３０を渡す。ＯＳ間通信ドライバ１６は、ステータスバッファ１０３０が空になるまで、ステータス３０をライブラリ１５に渡すことを繰り返し、ステータスバッファ１０３０が空になったならば、ＯＳ間通信ドライバ１９からＮＯＴ  ＥＭＰＴＹが通知されるのを待つ。
【００６０】
ステータス３０を受け取ったライブラリ１５は、ステータスデータ３４をプロセス１で解釈される戻り値２２に変換し、戻り値２２をプロセス１に返す。ここで、上記の関数呼び出しの例における２番目の関数do_ioctl()に対応するステータスデータ３４には、戻り値２２に変換される情報に加えてデータが設定されているので、ライブラリ１５は、do_ioctl()の第３引数で指定されたアドレスにそのデータを書き込む。
【００６１】
図８は、本実施の形態で用いるコマンドフォーマットの例を示している。図８の例に示すコマンド２９は、図６の例に示したコマンド２９にユーザＩＤ４７を追加したものである。具体的には、コマンドデータ（可変長）３２内のコマンドＩＤ３９の次（パラメータ４０の前）にユーザＩＤ４７を追加したものである。
ＯＡ間通信ドライバ１６は、関数２１が多重実行可能である場合、スレッドを識別するスレッド識別情報（以下、ユーザＩＤともいう）を付加したコマンド２９に変換する。具体的には、ＯＳ間通信ドライバ１６は、関数２１が多重実行可能であるか否かを判断し、多重実行可能である場合は、関数２１を送信したスレッドを識別するスレッド識別情報をユーザＩＤ４７に設定する。
この場合、ＯＡ間通信ドライバ１６は、関数２１にスレッド識別情報が付加されている場合は、そのスレッド識別情報を付加したコマンド２９に変換する（スレッド識別情報をユーザＩＤ４７に設定する）。
また、ＯＡ間通信ドライバ１６は、関数２１にスレッド識別情報が付加されていない場合は、スレッド識別情報を生成し、その生成したスレッド識別情報を付加したコマンド２９に変換する（スレッド識別情報をユーザＩＤ４７に設定する）ようにしてもよい。
また、ＯＡ間通信ドライバ１６は、関数２１が多重実行可能でない場合は、その関数を呼び出したスレッドにエラーを返信するようにしてもよい。
また、ＯＡ間通信ドライバ１６は、関数２１にスレッド識別情報が付加されている場合であって、関数２１が多重実行可能でないときは、スレッド識別情報を無効化し、その関数２１を呼び出したスレッドにエラーを返信するようにしてもよい。
また、ＯＡ間通信ドライバ１６は、関数２１にスレッド識別情報が付加されていない場合であって、関数２１が多重実行可能でないときは、その関数を呼び出したスレッドにエラーを返信するようにしてもよい。
【００６２】
図９は、本実施の形態で用いるステータスフォーマットの例を示している。図９の例に示すステータス３０は、図７の例に示したステータス３０にユーザＩＤ４８を追加したものである。具体的には、ステータスデータ（可変長）３４内のステータスＩＤ４５の次（パラメータ４６の前）にユーザＩＤ４８を追加したものである。コタスク［１］：２５（又はタスク２０）は、関数２１を送信したスレッド（ステータス３０を受け取るスレッド）を識別するスレッド識別情報をユーザＩＤ４８に設定する。
【００６３】
図１０は、本実施の形態におけるシステム（多重実行判別機能）の例を示している。
前述したように、第１ＯＳ１７と第２ＯＳ９との間には、ＰＣｌｅ１８があり、そのＰＣｌｅ１８内では、通信路２７を介してコマンド２９、ステータス３０の通信が行われる。そして、第１ＯＳ１７と第２ＯＳ９との処理速度差を緩衝するために、コマンド２９を一時保管する記憶領域であるコマンドバッファ１０２９、ステータス３０を一時保管する記憶領域であるステータスバッファ１０３０がある。ＯＡ間通信ドライバ１９は、コマンドバッファ１０２９、ステータスバッファ１０３０の状態を表すＦＵＬＬ／ＮＯＴ  ＦＵＬＬ／ＥＭＰＴＹ／ＮＯＴ  ＥＭＰＴＹ情報をインタラプト２８によってＯＳ間通信ドライバ１６に通知する。
ライブラリ１５内に多重実行判別モジュール１０３３がある。
【００６４】
図１１は、本実施の形態における多重実行判別機能の例を示している。
ライブラリ１５の多重実行判別モジュール１０３３は、コマンド群データ４９を参照して、関数２１は多重実行可能であるか否かを判断する。
コマンド群データ４９は、複数のコマンドデータ５０によって構成されている。コマンド２９の種類として、ここではｎ個ある。そして、各コマンドデータ５０は、図１１の例に示すようなデータ構成になっている。図１２は、本実施の形態における多重実行判別機能の各コマンドＩＤ毎の構成内訳図の例を示している。コマンドデータ５０は、図１２の例に示すように、多重実行回数５１とロック［ｍ］：５２によって構成されている。多重実行回数５１には、そのコマンドを複数並列で実行可能となっているか否かを示す値が設定されている。例えば、「１」である場合は、多重実行可能でないことを示している。「２」以上の値であるならば、多重実行可能であることを示している。有効フラグ６２は行列になっており、その行列の大きさは多重実行回数５１に設定されている値である。ロック［ｍ］：５２のその行列内の値は、既にその関数２１が使用されているか否かを示す値が設定されている。例えば、多重実行回数５１に「２」が設定されている場合は、ロック［ｍ］：５２のロック［１］に使用されていることを示す値が設定されており、ロック［２］に使用されていないことを示す値が設定されている場合は、もう１つだけ、その関数２１を実行可能であることを示している。ロック［１］、ロック［２］ともに、使用されていることを示す値が設定されている場合は、それ以上、その関数２１は実行できないことを示している。
【００６５】
＜ステータス廃棄機能＞
次に、ステータス廃棄機能について説明する。
コマンド２９の書き込み後、ステータス３０が読み出される前にプロセス１が再起動された場合に、プロセス１の再起動後に読み出されたステータス３０を廃棄する。
また、コマンド２９が記憶領域に書き込まれた場合にＯＮを示し、プロセス１が再起動された場合にＯＦＦを示すフラグを、コマンド２９の種類毎に記憶するフラグテーブルを有していてもよい。
そして、ステータス３０の読み出し後にそのステータス３０に対応するコマンド２９の種類と対応付けて記憶されているフラグがＯＦＦを示す場合に、そのステータス３０を廃棄するようにしてもよい。
また、コマンドの種類毎に、コマンド２９の書き込み回数から、コマンド２９の種類に対応するステータス３０の読み出し回数を差し引いた数を示すカウンタを記憶するカウンタテーブルを有していてもよい。
そして、ステータス３０の読み出し後に、そのステータス３０に対応するコマンド２９の種類と対応付けてフラグテーブルに記憶されているフラグが有効を示し、かつ、ステータス３０に対応するコマンド２９の種類と対応付けてカウンタテーブルに記憶されているカウンタが１を示さない場合に、そのステータス３０を廃棄するようにしてもよい。
また、変換されたコマンド２９を保持し、コマンド２９の書き込み後、そのコマンド２９に対応する第２ＯＳ９のシステムコール１０がドライバ８によって制御されるデバイス３００によって実行される前に第２ＯＳ９が再起動された場合に、保持されたコマンド２９を記憶領域に書き込むようにしてもよい。
また、第２ＯＳ９の再起動後にｏｐｅｎコマンドに対応するステータス３０が読み出された場合に、そのステータス３０に含まれるファイルディスクリプタを引数とするコマンドを記憶領域に書き込むようにしてもよい。
【００６６】
図１３は、本実施の形態における実施例（不要なステータス廃棄機能）の例を示している。
ＯＡ間通信ドライバ１６内に不要ステータス廃棄モジュール１３３１がある。
コマンドバッファ１０２９へのコマンド２９の書き込み後にいずれかのプロセスが異常終了した場合（例えば、プロセス１、又はライブラリ１５等が異常終了）に、以下のような問題が発生することがある。ここでは一例として、プロセス１が異常終了した場合について説明する。異常終了前にプロセス１が呼び出した関数２１は、ライブラリ１５によってコマンド２９に変換され、このコマンド２９がコマンドバッファ１０２９に書き込まれ、ＮＯＴ  ＥＭＰＴＹがＯＳ間通信ドライバ１９に通知される。その後、プロセス１が異常終了しても第２制御手段２００は動作を続けるから、コマンドバッファ１０２９から読み出されたコマンド２９がシステムコール１０に変換され、このシステムコール１０にしたがってドライバ８が処理を実行し、その実行結果を表すステータス３０が生成されてステータスバッファ１０３０に書き込まれる。しかし、プロセス１が異常終了するとライブラリ１５による処理も終了するので、通信路２７に対するｒｅａｄメソッドは実行されずに、ステータス３０がステータスバッファ１０３０から読み出されないままとなる。
【００６７】
異常終了したプロセス１が再起動されると、プロセス１に対応するライブラリ１５が通信路２７に対するｏｐｅｎメソッドを実行し、再起動後の最初のコマンド２９が生成され、このコマンド２９がコマンドバッファ１０２９に書き込まれる。その後、このコマンド２９の実行結果を表すステータス３０がステータスバッファ１０３０に書き込まれ、ＯＳ間通信ドライバ１６にＮＯＴ  ＥＭＰＴＹが通知される。ところが、プロセス１の異常終了前にコマンドバッファ１０２９に書き込んだコマンド２９の実行結果を表すステータス３０がステータスバッファ１０３０に残っているから、このステータス３０がＯＳ間通信ドライバ１６によって読み出されると、コマンド２９とステータス３０との対応関係にずれが生じ、マルチプロセッサシステムが誤動作するおそれがある。そこで、本実施の形態では、不要ステータス廃棄モジュール１３３１が第１ＯＳ１７に設けられている。ステータス廃棄機能を実現する不要ステータス廃棄モジュール１３３１は、通信路毎にＯＳ間通信ドライバ１６に設けられており、不要ステータス廃棄モジュール１３３１による処理は、通信路毎に実行される。不要ステータス廃棄モジュール１３３１は、ＯＡ間通信ドライバ１６によるコマンド２９の書き込み後、タスク２０によってステータス３０が読み出される前にプロセスが再起動された場合に、プロセスの再起動後にタスク２０によって読み出されたステータス３０を廃棄する。なお、この不要ステータス廃棄モジュール１３３１による処理は、特許文献２に記載の技術と同等である。
【００６８】
図１４は、本実施の形態における不要なステータス廃棄機能の例を示している。
不要ステータス廃棄モジュール１３３１が、データ群５３を有している。不要ステータス廃棄モジュール１３３１は、このデータ群５３を参照して、不要なステータスを廃棄する。
データ群５３は、複数のデータ５８によって構成されている。多重実行されている場合は、２つ以上のデータ５８がリスト構造として接続されている。図１４の例では、コマンドＩＤが「３」と「ｎ−１」が多重実行されている場合である。そして、各データ５８は、図１５の例に示すようなデータ構成になっている。図１５は、本実施の形態における不要なステータス廃棄機能の各コマンドＩＤ毎の構成内訳図の例を示している。データ５８は、図１５の例に示すように、ユーザＩＤ５４、有効フラグ５５、カウンタ５６、Ｎｅｘｔ５７によって構成されている。ユーザＩＤ５４には、スレッド識別情報が設定されている。したがって、スレッド毎に管理可能である。特に、ステータス３０は有効であるか無効であるかを判断をすることが可能となる。有効フラグ５５は、コマンドＩＤ毎に、そのコマンドＩＤに対応するコマンド２９の実行結果を示すステータス３０が有効か否かを示すフラグである。有効フラグ５５がＯＮならばそのステータス３０は有効であり、有効フラグ５５がＯＦＦならばそのステータス３０は無効である。カウンタ５６は、コマンドＩＤ毎に、そのコマンドＩＤに対応するコマンド２９のコマンドバッファ１０２９への書き込み回数から、そのコマンドＩＤに対応するステータス３０のステータスバッファ１０３０からの読み出し回数を差し引いた数を表す。Ｎｅｘｔ５７は、次のデータ５８を指し示すポインタである。このＮｅｘｔ５７を辿ることによってリスト構造が構成される。なお、ステータスの読み込みが正常終了した場合は、そのデータ５８を消去し、その消去したデータ５８を指し示していたＮｅｘｔ５７（１つ前のデータ５８におけるＮｅｘｔ５７）を、消去されたデータ５８のＮｅｘｔ５７で置換すればよい。
【００６９】
図１６は、本実施の形態における実施例（コマンド再発行機能）の例を示している。
図１３の例では、第１ＯＳ１７側（プロセス１又はライブラリ１５）が異常終了した場合の例を示したが、図１６は、第２ＯＳ９が異常終了した場合の例を示している。
ＯＡ間通信ドライバ１６は、コマンド再発行モジュール１６３２を有している。コマンド再発行モジュール１６３２は、ＯＡ間通信ドライバ１６がＯＡ間通信ドライバ１９に対して、コマンド２９を書き込んだ後に、第２ＯＳ９が異常終了した場合であって、第２ＯＳ９が再起動したときは、既に書き込んだコマンド２９を再発行する。なお、第２ＯＳ９の異常終了として、例えば、省電力モードに移行した場合等が該当する。
ＯＡ間通信ドライバ１６のコマンド再発行モジュール１６３２が、コマンド群データ６０を有している。そして、コマンド再発行モジュール１６３２は、コマンド群データ６０を参照して、コマンド２９の再発行を行う。図１７は、本実施の形態におけるコマンド再発行機能の例を示している。
コマンド群データ６０は、複数のコマンドデータ６６と１つのｆｄデータ７０によって構成されている。多重実行されている場合は、２つ以上のコマンドデータ６６がリスト構造として接続されている。図１７の例では、コマンドＩＤが「３」と「ｎ−１」が多重実行されている場合である。そして、各コマンドデータ６６は、図１８の例に示すようなデータ構成になっている。図１８は、本実施の形態におけるコマンド再発行機能の各コマンドＩＤ毎の構成内訳図の例を示している。コマンドデータ６６は、図１８の例に示すように、ユーザＩＤ６１、有効フラグ６２、カウンタ６３、発行済みコマンド保持領域へのポインタ６４、Ｎｅｘｔ６５によって構成されている。ユーザＩＤ６１には、スレッド識別情報が設定されている。したがって、スレッド毎に管理可能である。特に、コマンド２９の再発行が必要であるか否かを判断をすることが可能となる。有効フラグ６２は、コマンドＩＤ毎に、そのコマンドＩＤに対応するコマンド２９の実行結果を示すステータス３０が有効か否かを示すフラグである。有効フラグ６２がＯＮならばそのステータス３０は有効であり、有効フラグ６２がＯＦＦならばそのステータス３０は無効である。カウンタ６３は、コマンドＩＤ毎に、そのコマンドＩＤに対応するコマンド２９のコマンドバッファ１０２９への書き込み回数から、そのコマンドＩＤに対応するステータス３０のステータスバッファ１０３０からの読み出し回数を差し引いた数を表す。ＯＳ間通信ドライバ１６は、コマンドバッファ１０２９に書き込んだコマンド２９の複製をＲＡＭ１０２等の記憶領域に書き込む。この記憶領域を、発行済みコマンド保持領域といい、この記憶領域の論理アドレスを示すポインタが、発行済みコマンド保持領域へのポインタ６４である。Ｎｅｘｔ６５は、次のコマンドデータ６６を指し示すポインタである。このＮｅｘｔ６５を辿ることによってリスト構造が構成される。なお、ステータスの読み込みが正常終了した場合は、そのコマンドデータ６６を消去し、その消去したコマンドデータ６６を指し示していたＮｅｘｔ６５（１つ前のコマンドデータ６６におけるＮｅｘｔ６５）を、消去されたコマンドデータ６６のＮｅｘｔ６５で置換すればよい。
【００７０】
図１９は、本実施の形態におけるコマンド再発行機能のｏｐｅｎコマンド再発行機能の構成内訳図の例を示している。
コマンド再発行モジュール１６３２は、通信路毎にｆｄデータ７０を生成し、生成したｆｄデータ７０をＲＡＭ１０２又はＨＤＤ１０５に記憶する。ｆｄデータ７０は、仮想ｆｄ６７と、実ｆｄ６８と、発行済みｏｐｅｎコマンド保持領域へのポインタ６９とを対応付けたテーブルである。仮想ｆｄ６７は、ｏｐｅｎコマンドで開かれたファイルに対して第１制御手段１００が割り当てる仮想的なファイルディスクリプタである。実ｆｄ６８は、そのファイルに対して第２制御手段２００が割り当てるファイルディスクリプタである。ＯＳ間通信ドライバ１６は、コマンドバッファ１０２９に書き込んだｏｐｅｎコマンドの複製をＲＡＭ１０２等の記憶領域に書き込む。この記憶領域を、発行済みｏｐｅｎコマンド保持領域といい、この記憶領域の論理アドレスを示すポインタが、発行済みｏｐｅｎコマンド保持領域へのポインタ６９である。
【００７１】
図２０は、多重実行判別機能（多重実行判別モジュール１０３３）の初期化処理シーケンスの例を示している。
ステップＳ１からステップＳ６までの処理をコマンドＩＤ（１，１，ｎ）分繰り返す。つまり、多重実行判別モジュール１０３３が、コマンドＩＤループカウンタ（初期値は１）に１を加算する。
ステップＳ２では、多重実行回数を設定する。
ステップＳ３からステップＳ５までの処理を多重実行回数（１，１，ｍ）分繰り返す。つまり、多重実行判別モジュール１０３３が、多重実行回数ループカウンタ（初期値は１）に１を加算する。
ステップＳ４では、ロック（図１２の例で示したコマンドデータ５０のロック［ｍ］：５２）にＦＡＬＳＥを設定する。
ステップＳ５においては、多重実行判別モジュール１０３３が、多重実行回数ループカウンタがｍに達したか否かを判定し、多重実行回数ループカウンタがｍに達していないならばステップＳ３に戻り、ｍに達したならばステップＳ６に移る。
ステップＳ６においては、多重実行判別モジュール１０３３が、コマンドＩＤループカウンタがｎに達したか否かを判定し、コマンドＩＤループカウンタがｎに達していないならばステップＳ１に戻り、ｎに達したならば処理を終了する。
【００７２】
図２１は、多重実行判別機能（多重実行判別モジュール１０３３）のコマンド発行処理シーケンスの例を示している。
ステップＳ１０では、多重実行判別モジュール１０３３が、ユーザＩＤの指定があるか否かを判断し、指定がある場合はステップＳ１１へ進み、それ以外の場合はステップＳ１４へ進む。ここでユーザＩＤとは、スレッドを識別する情報である。
ステップＳ１１では、多重実行判別モジュール１０３３が、ロックはＦＡＬＳＥか否かを判断し、ＦＡＬＳＥの場合はステップＳ１２へ進み、それ以外の場合はエラーとして処理を終了する。指定された関数は多重実行可能であるか否かを判別していることになる。「Ｙｅｓ」（ロックはＦＡＬＳＥ）の場合は、多重実行可能であり、「Ｎｏ」の場合は、多重実行不可である。
【００７３】
ステップＳ１２では、多重実行判別モジュール１０３３が、ロックにＴＲＵＥを設定する。
ステップＳ１３では、多重実行判別モジュール１０３３が、コマンド生成処理を行う。ライブラリ１５及びＯＳ間通信ドライバ１６がコマンド２９を生成する。具体的には、関数２１に対応するライブラリ１５の処理ルーチンがコマンドデータ３２を生成してＯＳ間通信ドライバ１６に渡す。コマンドデータ３２を受け取ったＯＳ間通信ドライバ１６は、コマンドヘッダ３１を生成し、生成したコマンドヘッダ３１をコマンドデータ３２と結合することによってコマンド２９を生成する。
具体的には、図８の例に示したコマンド２９のフォーマットにしたがってコマンドを生成する。つまり、ユーザＩＤ４７を付加したコマンドを生成する。
なお、ユーザＩＤの指定がなかった場合（ステップＳ１０で「Ｎｏ」の場合）、ユーザＩＤを多重実行判別モジュール１０３３は新たに生成してユーザＩＤ４７を付加したコマンドを生成する。
【００７４】
ステップＳ１４からステップＳ１６までの処理を多重実行回数（１，１，ｍ）分繰り返す。つまり、多重実行判別モジュール１０３３が、多重実行回数ループカウンタ（初期値は１）に１を加算する。
ステップＳ１５では、多重実行判別モジュール１０３３が、ロックはＦＡＬＳＥか否かを判断し、ＦＡＬＳＥの場合はステップＳ１２へ進み、それ以外の場合はエラーとして処理を終了する。指定された関数は多重実行可能であるか否かを判別していることになる。「Ｙｅｓ」（ロックはＦＡＬＳＥ）の場合は、多重実行可能であり、「Ｎｏ」の場合は、多重実行不可である。
ステップＳ１６においては、多重実行判別モジュール１０３３が、多重実行回数ループカウンタがｍに達したか否かを判定し、多重実行回数ループカウンタがｍに達していないならばステップＳ１４に戻り、ｍに達したならば処理をエラーとして終了する。
【００７５】
図２２は、不要なステータス廃棄機能（不要ステータス廃棄モジュール１３３１）の初期化処理シーケンスの例を示している。
ステップＳ５１からステップＳ５４までの処理をコマンドＩＤ（１，１，ｎ）分繰り返す。つまり、不要ステータス廃棄モジュール１３３１が、コマンドＩＤループカウンタ（初期値は１）に１を加算する。
ステップＳ５２では、不要ステータス廃棄モジュール１３３１が、データ５８内のユーザＩＤ５４を０とし、Ｎｅｘｔ５７をＮＵＬＬで初期化する。
ステップＳ５３では、不要ステータス廃棄モジュール１３３１が、データ５８内の有効フラグ５５をオフにし、カウンタ５６を０で初期化する。
ステップＳ５４においては、不要ステータス廃棄モジュール１３３１が、コマンドＩＤループカウンタがｎに達したか否かを判定し、コマンドＩＤループカウンタがｎに達していないならばステップＳ５１に戻り、ｎに達したならば処理を終了する。
【００７６】
図２３は、不要なステータス廃棄機能（不要ステータス廃棄モジュール１３３１）のｏｐｅｎメソッド内での処理シーケンスの例を示している。
ステップＳ５５では、不要ステータス廃棄モジュール１３３１が、ｏｐｅｎメソッド処理を行う。プロセス１がライブラリ１５を呼び出し、ライブラリ１５が通信路２７に対してｏｐｅｎメソッド処理を実行する。そして、ｏｐｅｎメソッド処理の戻り値として、通信路２７を示すファイルディスクリプタがライブラリ１５に返され、これ以降、処理の対象となる通信路２７は、このファイルディスクリプタによって特定される。
【００７７】
ステップＳ５６からステップＳ６０までの処理をコマンドＩＤ（１，１，ｎ）分繰り返す。つまり、不要ステータス廃棄モジュール１３３１が、コマンドＩＤループカウンタ（初期値は１）に１を加算する。
ステップＳ５７では、不要ステータス廃棄モジュール１３３１が、データ５８の有効フラグ５５をオフにする。
ステップＳ５８では、不要ステータス廃棄モジュール１３３１が、データ５８のＮｅｘｔ５７を参照して、「Ｎｅｘｔ＝ＮＵＬＬ」であるか否かを判断し、「Ｎｅｘｔ＝ＮＵＬＬ」の場合はステップＳ６０へ進み、それ以外の場合はステップＳ５９へ進む。
ステップＳ５９では、不要ステータス廃棄モジュール１３３１が、データ５８のＮｅｘｔ５７から構造体（データ５８）のアドレスを獲得し、ステップＳ５７へ戻る。
ステップＳ６０においては、不要ステータス廃棄モジュール１３３１が、コマンドＩＤループカウンタがｎに達したか否かを判定し、コマンドＩＤループカウンタがｎに達していないならばステップＳ５６に戻り、ｎに達したならば処理を終了する。
【００７８】
図２４は、不要なステータス廃棄機能（不要ステータス廃棄モジュール１３３１）のｗｒｉｔｅメソッド内での処理シーケンスの例を示している。
ステップＳ６１では、不要ステータス廃棄モジュール１３３１が、コマンド生成処理を行う。
ステップＳ６２では、不要ステータス廃棄モジュール１３３１が、コマンド書き込み処理を行う。ＯＳ間通信ドライバ１６が、生成したコマンド２９をＯＳ間通信によってコマンドバッファ１０２９に書き込む。
ステップＳ６３では、不要ステータス廃棄モジュール１３３１が、対応するコマンドＩＤの先頭の構造体（データ５８）のユーザＩＤ５４が０であるか否かを判断し、０の場合はステップＳ６４へ進み、それ以外の場合はステップＳ６６へ進む。ステップＳ６３で「Ｙｅｓ」の場合は、初期化がされている場合である。
ステップＳ６４では、不要ステータス廃棄モジュール１３３１が、ユーザＩＤを更新する。
【００７９】
ステップＳ６５では、不要ステータス廃棄モジュール１３３１が、データ５８の有効フラグ５５をオンにし、カウンタ５６を１増加させ、処理を終了する。
ステップＳ６６では、不要ステータス廃棄モジュール１３３１が、データ５８のユーザＩＤ５４を参照して、「構造体のユーザＩＤ＝ユーザＩＤ」であるか否かを判断し、「構造体のユーザＩＤ＝ユーザＩＤ」の場合はステップＳ６５へ進み、それ以外の場合はステップＳ６７へ進む。
ステップＳ６７では、不要ステータス廃棄モジュール１３３１が、データ５８のＮｅｘｔ５７を参照して、「Ｎｅｘｔ＝ＮＵＬＬ」であるか否かを判断し、「Ｎｅｘｔ＝ＮＵＬＬ」の場合はステップＳ６８へ進み、それ以外の場合はステップＳ６９へ進む。
ステップＳ６８では、不要ステータス廃棄モジュール１３３１が、構造体（データ５８）の領域を確保し、アドレスをＮｅｘｔ５７に設定し、ステップＳ６４へ進む。
ステップＳ６９では、不要ステータス廃棄モジュール１３３１が、次のデータ５８のユーザＩＤ５４を参照して、「次の構造体のユーザＩＤ＝ユーザＩＤ」であるか否かを判断し、「次の構造体のユーザＩＤ＝ユーザＩＤ」の場合はステップＳ６５へ進み、それ以外の場合はステップＳ６７へ戻る。
【００８０】
図２５は、不要なステータス廃棄機能（不要ステータス廃棄モジュール１３３１）のｒｅａｄメソッド内での処理シーケンスの例を示している。
ステップＳ７０では、不要ステータス廃棄モジュール１３３１が、ステータス読み込み処理を行う。つまり、不要ステータス廃棄モジュール１３３１が、ＯＳ間通信によりステータスバッファ１０３０からステータス３０を読み出す。具体的には、ＯＳ間通信ドライバ１９からのＮＯＴ  ＥＭＰＴＹの通知を受け取るまでＯＳ間通信ドライバ１６が待機する。ＮＯＴ  ＥＭＰＴＹの通知を受け取ると、ＯＳ間通信ドライバ１６が、ＯＳ間通信によりステータスバッファ１０３０からステータス３０を読み出す。
ステップＳ７１では、不要ステータス廃棄モジュール１３３１が、ステータス読み込みが成功したか否かを判断し、成功した場合はステップＳ７２へ進み、それ以外の場合は処理を終了する。
ステップＳ７２では、不要ステータス廃棄モジュール１３３１が、対応するコマンドＩＤ／ユーザＩＤの有効フラグ（データ５８の有効フラグ５５）をチェックし、有効フラグがオフの場合はステップＳ７７へ進み、それ以外の場合はステップＳ７３へ進む。
【００８１】
ステップＳ７３では、不要ステータス廃棄モジュール１３３１が、対応するコマンドＩＤ／ユーザＩＤのカウンタ（データ５８のカウンタ５６）をチェックし、カウンタが０の場合はステップＳ７５へ進み、それ以外の場合はステップＳ７４へ進む。
ステップＳ７４では、不要ステータス廃棄モジュール１３３１が、データ５８のカウンタ５６を１減少させ、カウンタ５６が０になった場合はステップＳ７６へ進み、それ以外の場合はステップＳ７５へ進む。
ステップＳ７５では、不要ステータス廃棄モジュール１３３１が、ステータス３０を廃棄する。
ステップＳ７６では、不要ステータス廃棄モジュール１３３１が、データ５８の有効フラグ５５をオフにし、処理を終了する。
ステップＳ７７では、不要ステータス廃棄モジュール１３３１が、対応するコマンドＩＤ／ユーザＩＤのカウンタ（データ５８のカウンタ５６）をチェックし、カウンタが０の場合はステップＳ７９へ進み、それ以外の場合はステップＳ７８へ進む。
ステップＳ７８では、不要ステータス廃棄モジュール１３３１が、カウンタ５６を１減少させる。
ステップＳ７９では、不要ステータス廃棄モジュール１３３１が、ステータス３０を廃棄し、処理を終了する。
【００８２】
図２６は、コマンド再発行機能（コマンド再発行モジュール１６３２）の初期化処理シーケンスの例を示している。
ステップＳ１０１では、コマンド再発行モジュール１６３２が、不要なステータス廃棄機能初期化処理を行う。具体的には、図２２の例に示した処理を行う。
ステップＳ１０２からステップＳ１０４までの処理をコマンドＩＤ（１，１，ｎ）分繰り返す。つまり、コマンド再発行モジュール１６３２が、コマンドＩＤループカウンタ（初期値は１）に１を加算する。
ステップＳ１０３では、コマンド再発行モジュール１６３２が、コマンドデータ６６の発行済みコマンド保持領域へのポインタ６４をＮＵＬＬで初期化する。
ステップＳ１０４においては、コマンド再発行モジュール１６３２が、コマンドＩＤループカウンタがｎに達したか否かを判定し、コマンドＩＤループカウンタがｎに達していないならばステップＳ１０２に戻り、ｎに達したならばステップＳ１０５に移る。
【００８３】
ステップＳ１０５では、コマンド再発行モジュール１６３２が、コマンドデータ６６の発行済みコマンド保持領域へのポインタ６４をＮＵＬＬで初期化する。
ステップＳ１０６では、コマンド再発行モジュール１６３２が、ｆｄデータ７０の仮想ｆｄ６７をｘ（正の値）とし、ｆｄデータ７０の実ｆｄ６８を−１で初期化する。
【００８４】
図２７は、コマンド再発行機能（コマンド再発行モジュール１６３２）のｗｒｉｔｅメソッド内での処理シーケンスの例を示している。
ステップＳ１０７では、コマンド再発行モジュール１６３２が、コマンド生成処理（仮想ｆｄを実ｆｄに変換する処理）を行う。
ステップＳ１０８では、コマンド再発行モジュール１６３２が、コマンド書き込み処理を行う。
ステップＳ１０９では、コマンド再発行モジュール１６３２が、不要なステータス廃棄機能のｗｒｉｔｅメソッド処理を行う。具体的には、図２４の例に示した処理を行う。
【００８５】
ステップＳ１１０では、コマンド再発行モジュール１６３２が、ｏｐｅｎコマンドであるか否かを判断し、ｏｐｅｎコマンドの場合はステップＳ１１１へ進み、それ以外の場合はステップＳ１１２へ進む。
ステップＳ１１１では、コマンド再発行モジュール１６３２が、保持領域を確保し、ｏｐｅｎコマンドをコピーし、ｆｄデータ７０の発行済みｏｐｅｎコマンド保持領域へのポインタ６９に保持領域のアドレスを設定し、処理を終了する。
ステップＳ１１２では、コマンド再発行モジュール１６３２が、非同期コマンドであるか否かを判断し、非同期コマンドの場合はステップＳ１１３へ進み、それ以外の場合は処理を終了する。
ステップＳ１１３では、コマンド再発行モジュール１６３２が、保持領域を確保し、非同期コマンドをコピーし、対応するコマンドＩＤ／ユーザＩＤの発行済み非同期コマンド保持領域へのポインタに保持領域のアドレスを設定し、処理を終了する。
【００８６】
図２８は、コマンド再発行機能（コマンド再発行モジュール１６３２）のｒｅａｄメソッド内での処理シーケンスの例を示している。
ステップＳ１１４では、コマンド再発行モジュール１６３２が、ステータス読み込み処理を行う。コマンド再発行モジュール１６３２が、ＯＳ間通信によりステータスバッファ１０３０からステータス３０を読み出す。具体的には、ＯＳ間通信ドライバ１９からのＮＯＴ  ＥＭＰＴＹの通知を受け取るまでＯＳ間通信ドライバ１６が待機する。ＮＯＴ  ＥＭＰＴＹの通知を受け取ると、ＯＳ間通信ドライバ１６が、ＯＳ間通信によりステータスバッファ１０３０からステータス３０を読み出す。
ステップＳ１１５では、コマンド再発行モジュール１６３２が、不要なステータス廃棄機能のｒｅａｄメソッド処理を行う。具体的には、図２５の例に示した処理を行う。
【００８７】
ステップＳ１１６では、コマンド再発行モジュール１６３２が、ｃｌｏｓｅコマンドであるか否かを判断し、ｃｌｏｓｅコマンドの場合はステップＳ１１７へ進み、それ以外の場合はステップＳ１１９へ進む。
ステップＳ１１７では、コマンド再発行モジュール１６３２が、保持領域を解放し、ｆｄデータ７０の発行済みｏｐｅｎコマンド保持領域へのポインタ６９にＮＵＬＬを設定する。
ステップＳ１１８では、コマンド再発行モジュール１６３２が、コマンド再発行機能の実ｆｄを−１でリセットし、処理を終了する。
【００８８】
ステップＳ１１９では、コマンド再発行モジュール１６３２が、非同期コマンドであるか否かを判断し、非同期コマンドの場合はステップＳ１２０へ進み、それ以外の場合はステップＳ１２１へ進む。
ステップＳ１２０では、コマンド再発行モジュール１６３２が、保持領域を解放し、対応するコマンドＩＤ／ユーザＩＤの発行済み非同期コマンド保持領域へのポインタにＮＵＬＬを設定し、処理を終了する。
ステップＳ１２１では、コマンド再発行モジュール１６３２が、ｏｐｅｎコマンドであり、かつ「ｆｄ≧０」であるか否かを判断し、ｏｐｅｎコマンドであり、かつ「ｆｄ≧０」の場合はステップＳ１２２へ進み、それ以外の場合は処理を終了する。
ステップＳ１２２では、コマンド再発行モジュール１６３２が、ステータスデータのパラメータ領域に含まれるｆｄをコマンド再発行機能の実ｆｄに設定する。
ステップＳ１２３では、コマンド再発行モジュール１６３２が、ステータスデータのパラメータ領域に含まれるｆｄをコマンド再発行機能の仮想ｆｄに変換し、処理を終了する。
【００８９】
なお、各モジュール（プロセス１、スレッド［１］：２、スレッド［２］：３、スレッド［３］：４、ＡＰＩ１２、ＡＰＩ１３、ライブラリ１５、ＯＡ間通信ドライバ１６、第１ＯＳ１７、ＰＣｌｅ１８、第２ＯＳ９、ＯＡ間通信ドライバ１９、タスク２０、コタスク［１］：２５、コタスク［２］：２６、ＡＰＩ５、ＡＰＩ６、ドライバ８、コマンドバッファ１０２９、ステータスバッファ１０３０、多重実行判別モジュール１０３３、不要ステータス廃棄モジュール１３３１、コマンド再発行モジュール１６３２等）の処理内容として背景技術で説明した技術を採用してもよい。
【００９０】
また、説明したプログラムについては、記録媒体に格納して提供してもよく、また、そのプログラムを通信手段によって提供してもよい。その場合、例えば、前記説明したプログラムについて、「プログラムを記録したコンピュータ読み取り可能な記録媒体」の発明として捉えてもよい。
「プログラムを記録したコンピュータ読み取り可能な記録媒体」とは、プログラムのインストール、実行、プログラムの流通等のために用いられる、プログラムが記録されたコンピュータで読み取り可能な記録媒体をいう。
なお、記録媒体としては、例えば、デジタル・バーサタイル・ディスク（ＤＶＤ）であって、ＤＶＤフォーラムで策定された規格である「ＤＶＤ−Ｒ、ＤＶＤ−ＲＷ、ＤＶＤ−ＲＡＭ等」、ＤＶＤ＋ＲＷで策定された規格である「ＤＶＤ＋Ｒ、ＤＶＤ＋ＲＷ等」、コンパクトディスク（ＣＤ）であって、読出し専用メモリ（ＣＤ−ＲＯＭ）、ＣＤレコーダブル（ＣＤ−Ｒ）、ＣＤリライタブル（ＣＤ−ＲＷ）等、ブルーレイ・ディスク（Ｂｌｕ−ｒａｙ（登録商標）  Ｄｉｓｃ）、光磁気ディスク（ＭＯ）、フレキシブルディスク（ＦＤ）、磁気テープ、ハードディスク、読出し専用メモリ（ＲＯＭ）、電気的消去及び書換可能な読出し専用メモリ（ＥＥＰＲＯＭ（登録商標））、フラッシュ・メモリ、ランダム・アクセス・メモリ（ＲＡＭ）、ＳＤ（Ｓｅｃｕｒｅ  Ｄｉｇｉｔａｌ）メモリーカード等が含まれる。
そして、前記のプログラムの全体又はその一部は、前記記録媒体に記録して保存や流通等させてもよい。また、通信によって、例えば、ローカル・エリア・ネットワーク（ＬＡＮ）、メトロポリタン・エリア・ネットワーク（ＭＡＮ）、ワイド・エリア・ネットワーク（ＷＡＮ）、インターネット、イントラネット、エクストラネット等に用いられる有線ネットワーク、又は無線通信ネットワーク、さらにこれらの組み合わせ等の伝送媒体を用いて伝送させてもよく、また、搬送波に乗せて搬送させてもよい。
さらに、前記のプログラムは、他のプログラムの一部分若しくは全部であってもよく、又は別個のプログラムと共に記録媒体に記録されていてもよい。また、複数の記録媒体に分割して記録されていてもよい。また、圧縮や暗号化等、復元可能であればどのような態様で記録されていてもよい。
【符号の説明】
【００９１】
１…プロセス
２…スレッド［１］
３…スレッド［２］
４…スレッド［３］
５…ＡＰＩ
６…ＡＰＩ
７…ＡＰＩ
８…ドライバ
９…第２ＯＳ
１０…システムコール
１１…戻り値
１２…ＡＰＩ
１３…ＡＰＩ
１４…ＡＰＩ
１５…ライブラリ
１６…ＯＡ間通信ドライバ
１７…第１ＯＳ
１８…ＰＣｌｅ
１９…ＯＡ間通信ドライバ
２０…タスク
２１…関数
２２…戻り値
２５…コタスク［１］
２６…コタスク［２］
２７…通信路
２８…インタラプト
２９…コマンド
３０…ステータス
１００…第１制御手段
１０１…ＣＰＵ
１０２…ＲＡＭ
１０３…ＲＯＭ
１０４…通信Ｉ／Ｆ
１０５…ＨＤＤ
１０６…ＬＡＮ端子
１１０…バス
２００…第２制御手段
２０１…ＣＰＵ
２０２…ＲＡＭ
２０３…ＲＯＭ
２０４…通信Ｉ／Ｆ
２１０…バス
３００…デバイス
３０１…イメージスキャナ
３０２…プリンタ
３０３…ＵＩ
３０４…圧縮／伸長装置
１０００…画像形成装置
１０２９…コマンドバッファ
１０３０…ステータスバッファ
１０３３…多重実行判別モジュール
１３３１…不要ステータス廃棄モジュール
１６３２…コマンド再発行モジュール
【図１】
2019028557.tif 000003
【図２】
2019028557.tif 000004
【図３】
2019028557.tif 000005
【図４】
2019028557.tif 000006
【図５】
2019028557.tif 000007
【図６】
2019028557.tif 000008
【図７】
2019028557.tif 000009
【図８】
2019028557.tif 000010
【図９】
2019028557.tif 000011
【図１０】
2019028557.tif 000012
【図１１】
2019028557.tif 000013
【図１２】
2019028557.tif 000014
【図１３】
2019028557.tif 000015
【図１４】
2019028557.tif 000016
【図１５】
2019028557.tif 000017
【図１６】
2019028557.tif 000018
【図１７】
2019028557.tif 000019
【図１８】
2019028557.tif 000020
【図１９】
2019028557.tif 000021
【図２０】
2019028557.tif 000022
【図２１】
2019028557.tif 000023
【図２２】
2019028557.tif 000024
【図２３】
2019028557.tif 000025
【図２４】
2019028557.tif 000026
【図２５】
2019028557.tif 000027
【図２６】
2019028557.tif 000028
【図２７】
2019028557.tif 000029
【図２８】
2019028557.tif 000030