(57)【特許請求の範囲】
【請求項１】
共有資源の更新状態を示す制御情報を保持する資源制御部と、
前記共有資源を更新する前に前記資源制御部の制御情報を更新し、前記共有資源を更新後に前記資源制御部の制御情報をさらに更新する第１の処理部と、
前記資源制御部の制御情報を基に前記第１の処理部が前記共有資源を更新中か否かの判定である第１の判定を行い、更新中でない場合は前記共有資源を参照し、更新中の場合は更新終了後に前記共有資源を参照し、前記共有資源の参照後、前記資源制御部の制御情報を基に参照中に前記共有資源の更新が発生したか否かを判定である第２の判定を行い、更新が発生した場合、前記共有資源を再度参照する第２の処理部と
を含み、
前記資源制御部の前記制御情報は、
前記共有資源の更新前に更新される開始変数と、
前記共有資源の更新後に更新される終了変数と
を含み、
前記開始変数が、前記共有資源の更新後に前記終了変数が更新されるときに更新されず、
前記終了変数が、前記共有資源の更新前に前記開始変数が更新されるときに更新されない
情報処理装置。
【請求項２】
前記開始変数及び前記終了変数の初期値が０であり、
前記開始変数及び前記終了変数が、更新として、１を加算される
請求項１に記載の情報処理装置。
【請求項３】
前記第２の処理部は、
前記共有資源の参照前に前記資源制御部から取り出した前記制御情報を第１の変数として前記第１の判定を行い、
前記共有資源の参照後に前記資源制御部から取り出した前記制御情報を第２の変数として前記第１の変数及び前記第２の変数を基に前記第２の判定を行う
請求項１又は請求項２に記載の情報処理装置。
【請求項４】
共有資源の更新状態を示す制御情報を保持し、
前記共有資源を更新する場合、前記共有資源を更新する前に前記制御情報を更新し、前記共有資源を更新後に前記制御情報をさらに更新し、
前記共有資源を参照する場合、前記制御情報を基に前記共有資源を更新中か否かの判定である第１の判定を行い、更新中でない場合は前記共有資源を参照し、更新中の場合は更新終了後に前記共有資源を参照し、前記共有資源の参照後、前記制御情報を基に参照中に前記共有資源の更新が発生したか否かを判定である第２の判定を行い、更新が発生した場合、前記共有資源を再度参照し、
前記制御情報は、
前記共有資源の更新前に更新される開始変数と、
前記共有資源の更新後に更新される終了変数と
を含み、
前記開始変数が、前記共有資源の更新後に前記終了変数が更新されるときに更新されず、
前記終了変数が、前記共有資源の更新前に前記開始変数が更新されるときに更新されない
情報処理方法。
【請求項５】
共有資源の更新状態を示す制御情報を保持する処理と、
前記共有資源を更新する場合、前記共有資源の更新の前に前記制御情報を更新し、前記共有資源の更新後に前記制御情報をさらに更新する処理と、
前記共有資源を参照する場合、前記制御情報を基に前記共有資源を更新中か否かの判定である第１の判定を行い、更新中でない場合は前記共有資源を参照し、更新中の場合は更新終了後に前記共有資源を参照し、前記共有資源の参照後、前記制御情報を基に参照中に前記共有資源の更新が発生したか否かを判定である第２の判定を行い、更新が発生した場合、前記共有資源を再度参照する処理と
をコンピュータに実行させ、
さらに、前記制御情報に、
前記共有資源の更新前に更新される開始変数と、
前記共有資源の更新後に更新される終了変数と
を含み、
前記開始変数が、前記共有資源の更新後に前記終了変数が更新されるときに更新されず、
前記終了変数が、前記共有資源の更新前に前記開始変数が更新されるときに更新されないように処理を実行させる
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理に関し、特に、複数の処理部からアクセスする資源（リソース）管理に関する。
【背景技術】
【０００２】
情報処理システム、又は、情報処理装置は、各処理を実行する複数の処理単位（例えば、処理装置、プロセッサ、又は、プロセス。以下、これら処理単位をまとめてプロセッサと言う）が動作している。このように、複数（マルチ）のプロセッサを含むシステムは、マルチプロセッサシステムを言われる。マルチプロセッサシステムは、複数のプロセッサがアクセスする（共有する）資源（リソース）の整合性を保つため、排他制御の機能を備える。
【０００３】
ここで、共有リソースは、例えば、ホストメモリ、外部記憶装置、出力装置、又は、入力装置である。
【０００４】
共有リソースの排他制御として用いられる同期の基本（プリミティブ）構造としては、ミューテックスやセマフォのようなロックを用いた不可分（アトミック）操作がある。（例えば、特許文献１及び特許文献２を参照）
上記の特許文献１及び特許文献２のシステムのプロセッサは、共有リソースを使用する場合、次のように動作する。
【０００５】
まず、プロセッサは、共有リソースのロックの有無を確認する。
【０００６】
ロックされていない（解除状態の）場合、プロセッサは、共有リソースのロックを取得する。そして、プロセッサは、共有リソースを処理し、処理後ロックを解除する。
【０００７】
ロックされている（ロック設定の）場合、プロセッサは、ロックが解除されるまで待ち、ロック解除後に共有リソースのロックを取得し、処理を継続する。
【０００８】
あるいは、マルチプロセッサシステムを構成するプロセッサ、特に個別の命令を処理するＣＰＵ(Central Processing Unit)が、アトミック性を備えた特別な命令を備え、アトミックな操作を実現し、排他制御を実現する。このような命令は、例えば、テスト・アンド・セット（TAS：Test And Set）命令やコンペア・アンド・スワップ（CAS：Compare And Swap）命令である。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平０７−０８４８５１
【特許文献２】特開２０１０−１４０２９０
【発明の概要】
【発明が解決しようとする課題】
【００１０】
上記のＴＡＳ命令やＣＡＳ命令を用いるシステムは、これらの命令を備えた特別なＣＰＵ又はハードウェアが必要であるという問題点があった。
【００１１】
また、特許文献１及び特許文献２に記載のシステムは、アクセスの内容に関係せずに、共有リソースの処理においてロック取得が必要である問題点があった。
【００１２】
この問題点のため、特許文献１及び特許文献２に記載のシステムは、ロック取得の競合が増加し、次のような性能低下を発生させる問題点があった。
【００１３】
（１）ロックの競合が増加すると、ロック取得の失敗の頻度が高くなる。その結果、プロセッサは、ロック待ちとなる場合が増加する。
【００１４】
（２）ロック待ちが増加すると、キャッシュがページアウトされて無効（インバリッド）となる頻度が高くなる。つまり、キャッシュミス率が高くなる。その結果、プロセッサは、処理におけるページインの頻度が高くなり、処理時間が多くなる。
【００１５】
（３）共有リソースを参照するプロセッサが並列に処理できない。
【００１６】
これらの問題点は、大規模マルチプロセッサの構成において、特に著しい性能悪化の原因となる。
【００１７】
本発明の目的は、上記問題点を解決し、特別な命令を用いずに、性能の低下を削減した共有リソースの利用を実現する、情報処理装置、及び、情報処理方法を提供することにある。
【課題を解決するための手段】
【００１８】
本発明の情報処理装置は、共有資源の更新状態を示す制御情報を保持する資源制御部と、前記共有資源を更新する前に前記資源制御部の制御情報を更新し、前記共有資源を更新後に前記資源制御部の制御情報をさらに更新する第１の処理部と、前記資源制御部の制御情報を基に前記第１の処理部が前記共有資源を更新中か否かの判定である第１の判定を行い、更新中でない場合は前記共有資源を参照し、更新中の場合は更新終了後に前記共有資源を参照し、前記共有資源の参照後、前記資源制御部の制御情報を基に参照中に前記共有資源の更新が発生したか否かを判定である第２の判定を行い、更新が発生した場合、前記共有資源を再度参照する第２の処理部とを含む。
【００１９】
本発明の情報処理方法は、共有資源の更新状態を示す制御情報を保持し、前記共有資源を更新する場合、前記共有資源を更新する前に前記制御情報を更新し、前記共有資源を更新後に前記制御情報をさらに更新し、前記共有資源を参照する場合、前記制御情報を基に前記共有資源を更新中か否かの判定である第１の判定を行い、更新中でない場合は前記共有資源を参照し、更新中の場合は更新終了後に前記共有資源を参照し、前記共有資源の参照後、前記制御情報を基に参照中に前記共有資源の更新が発生したか否かを判定である第２の判定を行い、更新が発生した場合、前記共有資源を再度参照する。
【００２０】
本発明のプログラムは、共有資源の更新状態を示す制御情報を保持する処理と、前記共有資源を更新する場合、前記共有資源の更新の前に前記制御情報を更新し、前記共有資源の更新後に前記制御情報をさらに更新する処理と、前記共有資源を参照する場合、前記制御情報を基に前記共有資源を更新中か否かの判定である第１の判定を行い、更新中でない場合は前記共有資源を参照し、更新中の場合は更新終了後に前記共有資源を参照し、前記共有資源の参照後、前記制御情報を基に参照中に前記共有資源の更新が発生したか否かを判定である第２の判定を行い、更新が発生した場合、前記共有資源を再度参照する処理とをコンピュータに実行させる。
【発明の効果】
【００２１】
本発明によれば、特別な命令を用いずに、性能の低下を削減した共有リソースの利用を実現できる。
【図面の簡単な説明】
【００２２】
【図１】図１は、本発明における第１の実施形態に係る情報処理装置の構成の一例を示すブロック図である。
【図２】図２は、第１の実施形態に係る資源制御部の構成一例を示すブロック図である。
【図３】図３は、第１の実施形態に係る情報処理装置の共有データの更新動作の一例を示すフローチャートである。
【図４】図４は、第１の実施形態に係る情報処理装置の更新動作の一例を示すシーケンス図である。
【図５】図５は、第１の実施形態に係る情報処理装置の共有データの参照動作の一例を示すフローチャートである。
【図６】図６は、第１の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図７】図７は、第１の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図８】図８は、第１の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図９】図９は、第１の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図１０】図１０は、第１の実施形態の係る情報処理装置の別の構成の一例を示すブロック図である。
【図１１】図１１は、第１の実施形態の係る情報処理装置の参照動作の別の一例を示すフローチャートである。
【図１２】図１２は、第２の実施形態に係る資源制御部の構成一例を示すブロック図である。
【図１３】図１３は、第２の実施形態に係る情報処理装置の共有データの更新動作の一例を示すフローチャートである。
【図１４】図１４は、第２の実施形態に係る情報処理装置の更新動作の一例を示すシーケンス図である。
【図１５】図１５は、第２の実施形態に係る情報処理装置の共有データの参照動作の一例を示すフローチャートである。
【図１６】図１６は、第２の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図１７】図１７は、第２の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図１８】図１８は、第２の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【図１９】図１９は、第２の実施形態に係る情報処理装置の参照動作の一例を示すシーケンス図である。
【発明を実施するための形態】
【００２３】
次に、本発明の実施形態について図面を参照して説明する。
【００２４】
なお、各図面は、本発明の実施形態を説明するものである。そのため、本発明は、各図面の記載に限られるわけではない。また、各図面の同様の構成には、同じ番号を付し、その繰り返しの説明は、省略する場合がある。
【００２５】
（第１の実施形態）
図１は、本発明おける第１の実施形態に係る情報処理装置１０の構成の一例を示すブロック図である。なお、図１において、本実施形態の説明に関係しない構成（例えば、入出力部）は、省略した。
【００２６】
情報処理装置１０は、プロセッサ２０ａと、プロセッサ２０ｂと、資源制御部３０とを含む。
【００２７】
プロセッサ２０ａとプロセッサ２０ｂとをまとめて、プロセッサ２０と言う。
【００２８】
プロセッサ２０は、資源制御部３０を用いて、図示しない共有リソースを使用する。
【００２９】
より詳細な動作は、後ほど説明するが、プロセッサ２０は、資源制御部３０を、次のように用いる。
【００３０】
プロセッサ２０は、共有リソースを更新（例えば、データを更新）する場合、資源制御部３０が含む情報（以下、「制御情報３０ａ」と言う）を更新して変更処理を進める。つまり、プロセッサ２０は、制御情報３０ａの変化に基づいて、共有リソースの更新を検出できる。
【００３１】
なお、図１において、プロセッサ２０ａ及びプロセッサ２０ｂを２つ示した例示である。情報処理装置１０は、３つ以上のプロセッサ２０を含んでも良い。
【００３２】
また、プロセッサ２０は、情報処理装置１０の処理の単位の一例である。プロセッサ２０は、ＣＰＵのように単独のプロセッサでもよく、ＣＰＵとＲＯＭ（Read Only Memory）とＲＡＭ（Random Access Memory）と記憶装置と含むコンピュータのような装置でもよく、ＣＰＵ上で実行されるプロセス、スレッド又はタスクでもよい。そのため、プロセッサ２０は、「処理部」と言うこともできる。
【００３３】
資源制御部３０は、共有リソースに対応する制御情報３０ａを保持する。既に説明しているが、制御情報３０ａは、共有リソースの更新の状態を示す情報である。なお、制御情報３０ａは、更新を示す情報として変数（制御用の変数）を含む。
【００３４】
なお、情報処理装置１０は、共有資源（リソース）毎に資源制御部３０を含んでも良い。あるいは、資源制御部３０は、複数の共有リソースに対応しても良い。
【００３５】
ただし、以下では、説明を明確にするため、資源制御部３０及び対象となる共有リソースを１つとして説明する。
【００３６】
次に、本実施形態の情報処理装置１０の動作について説明する。
【００３７】
本実施形態の資源制御部３０の制御情報３０ａが含む制御用の変数に特に制限はない。ただし、本実施形態は、図２に示すように、制御情報３０ａとして開始変数３１と終了変数３２とを含むとして説明する。
【００３８】
共有リソースを更新するプロセッサ２０は、更新処理の開始時に開始変数３１を更新する。
【００３９】
また、共有リソースを更新するプロセッサ２０は、更新処理の終了時に終了変数３２を更新する。
【００４０】
なお、開始変数３１及び終了変数３２の更新内容は、予め、情報処理装置１０において、共有リソースを参照するプロセッサ２０が判別できるように決めておけば特に制限はない。本実施形態の説明では、一例として、開始変数３１及び終了変数３２の初期値をどちらも「０」とし、更新を「１加算」として説明する。つまり、開始変数３１と終了変数３２は、更新中ではない場合、同じ値となり、更新中の場合、異なる値となる。
【００４１】
また、共有リソースの変更及び参照は、いずれのプロセッサ２０が行っても良い。ただし、以下、説明の便宜のため、特に断らない限り、プロセッサ２０ａが共有リソースを更新し、プロセッサ２０ｂが共有リソースを参照する。
【００４２】
まず、共有リソースの更新動作について説明する。
【００４３】
プロセッサ２０ａは、共有リソースを更新する場合、共有リソースが他のプロセッサから更新されることを防ぐため、排他機構を用いて占有する。この占有は、特に制限はない。例えば、プロセッサ２０ａは、資源制御部３０を占有（ロック設定）しても良い。あるいは、プロセッサ２０ａは、一般的な排他機構（例えば、共有リソースのロック機構）を用いてもよい。そのため、共有リソースの占有についての詳細な説明は、省略する。
【００４４】
そして、プロセッサ２０ａは、共有リソースを更新するときに、次に説明する動作を行う。
【００４５】
図３は、本実施形態の情報処理装置１０の更新動作の一例を示すフローチャートである。
【００４６】
プロセッサ２０ａは、開始変数３１を更新（１加算）する（ステップ１０１）。
【００４７】
次に、プロセッサ２０ａは、共有リソースの仕様を基に更新に必要な保護機構を設定する（ステップ１０２）。プロセッサ２０ａは、この動作を、共有リソースの仕様に従って行う。例えば、共有リソースがメモリの場合、プロセッサ２０ａは、メモリの順序性を保障するメモリバリア（メモリフェンス）を設定する。なお、既にプロセッサ２０ａが、共有リソースを占有しているため、更なる保護機構が不要な場合、プロセッサ２０ａは、ステップ１０２を省略しても良い。
【００４８】
保護を設定後、プロセッサ２０ａは、共有リソースを更新する（ステップ１０３）。
【００４９】
更新後、プロセッサ２０ａは、保護機構を解除する（ステップ１０４）。なお、ステップ１０２を省略した場合、プロセッサ２０ａは、ステップ１０４を省略する。
【００５０】
その後、プロセッサ２０ａは、終了変数３２を更新（１加算）する（ステップ１０５）。
【００５１】
全ての更新が終了すると、プロセッサ２０ａは、共有リソースの占有を解除（ロック解除）する。
【００５２】
図４は、情報処理装置１０の更新動作の一例のシーケンス図である。図４において、共有リソースの保護機能についての動作を省略した。
【００５３】
プロセッサ２０ａは、開始変数３１を更新する（１００１）。
【００５４】
そして、プロセッサ２０ａは、共有リソースを更新する（１００２）。
【００５５】
その後、プロセッサ２０ａは、終了変数３２を更新する（１００３）。
【００５６】
このような動作を基に、情報処理装置１０は、共有リソースの更新に関して、次の状態を実現する。
【００５７】
（１）更新中、開始変数３１の値と終了変数３２の値とが異なる。
【００５８】
（２）更新の後の開始変数３１及び終了変数３２の値が、更新前の開始変数３１及び終了変数３２の値と異なる。
【００５９】
このように、共有リソースを更新するプロセッサ２０ａは、更新の前に開始変数３１を更新し、更新終了後に終了変数３２を更新する。
【００６０】
なお、図４には、参考として、プロセッサ２０ｂが、共有リソースを更新する場合のシーケンス（１００４−１００６）も示している。プロセッサ２０ｂは、プロセッサ２０ａのロック解除後、共有リソースのロックを設定してから、図４に示す動作を実行する。
【００６１】
次に、本実施形態の情報処理装置１０が、共有リソースを参照する場合の動作について説明する。
【００６２】
図５は、情報処理装置１０の参照動作の一例を示すフローチャートである。
【００６３】
共有リソースを参照するプロセッサ２０ｂは、参照の前に開始変数３１と終了変数３２（以下、合わせて「両変数」と言う）を読み出す（ステップ２０１）。以下、ステップ２０１で読み出した変数を「第１の変数」と言う。
【００６４】
プロセッサ２０ｂは、第１の開始変数３１と第１の終了変数３２との値を確認する（ステップ２０２）。具体的には、プロセッサ２０ｂは、第１の開始変数３１と第１の終了変数３２とが同じか否かを判定する。この判定は、上記のとおり、共有リソースが更新中であるか否かの判定である。
【００６５】
第１の開始変数３１と第１の終了変数３２とが異なる、つまり、更新中の場合（ステップ２０２でＮＯ）、プロセッサ２０ｂは、ステップ２０１に戻り、更新が終了するまで待つ。プロセッサ２０ｂは、この待ちを、ステップ２０１と２０２との繰り返し（スピンロック）として待つ。ただし、本実施形態の情報処理装置１０は、スピンロックに限る必要はない。例えば、プロセッサ２０ｂは、図示しないウェイト管理機構を備え、ウェイト状態として再開を待っても良い。
【００６６】
第１の開始変数３１と第１の終了変数３２とが一致、つまり更新中でない場合（ステップ２０２でＹＥＳ）、プロセッサ２０ｂは、共有データを参照、例えば、データを読み出す（ステップ２０３）。
【００６７】
参照が終了すると、プロセッサ２０ｂは、両変数を読み出す（ステップ２０４）。ステップ２０４で読み出した変数を「第２の変数」と言う。
【００６８】
次に、プロセッサ２０ｂは、第１の終了変数３２と第２の終了変数３２とを確認する（ステップ２０５）。具体的には、プロセッサ２０ｂは、第１の終了変数３２と第２の終了変数３２とが同じか否かを判定する。この判定は、第１の両変数を読み出した後、終了した更新処理が発生したか否かの判定である。
【００６９】
第１の終了変数３２と第２の終了変数３２が異なる、つまり、終了した更新が発生した場合（ステップ２０５でＮＯ）、プロセッサ２０ｂは、ステップ２０１に戻り、最初から参照動作を始める。ステップ２０１に戻るのは、共有リソースが更新されているため、ステップ２０３での参照が無効の可能性があるためである。
【００７０】
第１の終了変数３２と第２の終了変数３２とが同じ場合（ステップ２０５でＹＥＳ）、プロセッサ２０ｂは、第２の開始変数３１と第２の終了変数３２とを確認する（ステップ２０６）。具体的には、プロセッサ２０ｂは、第２の開始変数３１と第２の終了変数３２が同じか否かを判定する。この判定は、新しい更新動作中であるか否かの判定である。
【００７１】
第２の開始変数３１と第２の終了変数３２とが異なる、つまり、更新中の場合(ステップ２０６でＮＯ）、プロセッサ２０ｂは、ステップ２０１に戻り、最初から参照動作を始める。ステップ２０１に戻るのは、共有リソースの更新が開始されているため、ステップ２０３での参照が無効の可能性があるためである。
【００７２】
第２の開始変数３１と第２の終了変数３２とが同じ場合（ステップ２０６でＹＥＳ）、プロセッサ２０ｂは、参照動作を終了する。その後、プロセッサ２０ｂは、適宜、次の動作に移る。
【００７３】
なお、ステップ２０５とステップ２０６は、どちらも変数の判定の動作である。そのため、情報処理装置１０は、この動作を分けず、１つの判定動作としても良い。
【００７４】
このように、共有リソースを参照するプロセッサ２０ｂは、共有リソースに排他機構を設定されているか否かに係わらず、開始変数３１と終了変数３２とを基に、共有リソースを参照できる。
【００７５】
次に、情報処理装置１０が、適切に共有リソースを参照できることを、図６−図９を参照して説明する。なお、図面の煩雑さを避けるため、図６−図９において、図５のステップ２０５とステップ２０６との判断は、１つの判断として示す。
【００７６】
まず、共有リソースの更新動作と参照動作とが重ならない場合について説明する。
【００７７】
図６は、プロセッサ２０ａが共有リソースの更新後に、プロセッサ２０ｂが参照動作を開始した場合のシーケンス図である。
【００７８】
プロセッサ２０ｂは、第１の両変数を読み出す（２００１）。この場合、第１の開始変数３１及び終了変数３２は、同じ値（図６では「０１」）となる。
【００７９】
そのため、第１の開始変数３１と第１の終了変数３２との判定（図５のステップ２０２）は、ＹＥＳとなる（２００２）。
【００８０】
そして、プロセッサ２０ｂは、共有リソースを参照する（２００３）。
【００８１】
参照後、プロセッサ２０ｂは、第２の両変数を読み出す（２００４）。この場合、第２の開始変数３１及び終了変数３２は、第１の開始変数３１及び終了変数３２と同じ値（図６では「０１」）となる。
【００８２】
そのため、ステップ２０５及び２０６に対応する変数の判定は、どちらもＹＥＳとなる（２００５）。
【００８３】
その結果、プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【００８４】
次に、プロセッサ２０ａが更新動作中に、プロセッサ２０ｂが参照動作を開始した場合について説明する。
【００８５】
図７は、プロセッサ２０ａが更新動作中に、プロセッサ２０ｂが参照動作を開始した場合のシーケンス図である。
【００８６】
プロセッサ２０ｂは、第１の両変数を読み出す（３００１）。この場合、プロセッサ２０ａは、更新中である。そのため、第１の開始変数３１及び第１の終了変数３２は、異なる値（図７では、開始変数３１が「０１」、終了変数３２が「００」）となる。
【００８７】
そのため、第１の開始変数３１と第１の終了変数３２との判定（図５のステップ２０２）は、ＮＯとなる（３００２）。
【００８８】
プロセッサ２０ａの更新動作が終了するまで、第１の開始変数３１と終了変数３２とが異なる。そのため、プロセッサ２０ｂは、図５のステップ２０１−２０２（図７では、３００１−３００２）を繰り返す。
【００８９】
プロセッサ２０ａが更新動作を終了すると、第１の開始変数３１と終了変数３２とが同じ値となる。
【００９０】
その後、プロセッサ２０ｂが、第１の両変数を読み出す（３００３）と、第１の開始変数３１及び第１の終了変数３２は、同じ値（図７では「０１」）である。
【００９１】
そのため、第１の開始変数３１と第１の終了変数３２との判定（図５のステップ２０２）は、ＹＥＳとなる（３００４）。
【００９２】
これ以降、プロセッサ２０ｂは、図６の２００３−２００５と同様に動作する。
【００９３】
つまり、プロセッサ２０ｂは、共有リソースを参照する（３００５）。
【００９４】
参照後、プロセッサ２０ｂは、第２の両変数を読み出す（３００６）。この場合、第２の開始変数３１及び終了変数３２は、第１の開始変数３１及び終了変数３２と同じ値（図７では「０１」）である。
【００９５】
そのため、ステップ２０５及び２０６に対応する変数の判定は、どちらもＹＥＳとなる（３００７）。
【００９６】
その結果、プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【００９７】
次に、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始した場合について説明する。まず、プロセッサ２０ｂの第２の変数の確認前に、プロセッサ２０ａの更新動作が終了した場合について説明する。
【００９８】
図８は、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始し、プロセッサ２０ｂの第２の変数の確認前に、プロセッサ２０ａの更新動作が終了した場合のシーケンス図である。
【００９９】
プロセッサ２０ｂは、第１の両変数を読み込む（４００１）。この場合、第１の開始変数３１及び終了変数３２は、同じ値（図８では「００」）である。
【０１００】
そのため、第１の開始変数３１と第１の終了変数３２との判定（図５のステップ２０２）は、ＹＥＳとなる（４００２）。
【０１０１】
プロセッサ２０ｂは、共有リソースを参照する（４００３）。
【０１０２】
ただし、プロセッサ２０ａは、プロセッサ２０ｂが共有リソースを参照中に、共有リソースを更新する。そのため、開始変数３１及び終了変数３２は、どちらも更新（図８ではどちらも「０１」）される。
【０１０３】
参照後、プロセッサ２０ｂは、第２の両変数を読み出す（４００４）。上記のとおり、第２の両変数は、更新された後のため、第１の両変数とは異なる。
【０１０４】
そのため、プロセッサ２０ｂの変数の判定、具体的には、図５のステップ２０５の判定がＮＯとなる（４００５）。
【０１０５】
その結果、プロセッサ２０ｂは、参照動作の最初（図５のステップ２０１）に戻り、参照動作をやり直す。つまり、プロセッサ２０ｂは、図６の２００１−２００５に相当する図８の４００６−４０１０を実行する。
【０１０６】
具体的に説明すると次のとおりである。
【０１０７】
プロセッサ２０ｂは、第１の両変数を読み出す（４００６）。第１の開始変数３１及び終了変数３２は、同じ値（図８では、「０１」）となる。
【０１０８】
プロセッサ２０ｂは、第１の開始変数３１と終了変数３２を判定する（４００７）。
【０１０９】
第１の両変数が同じため、プロセッサ２０ｂは、共有リソースを参照する（４００８）。
【０１１０】
参照後、プロセッサ２０ｂは、第２の両変数を読み出す（４００９）。この場合、第２の両変数は、第１の両変数と同じ値（図８では「０１」）である。
【０１１１】
そのため、プロセッサ２０ｂの変数の判定は、ＹＥＳとなる（４０１０）。
【０１１２】
プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０１１３】
続いて、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始し、プロセッサ２０ｂの第２の変数の確認時に、プロセッサ２０ａの更新動作が終了していない場合について説明する。
【０１１４】
図９は、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始し、プロセッサ２０ｂの第２の変数の確認時に、プロセッサ２０ａの更新動作が終了していない場合のシーケンス図である。
【０１１５】
プロセッサ２０ｂは、第１の両変数を読み出す（５００１）。この場合、第１の開始変数３１及び終了変数３２は、同じ値（図９では「００」）である。
【０１１６】
そのため、第１の開始変数３１と第１の終了変数３２との判定（図５のステップ２０２）は、ＹＥＳとなる（５００２）。
【０１１７】
プロセッサ２０ｂは、共有リソースを参照する（５００３）。
【０１１８】
ただし、プロセッサ２０ａは、プロセッサ２０ｂが共有リソースを参照中に、共有リソースの更新を開始している。そのため、開始変数３１は、更新（図９では「０１」）されている。
【０１１９】
参照後、プロセッサ２０ｂは、第２の両変数を読み出す（５００４）。上記のとおり、第２の開始変数３１は、更新されたため、第２の終了変数３２と異なる。
【０１２０】
そのため、プロセッサ２０ｂの変数の判定、具体的には、図５のステップ２０６の判定がＮＯとなる（５００５）。
【０１２１】
そのため、プロセッサ２０ｂは、参照動作の最初（図５のステップ２０１）に戻り、参照動作をやり直す。
【０１２２】
これ以降の動作は、図７と同様の動作になる。
【０１２３】
つまり、プロセッサ２０ｂは、第１の開始変数３１と終了変数３２が一致するまで、両変数の読み出しと判定を繰り返す。
【０１２４】
プロセッサ２０ａが、更新を終了すると、開始変数３１と終了変数３２とが同じ値（図９では「０１」）となる。
【０１２５】
その後、プロセッサ２０ｂが、第１の両変数を読み出す（５００６）と、第１の開始変数３１及び終了変数３２は、同じ値（図９では、「０１」）である。
【０１２６】
プロセッサ２０ｂは、第１の開始変数３１と終了変数３２を判定する（５００７）。
【０１２７】
第１の変数が同じため、プロセッサ２０ｂは、共有リソースを参照する（５００８）。
【０１２８】
参照後、プロセッサ２０ｂは、第２の両変数を読み出す（５００９）。この場合、第２の両変数は、第１の両変数と同じ値（図９では「０１」）である。
【０１２９】
そのため、プロセッサ２０ｂの変数の判定は、ＹＥＳとなる（５０１０）。
【０１３０】
プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０１３１】
このように構成された第１の実施形態の情報処理装置１０は、特別な命令を用いずに、性能の低下を削減した排他制御を実現する効果を得ることができる。
【０１３２】
その理由は、次のとおりである。
【０１３３】
情報処理装置１０は、制御情報３０ａとして開始変数３１及び終了変数３２を含む。
【０１３４】
そして、共有リソースを更新するプロセッサ２０ａは、占有している共有リソースの更新を開始するときに開始変数３１を更新し、更新を終了したときに終了変数３２を更新する。
【０１３５】
プロセッサ２０ｂに基づく共有リソースの参照は、共有リソースに影響を与えない。そのため、プロセッサ２０ｂは、いつでも共有リソースを参照できる。さらに、プロセッサ２０ｂは、開始変数３１及び終了変数３２を基に、共有リソースが更新中であるか否か、及び、参照中に更新が発生したか否かを判定できる。
【０１３６】
つまり、プロセッサ２０ｂは、更新が発生していない場合、常に共有リソースを参照できる。そして、更新中の場合、プロセッサ２０ｂは、更新終了後に共有リソースを参照できる。また、参照中に更新が発生した場合、プロセッサ２０ｂは、参照後に、更新の発生を検出できるため、再度参照し、更新後の共有リソースを参照できる。
【０１３７】
このように、共有リソースを参照するプロセッサ２０ｂは、共有リソースが更新するプロセッサ２０ａに占有されている場合でも、共有リソースを参照できる。
【０１３８】
つまり、本実施形態の情報処理装置１０の共有リソースを参照するプロセッサ２０ｂは、共有リソースを占有しているプロセッサ２０ａの占有解除を待たなくても、共有リソースを参照できる。
【０１３９】
このため、本実施形態の情報処理装置１０は、共有リソースの参照において、占有の解除の待ち時間を削減できる。その結果、情報処理装置１０は、占有解除の待ち時間に基づく性能低下を削減できる。
【０１４０】
また、本実施形態の情報処理装置１０の共有リソースを参照するプロセッサ２０ｂは、開始変数３１及び終了変数３２を用い、ロック設定及び解除せずに共有リソースを参照できる。
【０１４１】
そのため、共有リソースを参照するプロセッサ２０ｂは、ロックの取得や解除などの処理を必要としない。そのため、情報処理装置１０は、さらに、性能低下の低減できる。また、情報処理装置１０は、ロックの競合を低減できる。
【０１４２】
さらに、共有リソースを参照するプロセッサ２０ｂは、ロック取得が必要ないため、並列処理が可能である。その結果、情報処理装置１０の処理性能が、さらに向上できるためである。
【０１４３】
なお、本実施形態の情報処理装置１０の構成は、これまでの説明に限らない。情報処理装置１０は、複数の構成を１つの構成としても良い。あるいは、情報処理装置１０は、１つの構成を複数の構成に分けても良い。また、情報処理装置１０は、ＣＰＵ（Central Processing Unit）と、ＲＯＭ（Read Only Memory）と、ＲＡＭ（Random Access Memory）とを含むコンピュータとして実現しても良い。
【０１４４】
図１０は、本実施形態の別の構成である情報処理装置６０の構成の一例を示す図である。
【０１４５】
情報処理装置６０は、ＣＰＵ６１０ａと、ＣＰＵ６１０ｂと、ＲＯＭ６２０と、ＲＡＭ６３０と、ＩＯ（Input/Output）６４０と、内部記憶装置６５０と、キーボード６６０と、マウス６７０と、ディスプレイ６８０と、ＮＩＣ６９０とを含み、コンピュータを構成している。
【０１４６】
ＣＰＵ６１０ａ及びＣＰＵ６１０ｂは、ＲＯＭ６２０、又は、ＩＯ６４０を介して内部記憶装置６５０からプログラムを読み込む。そして、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂは、読み込んだプログラムに基づいて、既に説明した本実施形態の情報処理装置１０のプロセッサ２０として各機能を実現する。ＣＰＵ６１０ａ及びＣＰＵ６１０ｂは、各機能を実現する際に、ＲＡＭ６３０及び内部記憶装置６５０を一時記憶として使用する。また、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂは、資源制御部３０としてＲＡＭ６３０又は内部記憶装置６５０を用いる。また、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂは、ＮＩＣ６９０を介して、図示しない他の処理装置と情報をやり取りする。さらに、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂは、ＩＯ６４０を介して、キーボード６６０及びマウス６７０から入力データを受信し、ディスプレイ６８０に表示データを表示する。
【０１４７】
なお、ＣＰＵ６１０ａ又はＣＰＵ６１０ｂは、コンピュータで読み取り可能にプログラムを記憶した記憶媒体７００が含むプログラムを、図示しない記憶媒体読み取り装置を用いて読み込んでも良い。あるいは、ＣＰＵ６１０ａ又はＣＰＵ６１０ｂは、ＮＩＣ６９０を介してネットワークに接続された図示しない外部記憶装置からプログラムを読み込んでも良い。
【０１４８】
ＲＯＭ６２０は、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂが実行するプログラム、及び、固定的なデータを記憶する。ＲＯＭ６２０は、例えば、Ｐ−ＲＯＭ(Programmable-ROM）やフラッシュＲＯＭである。
【０１４９】
ＲＡＭ６３０は、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂが実行するプログラムやデータを一時的に記憶する。ＲＡＭ６３０は、資源制御部３０として動作しても良い。ＲＡＭ６３０は、例えば、Ｄ−ＲＡＭ（Dynamic-RAM）である。
【０１５０】
ＩＯ６４０は、内部記憶装置６５０やキーボード６６０などとＣＰＵ６１０ａ及びＣＰＵ６１０ｂとのデータを仲介する。ＩＯ６４０は、例えば、ＩＯインターフェースカードである。
【０１５１】
内部記憶装置６５０は、情報処理装置６０の長期的に保存するデータやプログラムを保存する。また、内部記憶装置６５０は、資源制御部３０として動作してもよい。さらに、内部記憶装置６５０は、ＣＰＵ６１０ａ及びＣＰＵ６１０ｂの一時記憶装置として動作しても良い。内部記憶装置６５０は、例えば、ハードディスク装置、光磁気ディスク装置、ＳＳＤ（Solid State Drive）、又は、ディスクアレイ装置である。
【０１５２】
キーボード６６０及びマウス６７０は、情報処理装置６０の操作者からの入力指示を受信する入力部である。キーボード６６０及びマウス６７０は、受信した入力指示のデータをＣＰＵ６１０ａ又はＣＰＵ６１０ｂに送信する。
【０１５３】
ディスプレイ６８０は、情報処理装置６０の表示部である。ＣＰＵ６１０ａ又はＣＰＵ６１０ｂは、操作者に必要な情報を、ディスプレイ６８０に表示する。
【０１５４】
ＮＩＣ６９０は、ネットワークを介した他の装置との情報のやり取りを中継する。ＮＩＣ６９０は、例えば、ＬＡＮカードである。
【０１５５】
このように構成された情報処理装置６０は、情報処理装置１０と同様の効果を得ることができる。
【０１５６】
その理由は、情報処理装置６０のＣＰＵ６１０ａ及びＣＰＵ６１０ｂが、プログラムに基づいて情報処理装置１０のプロセッサ２０と同様の動作を実現できるためである。
（変形例１）
第１の実施形態の情報処理装置１０は、開始変数３１と終了変数３２とを基に、共有リソースの更新を検出する。ただし、本実施形態の情報処理装置１０の参照動作は、図５を用いた説明の動作に限らない。
【０１５７】
図１１は、第１の実施形態に係る情報処理装置１０の参照動作の別の動作の一例を示すフローチャートである。
【０１５８】
図１１において、図５との差は、図５のステップ２０５とステップ２０６を、ステップ３０５に変更した点である。そのため、ステップ３０５について説明し、他の説明は省略する。
【０１５９】
図５に示した参照動作において、プロセッサ２０ｂは、次を確認した。
【０１６０】
ステップ２０５において、プロセッサ２０ｂは、第１の終了変数３２と第２の終了変数３２が一致する否か、つまり、参照開始時に終了した更新と、参照終了後に終了した更新とが、一致するか否かを判定する。
【０１６１】
ステップ２０６において、プロセッサ２０ｂは、第２の開始変数３１と第２の終了変数３２が一致するか否か、つまり、参照終了時に更新中か否かを判定する。
【０１６２】
しかし、プロセッサ２０ｂは、ステップ２０２において、更新中でないことを確認してから参照動作を開始している。
【０１６３】
そのため、プロセッサ２０ｂは、参照終了時に、参照中に更新が発生したか否かを判定しても良い。
【０１６４】
そのため、本変形例のプロセッサ２０ｂは、ステップ３０５において、第１の開始変数３１と第２の開始変数３１が一致する否か、つまり、参照終了時に、更新が発生したか否かを判定する。
【０１６５】
更新が発生した場合（ステップ３０５のＮＯ）、プロセッサ２０ｂは、ステップ２０１に戻り、参照動作を最初から再開する。
【０１６６】
更新が発生していない場合（ステップ３０５でＹＥＳ）、プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０１６７】
変形例１の情報処理装置１０は、第１の実施形態の情報処理装置１０と同様の効果を得ることができる。
【０１６８】
その理由は、変形例１の情報処理装置１０は、第１の実施形態の情報処理装置１０と同様に、共有リソースの参照中に発生した更新を検出でき、更新が発生した場合に、再度、参照動作が可能なためである。
【０１６９】
（第２の実施形態）
本実施形態の情報処理装置１０の制御情報３０ａは、図２に示す開始変数３１及び終了変数３２に限らない。
【０１７０】
第２の実施形態に係る情報処理装置１０の資源制御部３０は、図１２に示すように、制御情報３０ｂとして制御変数３３を含む。その他の構成は、第１の実施形態の同様のため、詳細な説明は省略し、制御変数３３に関係する構成について説明する。
【０１７１】
制御変数３３は、共有リソースの更新状態を示す。なお、制御変数３３は、初期値として特に制限はないが、以下の説明では、初期値を０（偶数）として説明する。なお、初期値を奇数とした場合、以下の説明において、偶数と奇数を入れ替えればよい。
【０１７２】
共有リソースを更新するプロセッサ２０ａは、共有リソースの更新の開始時と終了時に制御変数３３を更新（例えば、１加算）する。
【０１７３】
共有リソースを参照するプロセッサ２０ｂは、共有リソースの参照前と参照後の制御変数３３の値を基に、更新中、及び、参照中の更新の発生の有無を判定する。
【０１７４】
第２の実施形態の情報処理装置１０の動作について図を参照して説明する。
【０１７５】
図１３は、第２の実施形態の情報処理装置１０の更新動作の一例を示すフローチャートである。
【０１７６】
プロセッサ２０ａの更新における排他制御は、第１の実施形態の同様のため、詳細な説明は省略する。
【０１７７】
プロセッサ２０ａは、制御変数３３を更新（１加算）する（ステップ４０１）。つまり、制御変数３３は、奇数になる。
【０１７８】
次に、プロセッサ２０ａは、必要に応じて共有リソースに保護機構を設定する（ステップ４０２）。
【０１７９】
保護を設定後、プロセッサ２０ａは、共有リソースを更新する（ステップ４０３）。
【０１８０】
更新後、プロセッサ２０ａは、保護機構を解除する（ステップ４０４）。
【０１８１】
その後、プロセッサ２０ａは、制御変数３３を更新（１加算）する（ステップ４０５）。つまり、制御変数３３は、偶数に戻る。
【０１８２】
図１４は、第２の実施形態の情報処理装置１０の更新動作の一例のシーケンス図である。図１４においても、共有リソースの保護機能についての動作は、省略した。
【０１８３】
プロセッサ２０ａは、制御変数３３を（奇数に）更新する（１００７）。
【０１８４】
そして、プロセッサ２０ａは、共有リソースを更新する（１００８）。
【０１８５】
その後、プロセッサ２０ａは、制御変数３３を（偶数に）更新する（１００９）。
【０１８６】
このような動作を基に、情報処理装置１０は、共有リソースの更新に関して、次の状態を実現する。
【０１８７】
（１）更新中、制御変数３３は、奇数である。
【０１８８】
（２）更新の前後において、制御変数３３は、偶数であるが、値が異なる。
【０１８９】
なお、図１４には、参考として、他のプロセッサ２０の例として、プロセッサ２０ｂが、共有リソースを更新する場合のシーケンス（１０１０−１０１２）も示している。
【０１９０】
このように、共有リソースを更新するプロセッサ２０ａは、更新の前後において、制御変数３３を更新する。
【０１９１】
次に、本実施形態の情報処理装置１０が、共有リソースを参照する場合の動作について説明する。
【０１９２】
図１５は、第２の実施形態の情報処理装置１０の参照動作の一例を示すフローチャートである。
【０１９３】
共有リソースを参照するプロセッサ２０ｂは、参照の前に制御変数３３を読み出す（ステップ５０１）。以下、ステップ５０１で読み出した変数を「第１の制御変数３３」と言う。
【０１９４】
プロセッサ２０ｂは、第１の制御変数３３の値を確認する（ステップ５０２）。具体的には、プロセッサ２０ｂは、第１の制御変数３３が偶数か否かを判定する。この判定は、上記のとおり、共有リソースが更新中であるか否かの判定である。
【０１９５】
第１の制御変数３３が偶数でない（奇数の）場合（ステップ５０２でＮＯ）、プロセッサ２０ｂは、ステップ５０１に戻る。プロセッサ２０ｂは、第１の制御変数３３が偶数になるまで、待つ。この動作は、第１の実施形態と同様に、ステップ５０１と５０２との繰り返しでよいし、ウェイト状態を用いても良い。
【０１９６】
第１の制御変数３３が偶数、つまり更新中でない場合（ステップ５０２でＹＥＳ）、プロセッサ２０ｂは、共有データを参照する（ステップ５０３）。
【０１９７】
参照後、プロセッサ２０ｂは、制御変数３３を読み出す（ステップ５０４）。ステップ５０４で読み出した変数を「第２の制御変数３３」と言う。
【０１９８】
次に、プロセッサ２０ｂは、第１の制御変数３３と第２の制御変数３３とを確認する（ステップ５０５）。具体的には、プロセッサ２０ｂは、第１の制御変数３３と第２の制御変数３３とが同じか否かを判定する。この判定は、第１の制御変数３３を読み出した後、終了した更新処理が発生したか否かの判定である。
【０１９９】
第１の制御変数３３と第２の制御変数３３が異なる、つまり、終了した更新が発生した場合（ステップ５０５でＮＯ）、プロセッサ２０ｂは、ステップ５０１に戻り、最初から参照動作を始める。ステップ５０１に戻るのは、共有リソースが更新されているため、ステップ５０３での参照が無効の可能性があるためである。
【０２００】
第１の制御変数３３と第２の制御変数３３が同じ値の場合（ステップ５０５でＹＥＳ）、プロセッサ２０ｂは、第２の制御変数３３の値を確認する（ステップ５０６）。具体的には、プロセッサ２０ｂは、第２の制御変数３３が偶数か否かを判定する。この判定は、更新動作中か否かの判定である。
【０２０１】
第２の制御変数３３が奇数、つまり、更新中の場合(ステップ５０６でＮＯ）、プロセッサ２０ｂは、ステップ５０１に戻り、最初から参照動作を始める。ステップ５０１に戻るのは、共有リソースの更新が開始されているため、ステップ５０３での参照が無効の可能性があるためである。
【０２０２】
第２の制御変数３３が偶数の場合（ステップ５０６でＹＥＳ）、プロセッサ２０ｂは、参照動作を終了する。プロセッサ２０ｂは、適宜、次の動作に移る。
【０２０３】
なお、ステップ５０５とステップ５０６は、どちらも変数の判定の動作である。そのため、情報処理装置１０は、この動作を分けずに、１つの判定動作として実行しても良い。
【０２０４】
また、プロセッサ２０ｂは、ステップ５０２で制御変数３３が偶数である場合に処理を進めている。つまり、第１の制御変数３３は、偶数である。更新中の制御変数３３は、奇数となる。奇数と偶数は、異なる値である。つまり、更新中の場合も、プロセッサ２０ｂは、ステップ５０５の判定がＮＯとなる。したがって、プロセッサ２０ｂは、ステップ５０６を省略しても良い。
【０２０５】
このように、共有リソースを参照するプロセッサ２０ｂは、共有リソースに排他機構を設定されているか否かに係わらず、制御変数３３を基に共有リソースを参照できる。
【０２０６】
次に、情報処理装置１０が、適切に共有リソースを参照できることを、図１６−１９を参照して説明する。なお、図面の煩雑さを避けるため、図１６−図１９において、図１５のステップ５０５とステップ５０６との判断は、１つの判断として示す。
【０２０７】
まず、共有リソースの更新動作と参照動作とが重ならない場合について説明する。
【０２０８】
図１６は、プロセッサ２０ａが共有リソースの更新を終了後、プロセッサ２０ｂが参照動作を開始した場合のシーケンス図である。
【０２０９】
プロセッサ２０ｂは、第１の制御変数３３を読み出す（６００１）。この場合、第１の制御変数３３は、偶数（図１６では「０２」）となる。
【０２１０】
そのため、第１の制御変数３３の判定（図１５のステップ５０２）は、ＹＥＳとなる（６００２）。
【０２１１】
そして、プロセッサ２０ｂは、共有リソースを参照する（６００３）。
【０２１２】
プロセッサ２０ｂは、第２の制御変数３３を読み出す（６００４）。この場合、第２の制御変数３３は、第１の制御変数３３と同じ値（図１６では「０２」）となる。
【０２１３】
そのため、ステップ５０５及び５０６に対応する変数の判定は、どちらもＹＥＳとなる（６００５）。
【０２１４】
その結果、プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０２１５】
次に、プロセッサ２０ａが更新動作中に、プロセッサ２０ｂが参照動作を開始した場合について説明する。
【０２１６】
図１７は、プロセッサ２０ａが更新動作中に、プロセッサ２０ｂが参照動作を開始した場合のシーケンス図である。
【０２１７】
プロセッサ２０ｂは、第１の制御変数３３を読み出す（７００１）。この場合、プロセッサ２０ａは、更新中である。そのため、第１の制御変数３３は、奇数（図１７では、「０１」）となる。
【０２１８】
そのため、第１の制御変数３３の判定（図１５のステップ５０２）は、ＮＯとなる（７００２）。
【０２１９】
プロセッサ２０ａの更新動作が終了するまで、第１の制御変数３３は、奇数である。そのため、プロセッサ２０ｂは、図１５のステップ５０１−５０２（図１７では、７００１−７００２）を繰り返す。
【０２２０】
プロセッサ２０ａが更新動作を終了すると、第１の制御変数３３は、偶数になる。
【０２２１】
その後、プロセッサ２０ｂが、第１の制御変数３３を読み出す（７００３）と、第１の制御変数３３は、偶数（図１７では「０２」）となる。
【０２２２】
そのため、第１の制御変数３３の判定（図１５のステップ５０２）は、ＹＥＳとなる（７００４）。
【０２２３】
これ以降、プロセッサ２０ｂは、図１６の６００３−６００５と同様に動作する。
【０２２４】
つまり、プロセッサ２０ｂは、共有リソースを参照する（７００５）。
【０２２５】
プロセッサ２０ｂは、第２の制御変数３３を読み出す（７００６）。この場合、第２の制御変数３３は、第１の制御変数３３と同じ値（図１７では「０２」）である。
【０２２６】
そのため、ステップ５０５及び５０６に対応する変数の判定は、どちらもＹＥＳとなる（７００７）。
【０２２７】
その結果、プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０２２８】
次に、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始した場合について説明する。まず、プロセッサ２０ｂの第２の制御変数３３の確認前に、プロセッサ２０ａの更新動作が終了した場合について説明する。
【０２２９】
図１８は、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始し、プロセッサ２０ｂの第２の制御変数３３の確認前に、プロセッサ２０ａの更新動作が終了した場合のシーケンス図である。
【０２３０】
プロセッサ２０ｂは、第１の制御変数３３を読み込む（８００１）。この場合、第１の制御変数３３は、偶数（図１８では「００」）である。
【０２３１】
そのため、第１の制御変数３３の判定（図１５のステップ５０２）は、ＹＥＳとなる（８００２）。
【０２３２】
プロセッサ２０ｂは、共有リソースを参照する（８００３）。
【０２３３】
ただし、プロセッサ２０ａは、プロセッサ２０ｂが共有リソースを参照中に、共有リソースを更新している。そのため、制御変数３３は、更新（図１８では「０２」）されている。
【０２３４】
プロセッサ２０ｂは、第２の制御変数３３を読み出す（８００４）。上記のとおり、第２の制御変数３３は、更新された後のため、第１の制御変数３３とは異なる。
【０２３５】
そのため、プロセッサ２０ｂの変数の判定、具体的には、図１５のステップ５０５の判定がＮＯとなる（８００５）。
【０２３６】
そのため、プロセッサ２０ｂは、参照動作の最初（図１５のステップ５０１）に戻り、参照動作をやり直す。つまり、プロセッサ２０ｂは、図１６の６００１−６００５に相当する図１８の８００６−８０１０を実行する。
【０２３７】
具体的に説明すると次のとおりである。
【０２３８】
プロセッサ２０ｂは、第１の制御変数３３を読み出す（８００６）。第１の制御変数３３は、偶数（図１８では、「０２」）である。
【０２３９】
プロセッサ２０ｂは、第１の制御変数３３を判定する（８００７）。
【０２４０】
第１の制御変数３３が偶数のため、プロセッサ２０ｂは、共有リソースを参照する（８００８）。
【０２４１】
プロセッサ２０ｂは、第２の制御変数３３を読み出す（８００９）。この場合、第２の制御変数３３は、第１の制御変数３３と同じ偶数の値（図１８では「０２」）である。
【０２４２】
そのため、プロセッサ２０ｂの変数の判定は、ＹＥＳとなる（８０１０）。
【０２４３】
プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０２４４】
続いて、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始し、プロセッサ２０ｂの第２の制御変数３３の確認時に、プロセッサ２０ａの更新動作が終了していない場合について説明する。
【０２４５】
図１９は、プロセッサ２０ｂが参照動作を開始してから、プロセッサ２０ａが更新動作を開始し、プロセッサ２０ｂの第２の制御変数３３の確認時に、プロセッサ２０ａの更新動作が終了していない場合のシーケンス図である。
【０２４６】
プロセッサ２０ｂは、第１の制御変数３３を読み出す（９００１）。この場合、第１の制御変数３３は、偶数（図１９では「００」）である。
【０２４７】
そのため、第１の制御変数３３の判定（図１５のステップ５０２）は、ＹＥＳとなる（９００２）。
【０２４８】
プロセッサ２０ｂは、共有リソースを参照する（９００３）。
【０２４９】
ただし、プロセッサ２０ａは、プロセッサ２０ｂが共有リソースを参照中に、共有リソースの更新を開始している。そのため、制御変数３３は、更新（図１９では「０１」）されている。
【０２５０】
プロセッサ２０ｂは、第２の制御変数３３を読み出す（９００４）。上記のとおり、第２の制御変数３３は、更新されたため、第１の制御変数３３とは異なる。
【０２５１】
そのため、プロセッサ２０ｂの制御変数３３の判定、具体的には、図１５のステップ５０５の判定がＮＯとなる（５００５）。
【０２５２】
そのため、プロセッサ２０ｂは、参照動作の最初（図１５のステップ５０１）に戻り、参照動作をやり直す。
【０２５３】
これ以降の動作は、図１７と同様の動作になる。
【０２５４】
つまり、プロセッサ２０ｂは、第１の制御変数３３が偶数になるまで、制御変数３３の読み出しと判定を繰り返す。
【０２５５】
プロセッサ２０ａが、更新を終了すると、制御変数３３が偶数（図１９では「０２」）となる。
【０２５６】
その後、プロセッサ２０ｂが、第１の制御変数３３を読み出す（９００６）と、第１の制御変数３３は、偶数（図１９では、「０２」）である。
【０２５７】
プロセッサ２０ｂは、第１の制御変数３３を判定する（９００７）。
【０２５８】
第１の制御変数３３が偶数のため、プロセッサ２０ｂは、共有リソースを参照する（９００８）。
【０２５９】
プロセッサ２０ｂは、第２の制御変数３３を読み出す（９００９）。この場合、第２の制御変数３３は、第１の制御変数３３と同じ偶数（図１９では「０２」）である。
【０２６０】
そのため、プロセッサ２０ｂの変数の判定は、ＹＥＳとなる（９０１０）。
【０２６１】
プロセッサ２０ｂは、参照した共有リソースが有効として、参照動作を終了する。
【０２６２】
このように構成された第２の実施形態の情報処理装置１０は、第１の実施形態の情報処理装置１０と同様の効果を得ることができる。
【０２６３】
その理由は、第２の実施形態の情報処理装置１０は、制御変数３３を用いて、開始変数３１と終了変数３２とを用いる第１の実施形態の情報処理装置１０と同様に動作できるためである。
【０２６４】
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【０２６５】
１０    情報処理装置
２０    プロセッサ
２０ａ    プロセッサ
２０ｂ    プロセッサ
３０    資源制御部
３０ａ    制御情報
３０ｂ    制御情報
３１    開始変数
３２    終了変数
３３    制御変数
６０    情報処理装置
６１０ａ    ＣＰＵ
６１０ｂ    ＣＰＵ
６２０    ＲＯＭ
６３０    ＲＡＭ
６４０    ＩＯ
６５０    内部記憶装置
６６０    キーボード
６７０    マウス
６８０    ディスプレイ
６９０    ＮＩＣ
７００    記憶媒体
【図１】
0005890194.tif 000002
【図２】
0005890194.tif 000003
【図３】
0005890194.tif 000004
【図４】
0005890194.tif 000005
【図５】
0005890194.tif 000006
【図６】
0005890194.tif 000007
【図７】
0005890194.tif 000008
【図８】
0005890194.tif 000009
【図９】
0005890194.tif 000010
【図１０】
0005890194.tif 000011
【図１１】
0005890194.tif 000012
【図１２】
0005890194.tif 000013
【図１３】
0005890194.tif 000014
【図１４】
0005890194.tif 000015
【図１５】
0005890194.tif 000016
【図１６】
0005890194.tif 000017
【図１７】
0005890194.tif 000018
【図１８】
0005890194.tif 000019
【図１９】
0005890194.tif 000020