(57)【要約】      （修正有）【課題】処理負荷が軽いタスク間の排他制御方法を提供する。【解決手段】何れかのタスクが排他ロックを取得および解放したことに応じて値が更新される更新情報と、排他ロックを取得しているタスクを識別するタスク識別情報とを記憶するロック状態記憶部２６と、排他ロックを取得して第１タスクに含まれるクリティカルセクションの処理を実行させ、第１タスクに含まれるクリティカルセクションの処理の後に排他ロックを解放するとともに更新情報を更新する排他実行部２８と、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させ、第２タスクに含まれるクリティカルセクションの処理の前後において更新情報が変化していないことを条件として当該クリティカルセクションの処理が成功したと判定する非排他実行部３０とを備える。【選択図】図２
2011128975.tif 000002
【特許請求の範囲】
【請求項１】
タスク間の排他制御を行うシステムであって、
何れかのタスクが排他ロックを取得および解放したことに応じて値が更新される更新情報と、排他ロックを取得しているタスクを識別するタスク識別情報とを記憶するロック状態記憶部と、
排他ロックを取得して第１タスクに含まれるクリティカルセクションの処理を実行させ、前記第１タスクに含まれるクリティカルセクションの処理の後に排他ロックを解放するとともに前記更新情報を更新する排他実行部と、
排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させ、第２タスクに含まれるクリティカルセクションの処理の前後において前記更新情報が変化していないことを条件として当該クリティカルセクションの処理が成功したと判定する非排他実行部と、
を備えるシステム。
【請求項２】
前記ロック状態記憶部は、何れかのタスクが排他ロックを取得しているか否かを示すロック情報を更に記憶し、
前記排他実行部は、
排他ロックを取得する場合、前記ロック状態記憶部から前記ロック情報を読出し、全てのタスクが排他ロックを解放していることを条件に、排他ロックを取得していることを示す前記ロック情報を前記ロック状態記憶部に書き込み、
排他ロックを解放する場合に、排他ロックを解放していることを示す前記ロック情報を前記ロック状態記憶部に書き込む
請求項１に記載のシステム。
【請求項３】
前記ロック状態記憶部は、何れかのタスクが排他ロックを取得している場合に前記タスク識別情報を記憶し、全てのタスクが排他ロックを解放している場合に前記更新情報を記憶する記憶領域を有し、
前記排他実行部は、
排他ロックを取得する場合に、前記ロック状態記憶部から前記更新情報を読み出し、排他ロックを取得していることを示す前記ロック情報を前記ロック状態記憶部に書き込むと共に、前記更新情報に代えて前記第１タスクを識別する前記タスク識別情報を前記ロック状態記憶部に書き込み、
排他ロックを解放する場合に、排他ロックを解放していることを示す前記ロック情報を前記ロック状態記憶部に書き込むと共に、前記第１タスクを識別する前記タスク識別情報に代えて、排他ロックの取得において読み出した前記更新情報を更新した新たな前記更新情報を前記ロック状態記憶部に書き込む
請求項２に記載のシステム。
【請求項４】
前記ロック状態記憶部は、同一のタスクによる排他ロックの取得の繰返し回数を示す再帰情報を記憶し、
前記排他実行部は、
排他ロックを取得する場合において、前記第１タスクが排他ロックを取得している場合、前記ロック状態記憶部に記憶された前記再帰情報の繰返し回数をインクリメントし、
排他ロックを解放する場合において、前記再帰情報の繰返し回数が０でない場合には、前記ロック状態記憶部に記憶された前記ロック情報および前記タスク識別情報を維持して、前記再帰情報の繰返し回数をデクリメントする
請求項３に記載のシステム。
【請求項５】
前記ロック状態記憶部は、何れかのタスクが排他ロックを取得している場合に前記タスク識別情報および前記再帰情報を前記記憶領域に記憶し、全てのタスクが排他ロックを解放している場合に前記更新情報を前記記憶領域に記憶する請求項４に記載のシステム。
【請求項６】
前記非排他実行部は、前記第２タスクに含まれるクリティカルセクションの処理の前後において、前記ロック状態記憶部に排他ロックを解放していることを示す前記ロック情報が記憶され、且つ、前記ロック状態記憶部に記憶された前記更新情報が変化していないことを条件として、クリティカルセクションの処理が成功したと判定する請求項２から５のいずれかに記載のシステム。
【請求項７】
前記非排他実行部は、前記第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しない場合に、排他ロックを取得して第２タスクに含まれるクリティカルセクションの処理を実行させる請求項１から６のいずれかに記載のシステム。
【請求項８】
前記非排他実行部は、
排他ロックを取得せずに前記第２タスクに含まれるクリティカルセクションの処理を実行させる場合において、当該クリティカルセクションの処理に含まれるループ処理の中で、当該クリティカルセクションの処理前から前記更新情報が変化したか確認し、
前記更新情報が変化した場合には前記第２タスクに含まれるクリティカルセクションの処理を失敗したと判定する
請求項１から７のいずれかに記載のシステム。
【請求項９】
前記非排他実行部は、
排他ロックを取得せずに前記第２タスクに含まれるクリティカルセクションの処理を実行させる場合において、当該クリティカルセクションの処理中においてポインタの参照先へのアクセスに先立って、当該クリティカルセクションの処理前から前記更新情報が変化したか否かを確認し、
前記更新情報が変化した場合には前記第２タスクに含まれるクリティカルセクションの処理を失敗したと判定する
請求項１から８のいずれかに記載のシステム。
【請求項１０】
前記非排他実行部は、
前記第２タスクに含まれるクリティカルセクションの処理中においてポインタの参照先を取得してから前記更新情報が変化したか否かを確認し、
前記更新情報が変化していないことを条件として、取得したポインタの参照先をアクセスする
請求項９に記載のシステム。
【請求項１１】
前記非排他実行部は、前記第２タスクに含まれるクリティカルセクションの処理において条件判断をした結果、タスク間で共有される共有変数に書き込みをする場合に、当該クリティカルセクションの処理前から前記更新情報が変化していないことを確認した上で、前記条件判断の後かつ前記共有変数の書き込み前に排他ロックを取得する請求項１から１０のいずれかに記載のシステム。
【請求項１２】
タスク間の排他制御を行う方法であって、
何れかのタスクが排他ロックを取得および解放したことに応じて値が更新される更新情報と、排他ロックを取得しているタスクを識別するタスク識別情報とを記憶するロック状態記憶部をメモリ上に実現するステップと、
排他ロックを取得して第１タスクに含まれるクリティカルセクションの処理を実行させ、前記第１タスクに含まれるクリティカルセクションの処理の後に排他ロックを解放するとともに前記更新情報を更新する排他実行ステップと、
排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させ、第２タスクに含まれるクリティカルセクションの処理の前後において前記更新情報が変化していないことを条件として当該クリティカルセクションの処理が成功したと判定する非排他実行ステップと、
を備える方法。
【請求項１３】
コンピュータを、請求項１から１１の何れかに記載のシステムとして機能させるためのプログラム。
【請求項１４】
請求項１３のプログラムの実行コードを生成するコード生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、システム、方法、プログラムおよびコード生成装置に関する。
【背景技術】
【０００２】
コンピュータシステムにおいて、複数のスレッドが処理を並列に実行するマルチスレッドシステムが知られている。マルチスレッドシステムでは、各スレッドが共有変数等にアクセスする場合、他のスレッドとの同期を取る。マルチスレッドにおける同期方法は、排他ロックを用いた制御が一般的である。
【０００３】
スレッドが排他ロックを取得する場合、コンペアアンドスワップ等の原子的な命令を実行しなければならない。原子的な命令は、他の命令と比較して実行コストが大きい。従って、排他ロックの取得を行うと、処理全体のコストが大きくなってしまう。
【０００４】
また、排他ロックの取得および解放を行う場合、ロック変数に対する書き込みが発生する。従って、頻繁に排他ロックの取得および解放を行うと、キャッシュコヒーレントトラフィックが大きくなってしまう。
【０００５】
このような問題を解決する方法として、シーケンシャルロックと呼ばれる方法が知られている（非特許文献１）。シーケンシャルロックは、リーダ／ライターロックの一種であり、ロック変数がカウンタとして実装される。カウンタは、奇数の場合にロックが取得されていることを示し、偶数の場合にロックが解放されていることを示す。そして、カウンタは、ロックが取得および解放される毎に、値が１ずつインクリメントされる。
【０００６】
シーケンシャルロックを用いたシステムにおいて、スレッドは、書き込みがあるクリティカルセクションの処理を実行する場合にロックの取得を行う。書き込みが無いクリティカルセクションの処理を実行する場合には、スレッドは、次のような処理を実行する。
【０００７】
まず、スレッドは、クリティカルセクションの先頭において、カウンタ値（ロック変数）を読み出す。続いて、スレッドは、クリティカルセクションの処理を実行する。続いて、スレッドは、クリティカルセクションの最後において、カウンタ値を読出して、クリティカルセクションの先頭において読み出したカウンタ値と比較する。スレッドは、値が一致すればクリティカルセクションの処理を完了させ、値が一致しなければ再度クリティカルセクションの処理を先頭から繰り返す。
【０００８】
このように、シーケンシャルロックを用いたシステムによれば、書き込みの無いクリティカルセクションの処理を実行する場合には、原子的な命令を実行しないので、実行コストを小さくすることができる。さらに、シーケンシャルロックを用いたシステムによれば、ロック変数への書き込みを少なくすることができるので、キャッシュコヒーレントトラフィックを小さくすることができる。
【先行技術文献】
【非特許文献】
【０００９】
【非特許文献１】"Seqlock"、[online], WIKIPEDIA、［２００９年１２月２日検索］、インターネット＜http://en.wikipedia.org/wiki/Seqlock＞
【発明の概要】
【発明が解決しようとする課題】
【００１０】
ところで、シーケンシャルロックを用いたシステムでは、一のスレッドが連続して同一の排他ロックを取得することができなかった。従って、シーケンシャルロックを用いたシステムでは、一般に、ネストしたクリティカルセクションの処理、即ち、一のクリティカルセクションの内側において他のクリティカルセクションの処理を実行することが禁止されていた。
【００１１】
また、シーケンシャルロックを用いたシステムでは、書き込みの無いクリティカルセクションの処理を実行している間において、他の書き込みのあるクリティカルセクションの処理が実行された場合、書き込みの無いクリティカルセクションの処理は失敗となる。従って、書き込みのあるクリティカルセクションの処理が頻発して実行される場合、並行して実行される書き込みの無いクリティカルセクションの処理が長期間完了しなかった。
【００１２】
また、シーケンシャルロックを用いたシステムでは、書き込みの無いクリティカルセクションに含まれるループ処理が実行されている間において、他の書き込みのあるクリティカルセクションの処理を実行しているスレッドがループ処理の終了条件に関係する変数を書き換えてしまう場合がある。このような場合、書き込みの無いクリティカルセクションに含まれるループ処理が完了しなかった。
【００１３】
また、シーケンシャルロックを用いたシステムでは、書き込みの無いクリティカルセクションにデータを読み出す参照先を指定するポインタが含まれる場合がある。しかし、書き込みの無いクリティカルセクションの処理の実行中において他のスレッドがポインタの参照先にＮＵＬＬを書き込むと、書き込みの無いクリティカルセクションがＮＵＬＬにアクセスして、処理の実行を停止してしまう。
【００１４】
また、シーケンシャルロックを用いたシステムでは、クリティカルセクション内に稀にしか実行されない書き込み命令を含む場合がある。例えば、ＩＦ文の中に含まれる書き込み命令は、稀にしか実行されない場合がある。しかし、シーケンシャルロックを用いたシステムでは、このような稀にしか実行されない書き込み命令のみを含むクリティカルセクションであっても、排他ロックを取得して処理をしなければならなかった。
【課題を解決するための手段】
【００１５】
上記課題を解決するために、本発明の第１の態様においては、タスク間の排他制御を行うシステムであって、何れかのタスクが排他ロックを取得および解放したことに応じて値が更新される更新情報と、排他ロックを取得しているタスクを識別するタスク識別情報とを記憶するロック状態記憶部と、排他ロックを取得して第１タスクに含まれるクリティカルセクションの処理を実行させ、前記第１タスクに含まれるクリティカルセクションの処理の後に排他ロックを解放するとともに前記更新情報を更新する排他実行部と、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させ、第２タスクに含まれるクリティカルセクションの処理の前後において前記更新情報が変化していないことを条件として当該クリティカルセクションの処理が成功したと判定する非排他実行部と、を備えるシステム、方法、プログラムおよびコード生成装置を提供する。
【００１６】
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではない。また、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施形態に係るコンピュータシステム１０の機能構成を示す。
【図２】第１タスクおよび第２タスクを並行して実行する場合のコンピュータシステム１０の機能構成を示す。
【図３】本発明の実施形態に係る排他実行部２８による排他ロックの取得時の処理フローを示す。
【図４】本発明の実施形態に係る排他実行部２８による排他ロックの解放時の処理フローを示す。
【図５】本発明の実施形態に係る非排他実行部３０による、排他ロックの取得を省略したクリティカルセクションの処理フローを示す。
【図６】図５に続く処理フローを示す。
【図７】本発明の実施形態に係る非排他実行部３０による、排他ロックの取得を省略して実行されるクリティカルセクションの処理内における、ポインタで示されるアドレスをレジスタに読み込んでそのアドレスにアクセスする直前、および、ループの分岐判断の直前において、非排他実行部３０が行う処理フローを示す。
【図８】本発明の実施形態に係る非排他実行部３０による、排他ロックの取得を省略して実行されるクリティカルセクションの処理内における、ループ処理内で非排他実行部３０が行う処理フローを示す。
【図９】メモリをロック状態記憶部２６として機能させるための、Ｊａｖａ（登録商標）により記述されたソースコードの一例を示す。
【図１０】ｂｉｍｏｄａｌロックに適用された本実施形態に係るロック変数のロック解放時の一例を示す。
【図１１】ｂｉｍｏｄａｌロックに適用された本実施形態に係るロック変数のロック取得時の一例を示す。
【図１２】本発明の実施形態に係るコード生成部１４の機能構成の一例を示す。
【図１３】書き込みがあるクリティカルセクションの一例を示す。
【図１４】書き込みが無いクリティカルセクションの一例を示す。
【図１５】本発明の実施形態に係るコンピュータ１９００のハードウェア構成の一例を示す。
【発明を実施するための形態】
【００１８】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではない。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１９】
図１は、本実施形態に係るコンピュータシステム１０の機能構成を示す。コンピュータシステム１０は、プログラム格納部１２と、コード生成部１４と、実行部１６とを備える。
【００２０】
プログラム格納部１２は、プログラムを格納する。プログラム格納部１２に格納されるプログラムは、例えば、Ｊａｖａ（登録商標）のバイト・コードである。プログラム格納部１２は、メモリおよびハードディスク等の記憶装置により実現される。
【００２１】
コード生成部１４は、プログラム格納部１２に格納されたプログラムを実行部１６が実行できる形式のコードに変換する。コード生成部１４は、例えば、実行時に動的にバイト・コードを実行部１６において実行できるコードにコンパイルするＪＩＴ（Ｊｕｓｔ−Ｉｎ−Ｔｉｍｅ）コンパイラである。コード生成部１４は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）がコンパイルプログラムを実行することにより実現される。
【００２２】
実行部１６は、コード生成部１４により変換されたコードを実行する。実行部１６は、ＣＰＵがオペレーションシステムを実行することにより実現される。
【００２３】
さらに、実行部１６は、複数のタスクを並行して実行する。実行部１６は、例えばＣＰＵの分割処理の単位（例えばスレッド、プロセス）のそれぞれがタスクを実行する。また、実行部１６により実行される複数のタスクのそれぞれは、互いに共有の変数、配列および記憶領域等にアクセスすることができる。
【００２４】
また、それぞれのタスクは、クリティカルセクションを含んでよい。クリティカルセクションは、他のタスクに対して排他的に実行されるべき部分である。即ち、クリティカルセクションは、複数のタスクが同時に実行すると処理の一貫性を担保できない部分である。
【００２５】
ここで、実行部１６は、タスクに含まれるクリティカルセクションのうち、他のタスクの実行に影響を与えるコード（例えばタスク間で共有する共有変数への書込命令、共有変数への書込命令を含む関数の呼出命令等）を含むクリティカルセクションについては、排他ロックを取得した確実な処理を実行する。
【００２６】
これに対して、実行部１６は、タスクに含まれるクリティカルセクションのうち、他のタスクの実行に影響を与えるコードを含まないクリティカルセクションについては、排他ロックの取得を省略した楽観的な処理を実行する。さらに、実行部１６は、他のタスクの実行に影響を与えるコードがループ内にあり、当該コードが稀にしか実行されないクリティカルセクションについても、排他ロックの取得を省略した楽観的な処理を実行してもよい。なお、実行部１６による具体的な処理については、詳細を後述する。
【００２７】
図２は、第１タスクおよび第２タスクを並行して実行する場合のコンピュータシステム１０の機能構成を示す。なお、第１タスクは、他のタスクの実行に影響を与えるコード（共有変数への書込命令および共有変数への書込命令を含む関数の呼出命令等）を含むクリティカルセクションを有する。また、第２タスクは、他のタスクの実行に影響を与えるコードを含まないクリティカルセクションを有する。
【００２８】
コンピュータシステム１０は、複数のタスクを並行して実行する場合において、タスク間の排他制御を行う。第１タスクおよび第２タスクの間で排他制御を行う場合、コンピュータシステム１０は、図２に示されるような機能ブロックを備える装置として機能する。即ち、コンピュータシステム１０は、第１タスクおよび第２タスクの間で排他制御を行う場合、第１タスク実行部２２と、第２タスク実行部２４と、ロック状態記憶部２６と、排他実行部２８と、非排他実行部３０とを備える。
【００２９】
第１タスク実行部２２は、第１タスクの処理を行う。第１タスク実行部２２は、例えば、ＣＰＵの一の処理単位（例えばスレッドおよびプロセス）が第１タスクの実行コードを実行することにより実現される。
【００３０】
第２タスク実行部２４は、第２タスクの処理を行う。第２タスク実行部２４は、例えば、ＣＰＵにおける第１タスクを実行する処理単位以外の処理単位が第２タスクの実行コードを実行することにより実現される。
【００３１】
ロック状態記憶部２６は、ＣＰＵによりアクセスされるメモリ上に実現される。ロック状態記憶部２６は、何れかのタスクが排他ロックを取得しているか否か、または全てのタスクが排他ロックを解放しているかを示すロック情報を記憶する。ロック情報は、例えば１ビットのデータであって、値が１の場合に何れかのタスクが排他ロックを取得していることを表し、値が０の場合に全てのタスクが排他ロックを解放していることを表す。
【００３２】
また、ロック状態記憶部２６は、何れかのタスクが排他ロックを取得および解放したことに応じて値が更新される更新情報と、排他ロックを取得しているタスクを識別するタスク識別情報とを記憶する。更新情報は、例えば、値がインクリメントされるカウンタ値である。タスク識別情報は、タスク毎にユニークに割り当てられた値である。
【００３３】
ロック状態記憶部２６は、一例として、何れかのタスクが排他ロックを取得している場合にタスク識別情報を記憶し、全てのタスクが排他ロックを解放している場合に更新情報を記憶する記憶領域を有する。即ち、ロック状態記憶部２６は、排他ロックが取得されている場合にはタスク識別情報が書き込まれ、排他ロックが解放されている場合には更新情報が書き込まれる記憶領域を有する。
【００３４】
また、ロック状態記憶部２６は、同一のタスクによる排他ロックの取得の繰返し回数を示す再帰情報を記憶する。繰り返し回数は、例えば、０を初期値とし、一のタスクが排他ロックを取得している状態で更に排他ロックを取得する場合に１が加算され、値が１以上の状態で一のタスクが排他ロックを解放する場合に１が減算される。
【００３５】
排他実行部２８は、第１タスクに含まれるクリティカルセクション（即ち、他のタスクの実行に影響を与えるコードを含むクリティカルセクション）の実行を制御する。具体的には、排他実行部２８は、排他ロックを取得して第１タスクに含まれるクリティカルセクションの処理を実行させる。そして、排他実行部２８は、第１タスクに含まれるクリティカルセクションの処理の後に排他ロックを解放するとともに更新情報を更新する。なお、排他実行部２８の具体的な処理内容は、図３および図４に示したフローを参照して更に説明する。
【００３６】
非排他実行部３０は、第２タスクに含まれるクリティカルセクション（即ち、他のタスクの実行に影響を与えるコードを含まないクリティカルセクション）の実行を制御する。具体的には、非排他実行部３０は、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させる。そして、非排他実行部３０は、第２タスクに含まれるクリティカルセクションの処理の前後において更新情報が変化していないことを条件として当該クリティカルセクションの処理が成功したと判断する。なお、非排他実行部３０の具体的な処理内容は、図５〜図８に示したフローを参照して更に説明する。
【００３７】
なお、クリティカルセクションを含むタスクのコンパイルにおいて、クリティカルセクションの排他制御をするための制御コードがコード生成部１４により生成される。排他実行部２８および非排他実行部３０は、ＣＰＵがこのような実行コードを実行することにより実現される。
【００３８】
以上のような構成のコンピュータシステム１０は、ＣＰＵがコード生成部１４により生成された実行コードを実行することにより実現される。コード生成部１４は、アプリケーションの実行中に動的に、バイト・コードを実行コードに変換する。より具体的には、コード生成部１４は、タスクが起動される毎に、ＣＰＵを図２に示される構成のコンピュータシステム１０として機能させるための実行コードを生成する。
【００３９】
図３は、本実施形態に係る排他実行部２８による排他ロックの取得時の処理フローを示す。排他実行部２８は、第１タスクに含まれるクリティカルセクションの処理の実行に先立って、排他ロックを取得する。排他ロックを取得する場合に、排他実行部２８は、図３のステップＳ１１〜ステップＳ１７の処理を実行する。
【００４０】
まず、ステップＳ１１において、排他実行部２８は、ロック状態記憶部２６からロック情報を読み出す。さらに、ステップＳ１１において、排他実行部２８は、ロック状態記憶部２６の所定の記憶領域から更新情報またはタスク識別情報を読み出す。なお、排他実行部２８は、全てのタスクが排他ロックを解放している場合にはロック状態記憶部２６から更新情報を読み出し、何れかのタスクが排他ロックを取得している場合にはタスク識別情報を読み出す。
【００４１】
続いて、ステップＳ１２において、排他実行部２８は、読み出したロック情報を参照して、何れかのタスクが排他ロックを取得しているかを判断する。排他実行部２８は、ステップＳ１２での判断の結果、何れかのタスクが排他ロックを取得していない場合、即ち、全てのタスクが排他ロックを解放している場合（Ｓ１２のＮｏ）、処理をステップＳ１３に進める。ステップＳ１３において、排他実行部２８は、排他ロックを取得していることを示すロック情報をロック状態記憶部２６に書き込むと共に、更新情報に代えて第１タスクを識別するタスク識別情報をロック状態記憶部２６に書き込む。
【００４２】
なお、ステップＳ１３において、排他実行部２８は、ロック情報およびタスク識別情報を原子的にロック状態記憶部２６に書き込む。排他実行部２８は、ロック情報およびタスク識別情報の書き込みが失敗した場合には（Ｓ１３の失敗）、処理をステップＳ１１に戻して、ロック情報等の読出しから処理を繰り返す。排他実行部２８は、ロック情報およびタスク識別情報の書き込みが成功した場合には（Ｓ１３の成功）、処理をステップＳ１４に進める。
【００４３】
続いて、ステップＳ１４において、排他実行部２８は、ステップＳ１１で読み出した更新情報をローカルの記憶領域に保存する。排他実行部２８は、ステップＳ１４の処理を終えると、排他ロックの取得の処理を完了して、第１タスク実行部２２に第１タスクのクリティカルセクションの処理を実行させる。
【００４４】
また、排他実行部２８は、ステップＳ１２での判断の結果、何れかのタスクが排他ロックを取得している場合（Ｓ１２のＹｅｓ）、処理をステップＳ１５に進める。ステップＳ１５において、排他実行部２８は、読み出したタスク識別情報を参照して、第１タスクが排他ロックを取得しているか（即ち、自分が排他ロックを取得しているか）を判断する。排他実行部２８は、一例として、読み出したタスク識別情報と、第１タスクの識別情報とが一致するかを判断する。
【００４５】
排他実行部２８は、ステップＳ１５での判断の結果、第１タスクが排他ロックを取得している場合、即ち、読み出したタスク識別情報と第１タスクの識別情報とが一致する場合（Ｓ１５のＹｅｓ）、処理をステップＳ１６に進める。ステップＳ１６において、排他実行部２８は、ロック状態記憶部２６に記憶された再帰情報の繰返し回数をインクリメントする。排他実行部２８は、ステップＳ１６の処理を終えると、排他ロックの取得の処理を完了して、第１タスク実行部２２に第１タスクのクリティカルセクションの処理を実行させる。
【００４６】
また、排他実行部２８は、ステップＳ１５での判断の結果、第１タスクが排他ロックを取得していないと判断した場合（Ｓ１５のＮｏ）、処理をステップＳ１７に進める。ステップＳ１７において、排他実行部２８は、排他ロックが解放されるまで処理を待機する。そして、排他実行部２８は、排他ロックが解放されると、処理をステップＳ１１に戻して、ロック情報等の読出しから処理を繰り返す。
【００４７】
以上の処理により、排他実行部２８は、第１タスクのクリティカルセクションの処理の実行に先立って、排他ロックを取得することができる。これにより、排他実行部２８は、第１タスクに含まれるクリティカルセクションの処理を他のタスクとの間で矛盾を生じさせずに実行することができる。
【００４８】
図４は、本実施形態に係る排他実行部２８による排他ロックの解放時の処理フローを示す。排他実行部２８は、第１タスクに含まれるクリティカルセクションの処理の後に排他ロックを解放するとともに、更新情報を更新する。排他ロックを解放する場合に、排他実行部２８は、図４のステップＳ２１〜ステップＳ２４の処理を実行する。
【００４９】
まず、ステップＳ２１において、排他実行部２８は、ロック状態記憶部２６から再帰情報を読み出す。続いて、ステップＳ２２において、排他実行部２８は、読み出した再帰情報に示された繰り返し回数が０かを判断する。
【００５０】
排他実行部２８は、ステップＳ２２での判断の結果、再帰情報の繰返し回数が０の場合（Ｓ２２のＹｅｓ）、処理をステップＳ２３に進める。ステップＳ２３において、排他実行部２８は、ロック状態記憶部２６に排他ロックを解放していることを示すロック情報を書き込む。
【００５１】
これと共に、排他実行部２８は、排他ロックの取得時において読み出した更新情報をローカルの記憶領域から読み出して、読み出した更新情報を更新した新たな更新情報をロック状態記憶部２６に書き込む。排他実行部２８は、一例として、ローカルの記憶領域に記憶された更新情報をインクリメントして、ロック状態記憶部２６に書き込む。排他実行部２８は、ステップＳ２３の処理を終えると、排他ロックの解放の処理を完了して、第１タスク実行部２２に、クリティカルセクションに続く第１タスクの処理を実行させる。
【００５２】
また、排他実行部２８は、ステップＳ２２での判断の結果、再帰情報の繰り返し回数が０でない場合（Ｓ２２のＮｏ）、処理をステップＳ２４に進める。ステップＳ２４において、排他実行部２８は、ロック状態記憶部２６に記憶されたロック情報およびタスク識別情報を維持して、ロック状態記憶部２６に記憶された再帰情報の繰返し回数をデクリメントする。
【００５３】
排他実行部２８は、ステップＳ２４の処理を終えると、排他ロックの解放の処理を完了して、第１タスク実行部２２に、クリティカルセクションに続く処理、即ち、ネストした外側のクリティカルセクションの処理を実行させる。以上の処理により、排他実行部２８は、第１タスクのクリティカルセクションを排他的に実行させた後、排他ロックを解放することができる。
【００５４】
図３および図４のフローに示されるように、排他実行部２８は、他のタスクの実行に影響を与えるコード（例えば共有変数への書き込み）を含むクリティカルセクションの処理を、排他ロックを取得して実行する。これにより、コンピュータシステム１０によれば、当該タスクと他のタスクとの間で一貫性を保ってクリティカルセクションの処理を実行することができる。
【００５５】
更に、排他実行部２８は、排他ロックを解放する場合に、更新情報を更新する。従って、排他実行部２８は、他のタスクが排他ロックの取得を省略してクリティカルセクションの処理を実行した場合であっても、クリティカルセクションの処理の前後で更新情報の値を変えることができるので、他のタスクにクリティカルセクションの処理を再実行させることができる。これにより、コンピュータシステム１０によれば、当該タスクと排他ロックの取得を省略してクリティカルセクションの処理を実行する他のタスクとの間で一貫性を保ってクリティカルセクションの処理を実行することができる。
【００５６】
また、排他実行部２８は、排他ロックを取得する場合に、当該タスクを識別するタスク識別情報をロック状態記憶部２６に書き込む。従って、排他実行部２８は、自分自身により排他ロックを取得していることを確認することができる。これにより、コンピュータシステム１０によれば、クリティカルセクションの内側にネストしたクリティカルセクションの処理を、排他ロックの取得状態を維持して再帰的に実行することができる。
【００５７】
また、排他実行部２８は、クリティカルセクションのネストの深さを表す繰返し回数をロック状態記憶部２６に書き込む。これにより、コンピュータシステム１０によれば、ネスとしたクリティカルセクションを再帰的に実行する場合、最外のクリティカルセクションの処理が終了した後に、確実に排他ロックを解放することができる。
【００５８】
図５および図６は、本実施形態に係る非排他実行部３０による、排他ロックの取得を省略したクリティカルセクションの処理フローを示す。非排他実行部３０は、第２タスクに含まれるクリティカルセクションの処理を実行する場合に、図５および図６のステップＳ３１〜Ｓ４８の処理を実行する。
【００５９】
まず、図５のステップＳ３１において、非排他実行部３０は、ロック状態記憶部２６からロック情報を読み出す。さらに、ステップＳ３１において、非排他実行部３０は、ロック状態記憶部２６の所定の記憶領域から更新情報またはタスク識別情報を読み出す。
【００６０】
続いて、ステップＳ３２において、非排他実行部３０は、読み出したロック情報を参照して、何れかのタスクが排他ロックを取得しているかを判断する。非排他実行部３０は、ステップＳ３２での判断の結果、全てのタスクが排他ロックを解放している場合（Ｓ３２のＮｏ）、処理をステップＳ３３に進める。ステップＳ３３において、非排他実行部３０は、ステップＳ３１で読み出した更新情報をローカルの記憶領域に保存する。非排他実行部３０は、ステップＳ３３の処理を終えると、処理をステップＳ４０に進める。
【００６１】
また、非排他実行部３０は、ステップＳ３２での判断の結果、何れかのタスクが排他ロックを取得している場合（Ｓ３２のＹｅｓ）、処理をステップＳ３４に進める。ステップＳ３４において、非排他実行部３０は、読み出したタスク識別情報を参照して、第２タスクが排他ロックを取得しているか（即ち、自分が排他ロックを取得しているか）を判断する。非排他実行部３０は、一例として、読み出したタスク識別情報と、第２タスクの識別情報とが一致するかを判断する。
【００６２】
非排他実行部３０は、ステップＳ３４での判断の結果、第２タスクが排他ロックを取得している場合、即ち、読み出したタスク識別情報と第２タスクの識別情報とが一致する場合（Ｓ３４のＹｅｓ）、処理をステップＳ３５に進める。ステップＳ３５において、非排他実行部３０は、ロック状態記憶部２６に記憶された再帰情報の繰返し回数をインクリメントする。非排他実行部３０は、ステップＳ３５の処理を終えると、処理をステップＳ４０に進める。
【００６３】
また、非排他実行部３０は、ステップＳ３４での判断の結果、第２タスクが排他ロックを取得していないと判断した場合（Ｓ３４のＮｏ）、処理をステップＳ３６に進める。ステップＳ３６において、非排他実行部３０は、排他ロックが解放されるまで処理を待機する。そして、非排他実行部３０は、排他ロックが解放されると、処理をステップＳ３１に戻して、ロック情報等の読出しから処理を繰り返す。
【００６４】
続いて、ステップＳ４０において、非排他実行部３０は、第２タスク実行部２４に第２タスクのクリティカルセクションの処理を実行させる。第２タスク実行部２４が第２タスクのクリティカルセクションの処理を終えると（ステップＳ４０の処理が終了）、非排他実行部３０は、処理を図６のステップＳ４１に進める。
【００６５】
図６のステップＳ４１において、非排他実行部３０は、ロック状態記憶部２６からロック情報を読み出す。さらに、ステップＳ４１において、非排他実行部３０は、ロック状態記憶部２６の所定の記憶領域から更新情報またはタスク識別情報を読み出す。
【００６６】
続いて、ステップＳ４２において、非排他実行部３０は、読み出したロック情報を参照して、何れかのタスクが排他ロックを取得しているかを判断する。非排他実行部３０は、ステップＳ４２での判断の結果、全てのタスクが排他ロックを解放している場合（Ｓ３２のＮｏ）、処理をステップＳ４３に進める。
【００６７】
ステップＳ４３において、非排他実行部３０は、ローカルの記憶領域に保存した更新情報（ステップＳ３１で読み出した更新情報）と、ステップＳ４１で読み出した更新情報とが一致したかを判断する。即ち、非排他実行部３０は、ステップＳ４３において、第２タスクに含まれるクリティカルセクションの処理の前後においてロック状態記憶部２６に記憶された更新情報が変化したか判断する。
【００６８】
非排他実行部３０は、ステップＳ４３での判断の結果、更新情報が一致した場合には（Ｓ４３のＹｅｓ）、第２タスクに含まれる当該クリティカルセクションの処理を完了させる。即ち、非排他実行部３０は、第２タスクに含まれるクリティカルセクションの処理の前後においてロック状態記憶部２６に記憶された更新情報が変化していない場合には、第２タスクに含まれる当該クリティカルセクションの処理を完了させる。
【００６９】
これにより、非排他実行部３０は、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させることができる。そして、非排他実行部３０は、第２タスクに含まれるクリティカルセクションの処理の前後において、ロック状態記憶部２６に排他ロックを解放していることを示すロック情報が記憶され且つ更新情報が変化していないことを条件として、当該クリティカルセクションの処理が成功したと判断することができる。
【００７０】
また、非排他実行部３０は、ステップＳ４２での判断の結果、何れかのタスクが排他ロックを取得している場合（Ｓ４２のＹｅｓ）、処理をステップＳ４４に進める。ステップＳ４４において、非排他実行部３０は、ステップＳ４１で読み出したタスク識別情報を参照して、第２タスクが排他ロックを取得しているか（即ち、自分が排他ロックを取得しているか）を判断する。非排他実行部３０は、一例として、読み出したタスク識別情報と、第２タスクの識別情報とが一致するかを判断する。
【００７１】
非排他実行部３０は、ステップＳ４４での判断の結果、第２タスクが排他ロックを取得していない場合、即ち、読み出したタスク識別情報と第２タスクの識別情報とが一致しない場合（Ｓ４４のＮｏ）、処理をステップＳ４５に進める。また、非排他実行部３０は、ステップＳ４３での判断の結果、更新情報が一致しない場合にも（Ｓ４３のＮｏ）、処理をステップＳ４５に進める。
【００７２】
ステップＳ４５において、非排他実行部３０は、第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しないかを判断する。非排他実行部３０は、一例として、第２タスクに含まれるクリティカルセクションの処理を所定回以上繰り返しても成功しないかを判断する。また、非排他実行部３０は、一例として、第２タスクに含まれる当該クリティカルセクションの処理を開始してから所定時間経過しても成功しないかを判断してもよい。
【００７３】
非排他実行部３０は、ステップＳ４５での判断の結果、第２タスクによるクリティカルセクションの処理が所定条件に達していない場合（Ｓ４５のＮｏ）、処理を図５のステップＳ３１に戻して、ロック情報等の読出しから処理を繰り返す。
【００７４】
これにより、非排他実行部３０は、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行した後、何れかのタスクが排他ロックを取得した場合、且つ、第２タスクによるクリティカルセクションの処理が所定条件に達していない場合に、当該クリティカルセクションの処理を再実行させることができる。従って、非排他実行部３０は、全てのタスクが排他ロックを取得していない状態で実行されるまで、第２タスクに含まれるクリティカルセクションの処理を繰り返し実行させることができる。
【００７５】
また、非排他実行部３０は、ステップＳ４５での判断の結果、第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しない場合（Ｓ４５のＹｅｓ）、処理をステップＳ４６に進める。ステップＳ４６において、非排他実行部３０は、排他ロックを取得する。ステップＳ４６において、非排他実行部３０は、図３に示したステップＳ１１〜ステップＳ１７と同様の処理を行う。
【００７６】
排他ロックを取得できると（ステップＳ４６の処理が終了）、非排他実行部３０は、処理をステップＳ４０に進めて、第２タスク実行部２４に第２タスクのクリティカルセクションの処理を実行させる。これにより、非排他実行部３０は、第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しない場合に、排他ロックを取得して第２タスクに含まれるクリティカルセクションの処理を実行させることができる。
【００７７】
また、非排他実行部３０は、ステップＳ４４での判断の結果、第２タスクが排他ロックを取得している場合、即ち、読み出したタスク識別情報と第２タスクの識別情報とが一致した場合（Ｓ４４のＹｅｓ）、処理をステップＳ４７に進める。ステップＳ４７において、非排他実行部３０は、ロック状態記憶部２６から再帰情報を読み出し、読み出した再帰情報に示された繰り返し回数が０かを判断する。
【００７８】
非排他実行部３０は、ステップＳ４７での判断の結果、再帰情報の繰返し回数が０の場合（Ｓ４７のＹｅｓ）、処理をステップＳ４８に進める。ステップＳ４８において、非排他実行部３０は、排他ロックを解放する。
【００７９】
即ち、ステップＳ４８において、非排他実行部３０は、ロック状態記憶部２６に排他ロックを解放していることを示すロック情報を書き込む。これと共に、ステップＳ４８において、非排他実行部３０は、排他ロックの取得時において読み出した更新情報をローカルの記憶領域から読み出して、読み出した更新情報を更新した新たな更新情報をロック状態記憶部２６に書き込む。非排他実行部３０は、ステップＳ４８の処理を終えると、第２タスクに含まれるクリティカルセクションの処理を完了して、当該クリティカルセクションに続く第２タスクの処理を実行させる。
【００８０】
また、非排他実行部３０は、ステップＳ４７での判断の結果、再帰情報の繰り返し回数が０でない場合（Ｓ４７のＮｏ）、処理をステップＳ４９に進める。ステップＳ４９において、非排他実行部３０は、ロック状態記憶部２６に記憶されたロック情報およびタスク識別情報を維持して、ロック状態記憶部２６に記憶された再帰情報の繰返し回数をデクリメントする。非排他実行部３０は、ステップＳ２４の処理を終えると、第２タスクに含まれるクリティカルセクションの処理を完了して、第２タスク実行部２４に、第２タスクに含まれるクリティカルセクションに続く処理、即ち、ネストした外側のクリティカルセクションの処理を実行させる。
【００８１】
図５および図６のフローに示されるように、非排他実行部３０は、他のタスクの実行に影響を与えるコード（例えば共有変数への書き込み）を含まないクリティカルセクションの処理を、排他ロックの取得を省略して実行させることができる。これにより、コンピュータシステム１０によれば、コストの大きい原子的な命令を実行することなく、クリティカルセクションの処理を実行することができる。
【００８２】
また、非排他実行部３０は、当該クリティカルセクションの処理の前後で更新情報が一致するか否かを確認し、一致しなければ当該クリティカルセクションの処理を再実行する。これにより、コンピュータシステム１０によれば、当該タスクと他のタスクとの間で一貫性を保ってクリティカルセクションの処理を実行することができる。
【００８３】
また、非排他実行部３０は、クリティカルセクションの処理を複数回実行する場合において、所定数回または所定時間実行しても処理が成功しない場合には、排他ロックを取得してクリティカルセクションの処理を実行する。これにより、コンピュータシステム１０によれば、他のタスクによるクリティカルセクションの処理において書き込みが頻発して、当該タスクのクリティカルセクションの処理が長時間完了しなくなってしまうことを回避することができる。
【００８４】
図７は、本実施形態に係る非排他実行部３０による、排他ロックの取得を省略して実行されるクリティカルセクションの処理内における、ポインタで示されるアドレスをレジスタに読み込んでそのアドレスにアクセスする直前、および、ループの分岐判断の直前において、非排他実行部３０が行う処理フローを示す。
【００８５】
非排他実行部３０は、第２タスクに含まれるクリティカルセクションの処理（図５および図６のステップＳ４０の処理）内における、ポインタで示されるアドレスをレジスタに読み込んでそのアドレスにアクセスする直前、および、ループの分岐判断の直前において、図７のステップＳ５１〜Ｓ５６の処理を実行する。
【００８６】
まず、ステップＳ５１において、非排他実行部３０は、ロック状態記憶部２６からロック情報を読み出す。さらに、ステップＳ５１において、非排他実行部３０は、ロック状態記憶部２６の所定の記憶領域から更新情報またはタスク識別情報を読み出す。
【００８７】
続いて、ステップＳ５２において、非排他実行部３０は、読み出したロック情報を参照して、何れかのタスクが排他ロックを取得しているかを判断する。非排他実行部３０は、ステップＳ５２での判断の結果、全てのタスクが排他ロックを解放している場合（Ｓ５２のＮｏ）、処理をステップＳ５３に進める。
【００８８】
ステップＳ５３において、非排他実行部３０は、ローカルの記憶領域に保存した更新情報（図５のステップＳ３１で読み出した更新情報）と、ステップＳ５１で読み出した更新情報とが一致したかを判断する。即ち、非排他実行部３０は、ステップＳ５３において、第２タスクに含まれるクリティカルセクションの処理前からロック状態記憶部２６に記憶された更新情報が変化したかを判断する。
【００８９】
非排他実行部３０は、ステップＳ５３での判断の結果、更新情報が一致した場合には（Ｓ５３のＹｅｓ）、即ち、第２タスクに含まれるクリティカルセクションの処理の前からロック状態記憶部２６に記憶された更新情報が変化していない場合には、当該処理を抜けてクリティカルセクションの処理を続行させる。即ち、非排他実行部３０は、ポインタで示されるアドレスをレジスタに読み込んでそのアドレスにアクセスする処理、または、ループの分岐判断の処理を実行させる。
【００９０】
非排他実行部３０は、ステップＳ５３での判断の結果、更新情報が一致しない場合には（Ｓ５３のＮｏ）、即ち、第２タスクに含まれるクリティカルセクションの処理の前からロック状態記憶部２６に記憶された更新情報が変化した場合には、処理をステップＳ５４に進める。ステップＳ５４において、非排他実行部３０は、第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しないかを判断する。非排他実行部３０は、一例として、第２タスクに含まれるクリティカルセクションの処理を所定回以上繰り返しても成功しないかを判断する。また、非排他実行部３０は、一例として、第２タスクに含まれる当該クリティカルセクションの処理を開始してから所定時間経過しても成功しないかを判断してもよい。
【００９１】
非排他実行部３０は、ステップＳ５４での判断の結果、第２タスクによるクリティカルセクションの処理が所定条件に達していない場合、処理を図５のステップＳ３１に戻して、ロック情報等の読出しから処理を繰り返す。これにより、非排他実行部３０は、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行した後、何れかのタスクが排他ロックを取得した場合、且つ、第２タスクによるクリティカルセクションの処理が所定条件に達していない場合に、当該クリティカルセクションの処理を再実行させることができる。
【００９２】
また、非排他実行部３０は、ステップＳ５２での判断の結果、何れかのタスクが排他ロックを取得している場合（Ｓ５２のＹｅｓ）、処理をステップＳ５５に進める。ステップＳ５５において、非排他実行部３０は、ステップＳ５１で読み出したタスク識別情報を参照して、第２タスクが排他ロックを取得しているか（即ち、自分が排他ロックを取得しているか）を判断する。非排他実行部３０は、一例として、読み出したタスク識別情報と、第２タスクの識別情報とが一致するかを判断する。
【００９３】
非排他実行部３０は、ステップＳ５５での判断の結果、第２タスクが排他ロックを取得している場合、即ち、読み出したタスク識別情報と第２タスクの識別情報とが一致した場合（Ｓ５５のＹｅｓ）、当該処理を抜けてクリティカルセクションの処理を続行させる。即ち、非排他実行部３０は、ポインタで示されるアドレスをレジスタに読み込んでそのアドレスにアクセスする処理、または、ループの分岐判断の処理を実行させる。
【００９４】
また、非排他実行部３０は、ステップＳ５５での判断の結果、第２タスクが排他ロックを取得していない場合、即ち、読み出したタスク識別情報と第２タスクの識別情報とが一致しない場合（Ｓ５５のＮｏ）、処理をステップＳ５６に進める。また、非排他実行部３０は、ステップＳ５４での判断の結果、第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しない場合も（Ｓ５４のＹｅｓ）、処理をステップＳ５６に進める。
【００９５】
ステップＳ５６において、非排他実行部３０は、排他ロックを取得する。ステップＳ５６において、非排他実行部３０は、図３に示したステップＳ１１〜ステップＳ１７と同様の処理を行う。
【００９６】
排他ロックを取得できると（ステップＳ５６の処理が終了）、非排他実行部３０は、処理を図６に示すステップＳ４０に進めて、第２タスク実行部２４に第２タスクのクリティカルセクションの処理を実行させる。これにより、非排他実行部３０は、第２タスクによるクリティカルセクションの処理が所定条件に達しても成功しない場合に、排他ロックを取得して第２タスクに含まれるクリティカルセクションの処理を最初から実行させることができる。
【００９７】
図７のフローに示されるように、非排他実行部３０は、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させる場合において、当該クリティカルセクションの処理に含まれるループ処理の中で、当該クリティカルセクションの処理前から更新情報が変化したか否かを確認する。そして、非排他実行部３０は、更新情報が変化した場合には第２タスクに含まれるクリティカルセクションの処理を失敗したと判定する。これにより、コンピュータシステム１０によれば、クリティカルセクション中のループ処理において、他のタスクがクリティカルセクションの処理を実行した結果、ループが終了しなくなり無限ループとなることを回避することができる。
【００９８】
また、非排他実行部３０は、排他ロックを取得せずに第２タスクに含まれるクリティカルセクションの処理を実行させる場合において、当該クリティカルセクションの処理中においてポインタの参照先へのアクセスに先立って、当該クリティカルセクションの処理前から更新情報が変化したか否かを確認する。そして、非排他実行部３０は、更新情報が変化した場合には第２タスクに含まれるクリティカルセクションの処理を失敗したと判定する。これにより、非排他実行部３０は、ポインタの参照先に他のタスクがＮＵＬＬ等を書き込んだ場合に、スレッド等がＮＵＬＬにアクセスして実行を停止してしまうことを回避することができる。
【００９９】
なお、ループの分岐判断の直前において図７に示されるフローを実行する場合、非排他実行部３０は、Ｊａｖａ（登録商標）等により実装される非同期イベントチェック機構を用いて処理を行ってもよい。非同期イベントチェック機構は、メソッドのエントリおよびループのバックエッジにおいて実行される。従って、当該非同期イベントチェック機構を用いることにより、非排他実行部３０は、図７に示されるフローをオーバーヘッド無しに処理することができる。
【０１００】
図８は、本実施形態に係る非排他実行部３０による、排他ロックの取得を省略して実行されるクリティカルセクションの処理内における、ループ処理内で非排他実行部３０が行う処理フローを示す。本実施形態に係るコンピュータシステム１０は、他のタスクの実行に影響を与えるコード（共有変数への書込命令および共有変数への書込命令を含む関数の呼出命令等）を含むクリティカルセクションを、排他ロックを取得して確実に処理を実行する。
【０１０１】
しかし、他のタスクの実行に影響を与えるコードが条件判断の後に発生して、稀にしか実行されない場合には、当該クリティカルセクションを、排他ロックの取得を省略して楽観的に処理を実行してもよい。この場合、非排他実行部３０は、当該クリティカルセクションを図５から図７に示したフローに従って処理をするとともに、条件判断の後であって他のタスクの実行に影響を与えるコードの前において、図８のステップＳ６１〜Ｓ６５の処理を実行する。
【０１０２】
まず、ステップＳ６１において、非排他実行部３０は、ロック状態記憶部２６からロック情報を読み出す。さらに、ステップＳ６１において、非排他実行部３０は、ロック状態記憶部２６の所定の記憶領域から更新情報またはタスク識別情報を読み出す。
【０１０３】
続いて、ステップＳ６２において、非排他実行部３０は、読み出したロック情報を参照して、何れかのタスクが排他ロックを取得しているかを判断する。非排他実行部３０は、ステップＳ６２での判断の結果、全てのタスクが排他ロックを解放している場合（Ｓ６２のＮｏ）、処理をステップＳ６３に進める。
【０１０４】
ステップＳ６３において、非排他実行部３０は、排他ロックを取得する。即ち、非排他実行部３０は、ロック情報およびタスク識別情報をロック状態記憶部２６に原子的に書き込む。非排他実行部３０は、排他ロックの取得が成功した場合には（Ｓ６３の成功）、読み出した更新情報をローカルの記憶領域に保存した後、当該処理を抜けてクリティカルセクションの処理を続行させる。
【０１０５】
また、非排他実行部３０は、ステップＳ６２での判断の結果、何れかのタスクが排他ロックを取得している場合（Ｓ６２のＹｅｓ）、処理をステップＳ６４に進める。ステップＳ６４において、非排他実行部３０は、ステップＳ６１で読み出したタスク識別情報を参照して、第２タスクが排他ロックを取得しているか（即ち、自分が排他ロックを取得しているか）を判断する。非排他実行部３０は、一例として、読み出したタスク識別情報と、第２タスクの識別情報とが一致するかを判断する。
【０１０６】
非排他実行部３０は、ステップＳ６４での判断の結果、第２タスクが排他ロックを取得している場合、即ち、読み出したタスク識別情報と第２タスクの識別情報とが一致した場合（Ｓ６４のＹｅｓ）、当該処理を抜けてクリティカルセクションの処理を続行させる。
【０１０７】
非排他実行部３０は、ステップＳ６４での判断の結果、第２タスクが排他ロックを取得していない場合（Ｓ６４のＮｏ）、処理をステップＳ６５に進める。また、非排他実行部３０は、ステップＳ６３の処理で排他ロックの取得が失敗した場合にも（Ｓ６３の失敗）、処理をステップＳ６５に進める。
【０１０８】
ステップＳ６５において、非排他実行部３０は、排他ロックを取得する。ステップＳ６５において、非排他実行部３０は、図３に示したステップＳ１１〜ステップＳ１７と同様の処理を行う。
【０１０９】
排他ロックを取得できると（ステップＳ６４の処理が終了）、非排他実行部３０は、処理を図６に示すステップＳ４０に進めて、第２タスク実行部２４に第２タスクのクリティカルセクションの処理を実行させる。これにより、非排他実行部３０は、排他ロックを取得して第２タスクに含まれるクリティカルセクションの処理を実行させることができる。
【０１１０】
図８のフローに示されるように、非排他実行部３０は、第２タスクに含まれるクリティカルセクションの処理において条件判断をした結果、タスク間で共有される共有変数に書き込みをする場合に、当該クリティカルセクションの処理前から更新情報が変化していないことを確認した上で、条件判断の後かつ共有変数の書き込み前に排他ロックを取得する。これにより、コンピュータシステム１０によれば、他のタスクの実行に影響を与えるコードが稀にしか発生しないタスクのクリティカルセクションを、排他ロックの取得を省略して実行することができる。
【０１１１】
なお、コード生成部１４は、クリティカルセクション内のループ内に、他のタスクの実行に影響を与えるコードが含まれている場合、例外として、当該クリティカルセクションを排他ロックの取得を省略して実行させる制御コードを発生する。この場合において、コード生成部１４は、実行プロファイルに基づき当該コードの実行頻度が基準値より少ないと判断した場合およびユーザに指定された場合等に、例外として排他ロックの取得を省略して実行させる制御コードを発生してもよい。
【０１１２】
図９は、メモリをロック状態記憶部２６として機能させるための、Ｊａｖａ（登録商標）により記述されたコードの一例を示す。図９に示されるコードは、共有変数として、"ｃｏｕｎｔｅｒ"および"ｒｅｃｕｒｓｉｏｎＣｏｕｎｔｅｒ"を定義する。
【０１１３】
"ｃｏｕｎｔｅｒ"は、固定長の整数であり、原子的に書き込みがされる。"ｃｏｕｎｔｅｒ"は、最下位の１ビットにロック情報が書き込まれ、２ビット目以上に更新情報またはタスク識別情報が書き込まれる。
【０１１４】
"ｒｅｃｕｒｓｉｏｎＣｏｕｎｔｅｒ"は、固定長の整数である。"ｒｅｃｕｒｓｉｏｎＣｏｕｎｔｅｒ"は、再帰情報が書き込まれる。コンピュータシステム１０は、このように記述されたコードを実行することにより、メモリをロック状態記憶部２６として機能させることができる。
【０１１５】
図１０および図１１は、Ｊａｖａ（登録商標）のアプリケーションにおいて多く使用されるｂｉｍｏｄａｌロックとともに本実施形態に係るロック状態記憶部２６を実現する場合の、ロック変数の構造の一例を示す。図１０は、ロック解放時のロック変数の構造を示す。図１１は、ロック取得時のロック変数の構造を示す。
【０１１６】
本例のロック変数は、最下位ビットが"Ｉｎｆｌａｔｅｄ"ビットであり、２ビット目が"ＦＬＣ"ビットであり、３ビット目がロック情報である。"Ｉｎｆｌａｔｅｄビット"および"ＦＬＣビット"は、ｂｉｍｏｄａｌロックにおいて用いられている機能と同様である。ロック情報は、１の場合に排他ロックが取得されていることを示し、０の場合に排他ロックが解放されていることを示す。
【０１１７】
また、本例のロック変数は、ロック解放時には、４ビット目から最上位ビットまでが更新情報である。また、本例のロック変数は、ロック取得時には、４ビット目から最上位ビットまでが２分割され、下位ビット側が再帰情報であり、上位ビット側がタスク識別情報である。
【０１１８】
当該コンピュータシステム１０は、このようなロック変数を実行することにより、メモリ上に、排他ロックを取得している場合にタスク識別情報および再帰情報を所定の記憶領域に記憶し、全てのタスクが排他ロックを解放している場合に更新情報を所定の記憶領域に記憶するロック状態記憶部を実現できる。また、このようなロック変数は、例えば、１ワード等のデータ長にすることが好ましい。
【０１１９】
本例に係るロック変数を用いて排他ロックを取得する場合、排他実行部２８は、図３に示される処理を行う。ただし、"Ｉｎｆｌａｔｅｄ"ビットがセットされている場合、排他実行部２８は、オペレーティングシステムのモニタを使用して排他ロックを取得する。また、排他実行部２８は、図３のステップＳ１３において、再帰情報およびタスク識別情報を組み合わせたビット列に"４"を加算した値を、原子的にロック変数に書き込む。
【０１２０】
また、本例に係るロック変数を用いて排他ロックを取得する場合、排他実行部２８は、図４に示される処理を行う。ただし、"Ｉｎｆｌａｔｅｄ"ビットがセットされている場合、排他実行部２８は、オペレーティングシステムのモニタを使用して排他ロックを解放する。
【０１２１】
また、"ＦＬＣ"ビットがセットされている場合、排他実行部２８は、排他ロックをインフレーションする。この場合、排他実行部２８は、ローカル変数に保存した更新情報に"８"を加算した値をインフレーション後に使用されるモニタ変数内に保存する。モニタ変数内に保存された値は、排他ロックをデフレーションする場合に、ロック変数内の更新情報の初期化値として用いられる。また、排他実行部２８は、図４のステップＳ２３の処理において、ローカル変数に保存した更新情報に"８"を加算した値をロック変数に書き込む。
【０１２２】
また、本例に係るロック変数を用いて、排他ロックの取得を省略してクリティカルセクションの処理を実行する場合、非排他実行部３０は、図５〜図８に示される処理を行う。ただし、"Ｉｎｆｌａｔｅｄ"ビットがセットされている場合、非排他実行部３０は、オペレーティングシステムのモニタを使用して排他ロックの取得および解放を行う。
【０１２３】
更に、"ＦＬＣ"ビットがセットされている場合、非排他実行部３０は、図６のステップＳ４８の処理において、排他ロックをインフレーションする。この場合、非排他実行部３０は、ローカル変数に保存した更新情報に"８"を加算した値をインフレーション後に使用されるモニタ変数内に保存する。以上のような処理を行うことにより、コンピュータシステム１０は、ｂｉｍｏｄａｌロックを使用したアプリケーションに、本実施形態を適用することができる。
【０１２４】
図１２は、本実施形態に係るコード生成部１４の機能構成の一例を示す。当該コンピュータシステム１０がＪａｖａ（登録商標）の環境下において動作する場合、コード生成部１４はＪＩＴコンパイラにより実現される。この場合、図１２に示されるように、コード生成部１４は、解析部４２と、コンパイル部４４とを有する。
【０１２５】
解析部４２は、実行されるメソッド内の"ｓｙｎｃｈｒｏｎｉｚｅｄ"ブロックを解析して、他のタスクの実行に影響を与えるコードを含むクリティカルセクションを検出する。解析部４２は、一例として、"ｓｙｎｃｈｒｏｎｉｚｅｄ"ブロック内に、例えば、ヒープ（インスタンス変数、静的変数および配列要素等）への書き込み処理、ヒープへの書き込みを含むメソッド呼び出し処理、および、ｎａｔｉｖｅメソッド等を含むクリティカルセクションを検出する。
【０１２６】
コンパイル部４４は、メソッドの実行コードを生成する。更に、コンパイル部４４は、他のタスクの実行に影響を与えるコードを含むクリティカルセクションに対応して、図３および図４に示されるフローを実行するための制御コードを生成する。
【０１２７】
また、コンパイル部４４は、他のタスクの実行に影響を与えるコードを含まないクリティカルセクションに対応して、図５、図６および図７に示されるフローを実行するための制御コードを生成する。これにより、コード生成部１４によれば、ＣＰＵをコンピュータシステム１０として機能させる制御コードを生成することができる。
【０１２８】
また、コンパイル部４４は、他のタスクの実行に影響を与えるコードを含むクリティカルセクションであっても、実行プロファイルに基づき当該コードの実行頻度が基準値より少ないと判断した場合には、例外として、当該クリティカルセクションについて、図５から図８に示されるフローを実行するための制御コードを生成してもよい。
【０１２９】
また、他のタスクの実行に影響を与えるコードを含まない場合であっても、他のタスクとの間で一貫性を保たない状態でクリティカルセクションの処理を実行したことによる例外処理が発生する場合がある。そこで、コード生成部１４は、他のタスクの実行に影響を与えるコードを含まないクリティカルセクションをキャッチブロックとして指定して、キャッチブロック内において例外が発生した場合に図６のステップＳ４１以降の処理を実行する制御コードを生成する。
【０１３０】
これにより、コンピュータシステム１０は、例外が発生した場合であってもタスク間での一貫性が保たれている場合には、例外をそのままアプリケーションに渡すが、タスク間での一貫性が保たれていないことにより例外が発生した場合には、図５のステップＳ３１から再度処理を実行することができる。従って、コンピュータシステム１０は、例外発生による実行の中断を少なくすることができる。
【０１３１】
また、コンピュータシステム１０は、Ｊａｖａ（登録商標）による実行環境において、書き込みの無いクリティカルセクションをＪＩＴコンパイラによって検出することにより、ソースコードの書き換えなしで排他ロックを省略することができる。しかし、書き込みの無いクリティカルセクションであっても、クリティカルセクション内に仮想メソッド呼び出しが存在し、その呼び出し先が確定しないので、当該クリティカルセクションを書き込み無しであると判断できない場合がある。
【０１３２】
このような場合、ユーザは、書き込み無しのクリティカルセクションを指定してもよい。例えば、メソッド名と行数から構成されるリストをＪＶＭの起動時に指定したり、ｓｙｎｃｈｒｏｎｚｉｅｄメソッドに対してアノテーションを付加したりする。これにより、コンピュータシステム１０によれば、ＪＩＴコンパイラにより書き込みの有無の検出が困難なクリティカルセクションであっても、排他ロックの取得を省略して処理を実行させることができる。
【０１３３】
図１３は、書き込みがあるクリティカルセクションの一例を示す。図１４は、書き込みが無いクリティカルセクションの一例を示す。
【０１３４】
コンピュータシステム１０は、弱一貫性（ｗｅａｋ−ｃｏｎｓｉｓｔｅｎｃｙ）のメモリモデルを採用するＣＰＵにより実現される場合がある。このような場合、コンピュータシステム１０は、適切なメモリバリアを実行して、一貫性のある実行結果を得るように動作する。
【０１３５】
例えば、コンピュータシステム１０が、適切なメモリバリアを実行せずに、図１３に示されるクリティカルセクションの処理を実行するとともに、図１４に示されるクリティカルセクションの処理を実行した場合について説明する。図１３のクリティカルセクション内では、ＸおよびＹのそれぞれに１が書き込まれている。従って、図１４のクリティカルセクションの処理を実行した後において、ｖ１およびｖ２は、同じ値になることが期待される。しかしながら、適切なメモリバリア無しでクリティカルセクションの処理を実行した場合、ｖ１とｖ２は、異なる値となる可能性がある。
【０１３６】
まず、スレッドＴ１が図１４中の１０行目までを実行したと仮定する。次に、スレッドＴ２が図１３の１１行目までを実行したと仮定する。次に、スレッドＴ１が図１４の１２行目までを実行したと仮定する。このとき、スレッドＴ２はまだ図１３の１２行目を実行していないので、ｖ１の値は１、ｖ２の値は０である。この場合、図１４の１２行目において、ｖの値と読み出したカウンタ値（更新情報）は異なっていなければならない。
【０１３７】
しかしながら、メモリバリアが無い場合、スレッドＴ２が図１３の１１行目を実行した時点で、６行目のカウンタ値（更新情報）の書き込みが終了していることが保証されていない。このように、図１４の１２行目において、ｖの値と読み出したカウンタ値（更新情報）は必ずしも異なるとは限らない。そこで、コンピュータシステム１０は、以下のメモリバリアを実行して、一貫性の無い実行を回避する。
【０１３８】
コンピュータシステム１０は、書き込みのあるクリティカルセクションの処理を実行する前において、排他ロックを取得した後に、ｓｔｏｒｅ／ｌｏａｄとｓｔｏｒｅ／ｓｔｏｒｅの順序を保つためのメモリバリアを実行する。また、コンピュータシステム１０は、書き込みのあるクリティカルセクションの処理を実行した後において、排他ロックを解放する前に、ｌｏａｄ／ｓｔｏｒｅとｓｔｏｒｅ／ｓｔｏｒｅの順序を保つためのメモリバリアを実行する。
【０１３９】
また、コンピュータシステム１０は、書き込みの無いクリティカルセクションの処理の更新情報の読出し後に、ｌｏａｄ／ｌｏａｄの順序を保つためのメモリバリアを実行する。また、コンピュータシステム１０は、書き込みの無いクリティカルセクションの更新情報の一致を確認する処理の前において、ｌｏａｄ／ｌｏａｄの順序を保つためのメモリバリアを実行する。
【０１４０】
また、更に、Ｊａｖａ（登録商標）では、 "ｓｙｎｃｈｒｏｎｉｚｅｄ"ブロックの内側と外側、および、"ｓｙｎｃｈｒｏｎｉｚｅｄ"ブロックの前後において、ｌｏａｄおよびｓｔｏｒｅの順序の変更を禁止する。従って、コンピュータシステム１０は、Ｊａｖａ（登録商標）により実装される場合、書き込みの無いクリティカルセクションの処理の更新情報の読出し後に、ｌｏａｄ／ｌｏａｄに加えて、ｓｔｏｒｅ／ｌｏａｄおよびｓｔｏｒｅ／ｓｔｏｒｅの順序を保つメモリバリアも実行する。
【０１４１】
図１５は、本実施形態に係るコンピュータ１９００のハードウェア構成の一例を示す。本実施形態に係るコンピュータ１９００は、ホスト・コントローラ２０８２により相互に接続されるＣＰＵ２０００、ＲＡＭ２０２０、グラフィック・コントローラ２０７５、及び表示装置２０８０を有するＣＰＵ周辺部と、入出力コントローラ２０８４によりホスト・コントローラ２０８２に接続される通信インターフェイス２０３０、ハードディスクドライブ２０４０、及びＣＤ−ＲＯＭドライブ２０６０を有する入出力部と、入出力コントローラ２０８４に接続されるＲＯＭ２０１０、フレキシブルディスク・ドライブ２０５０、及び入出力チップ２０７０を有するレガシー入出力部とを備える。
【０１４２】
ホスト・コントローラ２０８２は、ＲＡＭ２０２０と、高い転送レートでＲＡＭ２０２０をアクセスするＣＰＵ２０００及びグラフィック・コントローラ２０７５とを接続する。ＣＰＵ２０００は、ＲＯＭ２０１０及びＲＡＭ２０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィック・コントローラ２０７５は、ＣＰＵ２０００等がＲＡＭ２０２０内に設けたフレーム・バッファ上に生成する画像データを取得し、表示装置２０８０上に表示させる。これに代えて、グラフィック・コントローラ２０７５は、ＣＰＵ２０００等が生成する画像データを格納するフレーム・バッファを、内部に含んでもよい。
【０１４３】
入出力コントローラ２０８４は、ホスト・コントローラ２０８２と、比較的高速な入出力装置である通信インターフェイス２０３０、ハードディスクドライブ２０４０、ＣＤ−ＲＯＭドライブ２０６０を接続する。通信インターフェイス２０３０は、ネットワークを介して他の装置と通信する。ハードディスクドライブ２０４０は、コンピュータ１９００内のＣＰＵ２０００が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ２０６０は、ＣＤ−ＲＯＭ２０９５からプログラム又はデータを読み取り、ＲＡＭ２０２０を介してハードディスクドライブ２０４０に提供する。
【０１４４】
また、入出力コントローラ２０８４には、ＲＯＭ２０１０と、フレキシブルディスク・ドライブ２０５０、及び入出力チップ２０７０の比較的低速な入出力装置とが接続される。ＲＯＭ２０１０は、コンピュータ１９００が起動時に実行するブート・プログラム、及び／又は、コンピュータ１９００のハードウェアに依存するプログラム等を格納する。フレキシブルディスク・ドライブ２０５０は、フレキシブルディスク２０９０からプログラム又はデータを読み取り、ＲＡＭ２０２０を介してハードディスクドライブ２０４０に提供する。入出力チップ２０７０は、フレキシブルディスク・ドライブ２０５０を入出力コントローラ２０８４へと接続すると共に、例えばパラレル・ポート、シリアル・ポート、キーボード・ポート、マウス・ポート等を介して各種の入出力装置を入出力コントローラ２０８４へと接続する。
【０１４５】
ＲＡＭ２０２０を介してハードディスクドライブ２０４０に提供されるプログラムは、フレキシブルディスク２０９０、ＣＤ−ＲＯＭ２０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、記録媒体から読み出され、ＲＡＭ２０２０を介してコンピュータ１９００内のハードディスクドライブ２０４０にインストールされ、ＣＰＵ２０００において実行される。
【０１４６】
コンピュータ１９００にインストールされ、コンピュータ１９００をコンピュータシステム１０として機能させるプログラムは、第１タスク実行モジュールと、第２タスク実行モジュールと、ロック状態記憶モジュールと、排他実行モジュールと、非排他実行モジュールとを備える。これらのプログラム又はモジュールは、ＣＰＵ２０００等に働きかけて、コンピュータ１９００を、第１タスク実行部２２、第２タスク実行部２４、ロック状態記憶部２６、排他実行部２８および非排他実行部３０としてそれぞれ機能させる。
【０１４７】
これらのプログラムに記述された情報処理は、コンピュータ１９００に読込まれることにより、ソフトウェアと上述した各種のハードウェア資源とが協働した具体的手段である第１タスク実行部２２、第２タスク実行部２４、ロック状態記憶部２６、排他実行部２８および非排他実行部３０として機能する。そして、これらの具体的手段によって、本実施形態におけるコンピュータ１９００の使用目的に応じた情報の演算又は加工を実現することにより、使用目的に応じた特有のコンピュータシステム１０が構築される。
【０１４８】
一例として、コンピュータ１９００と外部の装置等との間で通信を行う場合には、ＣＰＵ２０００は、ＲＡＭ２０２０上にロードされた通信プログラムを実行し、通信プログラムに記述された処理内容に基づいて、通信インターフェイス２０３０に対して通信処理を指示する。通信インターフェイス２０３０は、ＣＰＵ２０００の制御を受けて、ＲＡＭ２０２０、ハードディスクドライブ２０４０、フレキシブルディスク２０９０、又はＣＤ−ＲＯＭ２０９５等の記憶装置上に設けた送信バッファ領域等に記憶された送信データを読み出してネットワークへと送信し、もしくは、ネットワークから受信した受信データを記憶装置上に設けた受信バッファ領域等へと書き込む。このように、通信インターフェイス２０３０は、ＤＭＡ（ダイレクト・メモリ・アクセス）方式により記憶装置との間で送受信データを転送してもよく、これに代えて、ＣＰＵ２０００が転送元の記憶装置又は通信インターフェイス２０３０からデータを読み出し、転送先の通信インターフェイス２０３０又は記憶装置へとデータを書き込むことにより送受信データを転送してもよい。
【０１４９】
また、ＣＰＵ２０００は、ハードディスクドライブ２０４０、ＣＤ−ＲＯＭドライブ２０６０（ＣＤ−ＲＯＭ２０９５）、フレキシブルディスク・ドライブ２０５０（フレキシブルディスク２０９０）等の外部記憶装置に格納されたファイルまたはデータベース等の中から、全部または必要な部分をＤＭＡ転送等によりＲＡＭ２０２０へと読み込ませ、ＲＡＭ２０２０上のデータに対して各種の処理を行う。そして、ＣＰＵ２０００は、処理を終えたデータを、ＤＭＡ転送等により外部記憶装置へと書き戻す。このような処理において、ＲＡＭ２０２０は、外部記憶装置の内容を一時的に保持するものとみなせるから、本実施形態においてはＲＡＭ２０２０および外部記憶装置等をメモリ、記憶部、または記憶装置等と総称する。本実施形態における各種のプログラム、データ、テーブル、データベース等の各種の情報は、このような記憶装置上に格納されて、情報処理の対象となる。なお、ＣＰＵ２０００は、ＲＡＭ２０２０の一部をキャッシュメモリに保持し、キャッシュメモリ上で読み書きを行うこともできる。このような形態においても、キャッシュメモリはＲＡＭ２０２０の機能の一部を担うから、本実施形態においては、区別して示す場合を除き、キャッシュメモリもＲＡＭ２０２０、メモリ、及び／又は記憶装置に含まれるものとする。
【０１５０】
また、ＣＰＵ２０００は、ＲＡＭ２０２０から読み出したデータに対して、プログラムの命令列により指定された、本実施形態中に記載した各種の演算、情報の加工、条件判断、情報の検索・置換等を含む各種の処理を行い、ＲＡＭ２０２０へと書き戻す。例えば、ＣＰＵ２０００は、条件判断を行う場合においては、本実施形態において示した各種の変数が、他の変数または定数と比較して、大きい、小さい、以上、以下、等しい等の条件を満たすかどうかを判断し、条件が成立した場合（又は不成立であった場合）に、異なる命令列へと分岐し、またはサブルーチンを呼び出す。
【０１５１】
また、ＣＰＵ２０００は、記憶装置内のファイルまたはデータベース等に格納された情報を検索することができる。例えば、第１属性の属性値に対し第２属性の属性値がそれぞれ対応付けられた複数のエントリが記憶装置に格納されている場合において、ＣＰＵ２０００は、記憶装置に格納されている複数のエントリの中から第１属性の属性値が指定された条件と一致するエントリを検索し、そのエントリに格納されている第２属性の属性値を読み出すことにより、所定の条件を満たす第１属性に対応付けられた第２属性の属性値を得ることができる。
【０１５２】
以上に示したプログラム又はモジュールは、外部の記録媒体に格納されてもよい。記録媒体としては、フレキシブルディスク２０９０、ＣＤ−ＲＯＭ２０９５の他に、ＤＶＤ又はＣＤ等の光学記録媒体、ＭＯ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワーク又はインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ１９００に提供してもよい。
【０１５３】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【０１５４】
特許請求の範囲、明細書、および図面中において示した装置、システム、プログラム、および方法における動作、手順、ステップ、および段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り、任意の順序で実現しうることに留意すべきである。特許請求の範囲、明細書、および図面中の動作フローに関して、便宜上「まず、」、「次に、」等を用いて説明したとしても、この順で実施することが必須であることを意味するものではない。
【符号の説明】
【０１５５】
１０  コンピュータシステム
１２  プログラム格納部
１４  コード生成部
１６  実行部
２２  第１タスク実行部
２４  第２タスク実行部
２６  ロック状態記憶部
２８  排他実行部
３０  非排他実行部
４２  解析部
４４  コンパイル部
１９００  コンピュータ
２０００  ＣＰＵ
２０１０  ＲＯＭ
２０２０  ＲＡＭ
２０３０  通信インターフェイス
２０４０  ハードディスクドライブ
２０５０  フレキシブルディスク・ドライブ
２０６０  ＣＤ−ＲＯＭドライブ
２０７０  入出力チップ
２０７５  グラフィック・コントローラ
２０８０  表示装置
２０８２  ホスト・コントローラ
２０８４  入出力コントローラ
２０９０  フレキシブルディスク
２０９５  ＣＤ−ＲＯＭ
【図１】
2011128975.tif 000003
【図２】
2011128975.tif 000004
【図３】
2011128975.tif 000005
【図４】
2011128975.tif 000006
【図５】
2011128975.tif 000007
【図６】
2011128975.tif 000008
【図７】
2011128975.tif 000009
【図８】
2011128975.tif 000010
【図９】
2011128975.tif 000011
【図１０】
2011128975.tif 000012
【図１１】
2011128975.tif 000013
【図１２】
2011128975.tif 000014
【図１３】
2011128975.tif 000015
【図１４】
2011128975.tif 000016
【図１５】
2011128975.tif 000017
【手続補正書】
【提出日】平成22年7月21日(2010.7.21)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】００６１
【補正方法】変更
【補正の内容】
【００６１】
また、非排他実行部３０は、ステップＳ３２での判断の結果、何れかのタスクが排他ロックを取得している場合（Ｓ３２のＹｅｓ）、処理をステップＳ３４に進める。ステップＳ３４において、非排他実行部３０は、読み出したタスク識別情報を参照して、第１タスクが排他ロックを取得しているか（即ち、自分が排他ロックを取得しているか）を判断する。非排他実行部３０は、一例として、読み出したタスク識別情報と、第１タスクの識別情報とが一致するかを判断する。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１２０
【補正方法】変更
【補正の内容】
【０１２０】
また、本例に係るロック変数を用いて排他ロックを解放する場合、排他実行部２８は、図４に示される処理を行う。ただし、“Ｉｎｆｌａｔｅｄ”ビットがセットされている場合、排他実行部２８は、オペレーティングシステムのモニタを使用して排他ロックを解放する。