(57)【要約】【課題】  タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができる情報処理装置等を提供する。【解決手段】  情報処理装置は、タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する初期化手段と、前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する実行手段とを備える。【選択図】      図１
2019003415.tif 000002
【特許請求の範囲】
【請求項１】
タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する初期化手段と、
前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する実行手段と
を備えた情報処理装置。
【請求項２】
前記実行手段は、前記タスクにおける前記資源を専有する処理の実行において、前記資源に対するアクセスが完了すると、前記タスクの実行を割り当てられている前記プロセッサのカウンタの値をカウントダウンし、該カウントダウンしたカウンタの値が初期値である場合、前記ロック情報を解放して、前記タスクの実行を継続する
請求項１記載の情報処理装置。
【請求項３】
前記実行手段は、前記カウントダウンしたカウンタの値が初期値でない場合、前記ロック情報を解放せずに、前記タスクの実行を継続する
請求項２記載の情報処理装置。
【請求項４】
タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化し、
前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する
情報処理方法。
【請求項５】
前記タスクにおける前記資源を専有する処理の実行において、前記資源に対するアクセスが完了すると、前記タスクの実行を割り当てられている前記プロセッサのカウンタの値をカウントダウンし、該カウントダウンしたカウンタの値が初期値である場合、前記ロック情報を解放して、前記タスクの実行を継続する
請求項４記載の情報処理方法。
【請求項６】
前記カウントダウンしたカウンタの値が初期値でない場合、前記ロック情報を解放せずに、前記タスクの実行を継続する
請求項５記載の情報処理方法。
【請求項７】
タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する処理と、
前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する処理とを、
コンピュータに実行させる情報処理プログラム。
【請求項８】
前記タスクにおける前記資源を専有する処理の実行において、前記資源に対するアクセスが完了すると、前記タスクの実行を割り当てられている前記プロセッサのカウンタの値をカウントダウンし、該カウントダウンしたカウンタの値が初期値である場合、前記ロック情報を解放して、前記タスクの実行を継続する処理を、
コンピュータに実行させる請求項７記載の情報処理プログラム。
【請求項９】
前記タスクにおける前記資源を専有する処理の実行において、前記資源に対するアクセスが完了すると、前記タスクの実行を割り当てられている前記プロセッサのカウンタの値をカウントダウンし、前記カウントダウンしたカウンタの値が初期値でない場合、前記ロック情報を解放せずに、前記タスクの実行を継続する
コンピュータに実行させる請求項８記載の情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スピンロックによる排他制御を行う情報処理装置、情報処理方法および情報処理プログラムに関する。
【背景技術】
【０００２】
ソフトウェアにおける最小の実行単位であるタスクと、そのタスクの実行中に発生する割り込みとの間の排他制御の方式として、一般に、スピンロック（Ｓｐｉｎｌｏｃｋ）が用いられる。スピンロックでは、１つの資源に対して１つのロック変数がメモリに用意される（スピンロック初期化）。そして、タスクを実行するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）またはＣＰＵコアのうち、ロック変数を取得（スピンロック取得）できたＣＰＵまたはＣＰＵコアのみが、資源にアクセス可能となる。
【０００３】
ＣＰＵまたはＣＰＵコアは、資源へのアクセスが完了した際にロック変数を解放する（スピンロック解放）。これにより、他のＣＰＵまたはＣＰＵコアが、資源にアクセス可能となる。ＣＰＵまたはＣＰＵコアは、他のＣＰＵまたはＣＰＵコアが資源にアクセスしている場合、ロック変数を取得できるまでループしながらその資源が解放されるのを待ち続ける。なお、以降の説明では、ロック変数の取得または解放を、それぞれスピンロックの取得または解放とも表記する。
【０００４】
図１５は、関数Ａ、Ｂの処理について説明する図である。図１５に示すように、関数Ａ、Ｂにおいて、それぞれ処理Ａ、Ｂは、排他が必要な処理であるため、その処理Ａ、Ｂの前後に、それぞれスピンロックの取得と解放が行われる。
【０００５】
図１６は、関数Ａ、Ｂの処理の実行について説明する図である。図１６において、矢印ｔで示す方向は、各関数の実行中の時間経過を示す。関数Ａの実行中に関数Ｂが実行された場合、関数Ｂにおけるスピンロックの取得は、関数Ａにおいて取得されたスピンロックが解放されるまでの間、ループしながら待機される。よって、同じスピンロックを取得する処理が、同時に複数実行されることはない。また、スピンロックを取得して処理を実行しているＣＰＵまたはＣＰＵコアでは、他のタスクや割り込みは実行されない。
【０００６】
ここで、特許文献１には、共有リソースに対する排他制御を確実に実行しながら、排他制御によるマイクロコントローラの処理負荷を低減し、処理性能を効率的に利用できる電子制御装置が開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１６−０８１２０４
【発明の概要】
【発明が解決しようとする課題】
【０００８】
図１７は、あるソフトウェアに含まれるタスク１の実行中にデッドロックが発生する例について説明する図である。タスク１には、関数Ａ、Ｂが含まれる。関数Ａでは、スピンロックが取得された後、関数Ｂの呼び出しが行われる。関数Ｂの呼び出しが行われると、関数Ｂでは、スピンロックを取得する処理が実行される。このとき、関数Ａによってスピンロックは取得されているので、タスク１内で、同じスピンロックを多重に取得する処理が発生し、デッドロックによりソフトウェアの実行が停止する。このように、あるタスク内で発生するデッドロックを、自己デッドロックとも称する。
【０００９】
ソフトウェアの構造の変更により、関数のコールツリーが変わると、上述のように、同じスピンロックを多重に取得する処理の発生により、デッドロックが発生し、ソフトウェアの実行が停止するおそれがあるという課題がある。
【００１０】
特許文献１には、演算処理の実行順序を変更することにより排他制御に関わる処理時間を短くすることは開示されているが、不要な排他制御によるデッドロックの発生を防ぐ技術は開示されていない。
【００１１】
本発明は、上記課題を鑑みてなされたものであり、タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができる情報処理装置等を提供することを主要な目的とする。
【課題を解決するための手段】
【００１２】
本発明の一態様に係る情報処理装置は、タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する初期化手段と、前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する実行手段とを備える。
【００１３】
本発明の一態様に係る情報処理方法は、タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化し、前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する。
【００１４】
本発明の一態様に係る情報処理プログラムは、タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する処理と、前記タスクにおける前記資源を専有する処理の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記処理を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記処理を実行する処理とを、コンピュータに実行させる。
【発明の効果】
【００１５】
本発明によれば、タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができるという効果が得られる。
【図面の簡単な説明】
【００１６】
【図１】本発明の第１の実施形態に係る情報処理装置の構成を示すブロック図である。
【図２】本発明の第２の実施形態に係る情報処理装置の構成を模式的に示す図である。
【図３】本発明の第２の実施形態に係る情報処理装置の構成を機能単位に示す機能ブロック図である。
【図４】本発明の各実施形態に示す情報処理装置を実現するコンピュータ装置のハードウェア構成の一例を示す図である。
【図５】本発明の第２の実施形態に係る情報処理装置によるスピンロックの初期化処理を説明するフローチャートである。
【図６】本発明の第２の実施形態に係る情報処理装置により作成されたカウンタの例を示す図である。
【図７】本発明の第２の実施形態に係る情報処理装置によるスピンロック取得処理を説明するフローチャートである。
【図８】本発明の第２の実施形態に係る情報処理装置によるスピンロック解放処理を説明するフローチャートである。
【図９】本発明の第２の実施形態に係る情報処理装置において作成されるスピンロックとカウンタの構成を模式的に示す図である。
【図１０】タスクＴにおける処理の流れを説明する図である。
【図１１】関数Ａにおけるスピンロック取得処理の実行前と実行後の各コアの各カウンタの値を例示する図である。
【図１２】関数Ｂにおけるスピンロック取得処理の実行前と実行後の各コアの各カウンタの値を例示する図である。
【図１３】関数Ｂにおけるスピンロック解放処理の実行前と実行後の各コアの各カウンタの値を例示する図である。
【図１４】関数Ａにおけるスピンロック解放処理の実行前と実行後の各コアの各カウンタの値を例示する図である。
【図１５】関数Ａ、Ｂの処理について説明する図である。
【図１６】関数Ａ、Ｂの処理の実行について説明する図である。
【図１７】デッドロックが発生する例について説明する図である。
【発明を実施するための形態】
【００１７】
以下、本発明の実施形態について図面を参照して詳細に説明する。
【００１８】
第１の実施形態
図１は、本発明の第１の実施形態に係る情報処理装置１００の構成を示す図である。図１に示すように、情報処理装置１００は、初期化部１１０および実行部１２０を備える。
【００１９】
初期化部１１０は、タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、タスクを実行可能なプロセッサ（コア）にそれぞれ対応するカウンタを作成し、そのカウンタの値を初期化する。
【００２０】
実行部１２０は、タスクにおける資源を専有する処理の実行において、そのタスクの実行を割り当てられているプロセッサのカウンタの値が初期値である場合、ロック情報を取得すると共にプロセッサのカウンタの値をカウントアップして処理を実行し、プロセッサのカウンタの値が初期値でない場合、ロック情報を取得せずにプロセッサのカウンタの値をカウントアップして処理を実行する。
【００２１】
なお、初期化部１１０および実行部１２０は、それぞれ一例として、以降の実施形態において説明するスピンロック初期化部２２０およびタスク実行部２３０により実現される。
【００２２】
上記構成を採用することにより、本第１の実施形態によれば、タスク実行中にそのタスク内でロック情報を取得している場合は、多重にロック情報を取得することなく処理を実行できるので、タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができるという効果が得られる。
【００２３】
第２の実施形態
図２は、本発明の第２の実施形態に係る情報処理装置２００の構成を模式的に示す図である。図２に示すように、情報処理装置２００は、ＣＰＵ５０１を備える。ＣＰＵ５０１は、番号１乃至Ｎの複数のプロセッサ（以降、「コア」とも称する）が動作するマルチコア構成を有する。
【００２４】
ソフトウェア５２０は、ユーザ等により作成されたソフトウェアであるとする。ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）５３０は、情報処理装置２００の動作を制御する。ソフトウェア５２０およびＯＳ５３０は、例えば後述する情報処理装置２００の記憶装置等に格納されていてもよい。ソフトウェア５２０は、ＯＳ５３０上で、番号１乃至Ｎのコア（以降、「コア１乃至コアＮ」とも称する）を含むＣＰＵ５０１により実行される。
【００２５】
図３は、図２に示した情報処理装置２００の構成を機能単位に示す機能ブロック図である。図３に示すように、情報処理装置２００は、スピンロック初期化部２２０、タスク実行部２３０およびカウンタ記憶部２４０を備える。
【００２６】
タスク実行部２３０は、スピンロック取得部２３１、処理部２３２、スピンロック解放部２３３およびコア番号記憶部２３４を備える。タスク実行部２３０は、ソフトウェア５２０に含まれるプログラムの最小の実行単位であるタスクを実行する機能を有する。
【００２７】
図４は、本実施形態および他の実施形態に示す情報処理装置を実現するコンピュータ装置５００のハードウェア構成の一例を示す図である。情報処理装置の各構成要素は、例えば図４に示すようなコンピュータ装置５００とソフトウェアとの任意の組み合わせにより実現することができる。
【００２８】
図４に示すように、コンピュータ装置５００は、ＣＰＵ５０１、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）５０２、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）５０３、記憶装置５０５、ドライブ装置５０７、通信インタフェース５０８、入出力インタフェース５１０およびバス５１１を備える。
【００２９】
記憶装置５０５は、プログラム５０４を格納する。プログラム５０４には、図２に示した、作成されたソフトウェア５２０や、ＯＳ５３０等が含まれる。ドライブ装置５０７は、記録媒体５０６の読み書きを行う。通信インタフェース５０８は、ネットワーク５０９と接続する。入出力インタフェース５１０は、データの入出力を行う。バス５１１は、各構成要素を接続する。
【００３０】
ＣＰＵ５０１は、図２に示したように、マルチコア構成を有する。ＣＰＵ５０１は、ＲＡＭ５０３を用いてプログラム５０４を実行する。プログラム５０４は、ＲＯＭ５０２に記憶されていてもよい。また、プログラム５０４は、記録媒体５０６に記録され、ドライブ装置５０７によって読み出されてもよいし、外部装置からネットワーク５０９を介して送信されてもよい。通信インタフェース５０８は、ネットワーク５０９を介して外部装置とデータをやり取りする。入出力インタフェース５１０は、周辺機器（キーボード、マウス、表示装置など）とデータをやり取りする。通信インタフェース５０８および入出力インタフェース５１０は、データを取得または出力する手段として機能することができる。出力情報などのデータは、記憶装置５０５に記憶されていてもよいし、プログラム５０４に含まれていてもよい。
【００３１】
図２に示したソフトウェア５２０は、ＯＳ５３０上でＣＰＵ５０１により実行される際に、プログラムの最小の実行単位であるタスクを生成する。ソフトウェア５２０は、タスク生成時に、そのタスクで実行する関数と実行優先度を指定する。実行優先度は、例えば０以上の数字であり、数字が小さいほど優先度が高いように設定されてもよい。ＯＳ５３０は、作成されたタスクごとに、そのタスクを実行するコアを指定する。タスクは、ＯＳ５３０により指定されたコア１乃至コアＮのいずれかにより実行される。
【００３２】
図３に示したスピンロック初期化部２２０、およびタスク実行部２３０のスピンロック取得部２３１、処理部２３２およびスピンロック解放部２３３は、例えば、ソフトウェア５２０（プログラムコード）を、ＣＰＵ５０１のコア１乃至コアＮのいずれかが、情報処理装置２００のＲＡＭ５０３に読み出して実行することにより、実現される。また、図３に示したカウンタ記憶部２４０、およびコア番号記憶部２３４は、例えばＲＡＭ５０３により実現されてもよい。
【００３３】
タスク実行部２３０は、ＯＳ５３０上で、スピンロックにより排他制御を行いながらタスクを実行する。
【００３４】
スピンロックによる排他制御では、タスク実行部２３０によるタスクの実行中にアクセスされる資源を排他するためのロック情報が作成される。資源を排他するためのロック情報を作成することを、スピンロックを作成（または初期化）する、とも称する。スピンロック（ロック情報）を取得できたコアのみが、資源にアクセスできる。
【００３５】
図５は、情報処理装置２００におけるタスク実行部２３０のスピンロック初期化部２２０によるスピンロックの初期化処理を説明するフローチャートである。図５を参照して、スピンロック初期化部２２０によるスピンロックの初期化処理について説明する。なお、タスク実行中、ＯＳ５３０によりそのタスクの実行を割り当てられているコアの番号は、コア番号記憶部２３４に記憶されているとする。
【００３６】
スピンロック初期化部２２０は、タスクで資源にアクセスする前に、スピンロックを初期化する（ステップＳ１１０）。
【００３７】
続いて、スピンロック初期化部２２０は、動作中のＣＰＵのコアのそれぞれに対応するカウンタを作成し、それぞれを０で初期化して、カウンタ記憶部２４０に格納する（ステップＳ１２０）。カウンタは、０以上の整数を示す値を有する。図６は、スピンロック初期化部２２０により作成されたカウンタの例を示す図である。図６に示すように、例えば、スピンロック初期化部２２０は、ＲＡＭ５０３のアドレス１乃至Ｎに、それぞれコア１乃至Ｎの初期値０のカウンタを作成する。
【００３８】
図７は、タスク実行部２３０のスピンロック取得部２３１によるスピンロック取得処理を説明するフローチャートである。
【００３９】
タスク実行部２３０は、タスク実行中に、ある資源を専有する処理（処理Ｅと称する）を実行する際、スピンロック取得部２３１において、図７に示すスピンロック取得処理を実行する。
【００４０】
スピンロック取得部２３１は、自タスクが動作中のコアの番号をコア番号記憶部２３４から取得する（ステップＳ２１０）。スピンロック取得部２３１は、カウンタ記憶部２４０に記憶される、取得した番号のコアのカウンタ値を判定する。
【００４１】
スピンロック取得部２３１は、カウンタ値が「０」（初期値）の場合（ステップＳ２２０においてＹｅｓ）、スピンロックを取得する（ステップＳ２３０）。そして、スピンロック取得部２３１は、カウンタ記憶部２４０に記憶される、動作中のコアのカウンタ値に「１」を加算（カウントアップ）する（ステップＳ２４０）。
【００４２】
一方、スピンロック取得部２３１は、カウンタ値が「０」でない場合（ステップＳ２２０においてＮｏ）、スピンロックを取得せずに、カウンタ記憶部２４０に記憶される、動作中のコアのカウンタ値に「１」を加算する。
【００４３】
処理Ｓ２２０においてカウンタ値が「０」の場合、スピンロック取得部２３１がスピンロックを取得してカウンタ値に「１」を加算した後、処理部２３２は、処理Ｅを実行する。処理Ｓ２２０においてカウンタ値が０でない場合、すでに同じスピンロックが取得されているので、スピンロック取得部２３１はスピンロックの取得処理を行わずにカウンタ値に「１」を加算した後、処理部２３２は、処理Ｅを実行する。
【００４４】
図８は、タスク実行部２３０のスピンロック解放部２３３によるスピンロック解放処理を説明するフローチャートである。図８を参照して、スピンロック解放部２３３によるスピンロック解放処理を説明する。
【００４５】
処理部２３２による排他した資源へのアクセスが完了すると、スピンロック解放部２３３は、自タスクが動作中のコアの番号を、コア番号記憶部２３４から取得する（ステップＳ３１０）。
【００４６】
続いて、スピンロック解放部２３３は、取得した番号のコアのカウンタ値をカウンタ記憶部２４０から読み出し、判定する。カウンタ値が「０」の場合（ステップＳ３２０においてＹｅｓ）、スピンロック解放部２３３は、処理を終了する。これは、スピンロック未取得時に、スピンロック解放処理が実行された場合を考慮した処理である。
【００４７】
カウンタ値が「０」でない場合（ステップＳ３２０においてＮｏ）、スピンロック解放部２３３は、カウンタ記憶部２４０に記憶される、動作中のコアのカウンタ値から「１」を減算（カウントダウン）し（ステップＳ３３０）、再度、カウンタ値を判定する（ステップＳ３４０）。
【００４８】
カウンタ値が「０」である場合（ステップＳ３４０においてＹｅｓ）、スピンロック解放部２３３は、スピンロックを解放する（ステップＳ３５０）。一方、カウンタ値が「０」でない場合は、スピンロック解放部２３３は、スピンロックの解放を行わない。その後、タスク実行部２３０によりタスクの実行が継続される。
【００４９】
ここで、図９は、情報処理装置２００において作成されるスピンロックとカウンタの構成を、模式的に示す図である。必要なスピンロックの数がＭ個（Ｍは整数）の場合、Ｍ個のスピンロックが、ＯＳ５３０により作成される。図９では、例えば、スピンロック１、スピンロックＭは、それぞれ、資源１、資源２を排他するために作成されたスピンロックである。スピンロックが作成されるごとに、ソフトウェア５２０により、コア１乃至コアＮにそれぞれ対応するカウンタが作成される。
[具体例]
上述した動作を、具体例を用いて説明する。図１０は、タスクＴにおける処理の流れを説明する図である。図１０において矢印ｔで示す方向は、関数実行中の時間経過を示すとする。タスクＴは、関数Ａ、Ｂを含む。関数Ａ、Ｂは、ともにアクセスする資源の排他制御が必要な処理を含む。
【００５０】
関数Ａにおいて、スピンロックが取得された後、関数Ｂの呼び出しが行われる。関数Ｂが呼び出されると、関数Ｂにおいても、再度スピンロックの取得が行われる。このため、図１０の流れの場合、関数Ｂにおけるスピンロック取得時に自己デッドロックが発生する。しかし、関数Ｂにおけるスピンロック取得は、関数Ａでスピンロックを取得中に実行されるので、関数Ｂにおけるスピンロックの取得と解放は、不要な処理であると考えられる。
【００５１】
そこで、本実施形態では、上記のように不要と考えられるスピンロックの取得処理と解放処理を行わないように、以下に示すように、スピンロックの初期化、取得および解放の各処理を行うことを説明する。
【００５２】
ここでは、図１０に示すタスクＴが、コア１乃至コアＮのうち、コア１において実行される例について説明する。このとき、情報処理装置２００のコア番号記憶部２３４には、タスクＴの実行を割り当てられたコアの番号として「１」が記憶されているとする。
【００５３】
また、タスクＴの実行前に、図５に示したように、スピンロック初期化部２２０により、スピンロックの初期化と、コア１乃至コアＮの各カウンタの作成が行われているとする。図１１は、図１０に示す関数Ａにおけるスピンロック取得処理の実行前と実行後の、コア１乃至コアＮの各カウンタの値を例示する図である。関数Ａにおけるスピンロック取得処理の実行前は、コア１を含むすべてのコアのカウンタ値は「０」である。これらのカウンタが、情報処理装置２００のカウンタ記憶部２４０に記憶されているとする。
【００５４】
タスクＴにおける関数Ａの実行にあたり、スピンロック取得部２３１は、アクセスする資源を排他するため、図７に示すスピンロック取得処理を実行する。すなわち、処理Ｓ２１０に示すように、スピンロック取得部２３１は、タスクＴが動作中のコアの番号を取得する。ここでは、スピンロック取得部２３１は、「１」を取得する。
【００５５】
続いて、処理Ｓ２１０に示すように、スピンロック取得部２３１は、カウンタ記憶部２４０に記憶される、コア１のカウンタ値を判定すると、コア１のカウンタ値は「０」である。したがって、スピンロック取得部２３１は、処理Ｓ２３０に示すようにスピンロックを取得すると共に、コア１のカウンタ値に「１」を加算する。これにより、図１１に示すように、関数Ａのスピンロック取得処理実行後のコア１のカウンタ値は、「１」となる。
【００５６】
スピンロック取得後、図１０に示すように、関数Ａでは、関数Ｂの呼び出しが行われる。図１２は、関数Ｂにおけるスピンロック取得処理の実行前と実行後の、コア１乃至コアＮの各カウンタの値を例示する図である。図１２に示すように、関数Ｂのスピンロック取得処理の実行前のコア１のカウンタ値は「１」である。この状態で、関数Ｂが実行されると、スピンロック取得部２３１は、図７に示すスピンロック取得処理を実行する。
【００５７】
処理Ｓ２１０で取得されるコアの番号は「１」であり、このときのコア１のカウンタ値は、図１２に示すように「１」である。したがって、処理Ｓ２２０においてカウンタ値は０でないので、スピンロック取得部２３１は、スピンロックの取得は行わず、カウンタに「１」を加算する。これにより、コア１のカウンタ値は、「２」になる。このように、関数Ａにより取得されているスピンロックと同じスピンロックの取得処理を、関数Ｂでは行われないので、自己デッドロックは発生しない。
【００５８】
関数Ｂでは、スピンロックの取得は行わずに、処理Ｂが処理部２３２により実行される。処理Ｂにおいて、資源へのアクセスが完了すると、スピンロック解放部２３３は、図８に示すスピンロック解放処理を実行する。図１３は、図１０に示す関数Ｂにおけるスピンロック解放処理の実行前と実行後の、コア１乃至コアＮの各カウンタの値を例示する図である。図１３に示すように、関数Ｂのスピンロック解放処理の実行前のコア１のカウンタ値は「２」である。
【００５９】
処理Ｓ３１０で取得されるコアの番号は「１」であり、このときのコア１のカウンタ値は、図１３に示すように「２」である。したがって、処理Ｓ３２０においてカウンタ値は「０」でないので、スピンロック解放部２３３は、処理Ｓ３３０に示すように、動作中のコアのカウンタ値から「１」を減算する。これにより、コア１のカウンタ値は、「１」になる。
【００６０】
処理Ｓ３４０においても、コア１のカウンタ値は「０」ではないので、スピンロック解放部２３３は、スピンロックの解放を行わない。
【００６１】
続いて、図１０に示すタスクＴでは、関数Ａの実行に戻り、関数Ａにおける処理Ａが処理部２３２により実行される。その後、スピンロック解放部２３３は、スピンロック解放処理を実行する。
【００６２】
図１４は、図１０に示す関数Ａにおけるスピンロック解放処理の実行前と実行後の、コア１乃至コアＮの各カウンタの値を例示する図である。図１４に示すように、関数Ａのスピンロック解放処理の実行前のコア１のカウンタ値は「１」である。
【００６３】
処理Ｓ３１０で取得されるコアの番号は「１」であり、このときのコア１のカウンタ値は、図１４に示すように「１」である。したがって、処理Ｓ３２０においてカウンタ値は「０」でないので、スピンロック解放部２３３は、処理Ｓ３３０に示すように、動作中のコアのカウンタ値から「１」を減算する。これにより、コア１のカウンタ値は、「０」になる。よって、処理Ｓ３５０に示すように、スピンロック解放部２３３は、スピンロックを解放する。
【００６４】
これにより、排他される資源にアクセスする処理が完了し、引き続いて、関数Ａにおける処理が実行される。
【００６５】
以上のように、本第２の実施形態によれば、スピンロック初期化部２２０は、スピンロックの作成ごとに、各コアに対応するカウンタを作成してその値を初期化する。タスク実行部２３０は、タスク実行中に、資源を専有する処理を実行する際、そのタスクが動作中のコアのカウンタの値が「０」でない場合、スピンロックを取得せずにカウンタの値をカウントアップして、上記処理を実行する。
【００６６】
上記構成を採用することにより、本第２の実施形態によれば、カウンタの値が「０」でないとき、すなわち、タスクが動作しているコアで、すでにそのタスクにおいてスピンロックが取得されているときは、多重にスピンロックを取得することなく、処理を進める。これにより、タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができるという効果が得られる。
【００６７】
また、上記デッドロックを防ぐことができるので、ソフトウェアの変更等により関数のコールツリーが変更されたとしても、排他制御の有無の再確認や修正が不要となるという効果が得られる。
【００６８】
なお、スピンロックのカウンタをコアごとに用意しているので、異なるコアでスピンロックによる排他制御が必要な処理を実行する場合は、コアごとにスピンロックの取得が行われる。
【００６９】
上記各実施形態における情報処理装置の実現方法には様々な変形例がある。例えば、情報処理装置は、複数の装置の組み合わせにより実現することができる。
【００７０】
また、情報処理装置におけるスピンロック初期化部２２０、スピンロック取得部２３１、処理部２３２およびスピンロック解放部２３３は、上述したように、例えば、プログラム制御に従って処理を実行するＣＰＵ５０１によって実現されてもよい。
【００７１】
また、これらの機能を実現するように動作させるプログラムを記録媒体５０６に記録させ、その記録媒体５０６に記録されたプログラムをコードとして読み出し、コンピュータにおいて実行する処理方法も各実施形態の範疇に含まれる。すなわち、コンピュータ読取可能な記録媒体５０６も各実施形態の範囲に含まれる。また、上述のプログラムが記録された記録媒体５０６はもちろん、そのプログラム自体も各実施形態に含まれる。
【００７２】
以上、上述した実施形態を参照して本発明を説明した。しかしながら、本発明は、上述した実施形態には限定されない。即ち、本発明は、本発明のスコープ内において、種々の上記開示要素の多様な組み合わせ乃至選択など、当業者が理解し得る様々な態様を適用することができる。
【符号の説明】
【００７３】
１００、２００  情報処理装置
１１０  初期化部
１２０  実行部
２２０  スピンロック初期化部
２３０  タスク実行部
２３１  スピンロック取得部
２３２  処理部
２３３  スピンロック解放部
２３４  コア番号記憶部
２４０  カウンタ記憶部
５００  コンピュータ装置
５０４  プログラム
５０５  記憶装置
５０６  記録媒体
５０７  ドライブ装置
５０８  通信インタフェース
５０９  ネットワーク
５１０  入出力インタフェース
５１１  バス
【図１】
2019003415.tif 000003
【図２】
2019003415.tif 000004
【図３】
2019003415.tif 000005
【図４】
2019003415.tif 000006
【図５】
2019003415.tif 000007
【図６】
2019003415.tif 000008
【図７】
2019003415.tif 000009
【図８】
2019003415.tif 000010
【図９】
2019003415.tif 000011
【図１０】
2019003415.tif 000012
【図１１】
2019003415.tif 000013
【図１２】
2019003415.tif 000014
【図１３】
2019003415.tif 000015
【図１４】
2019003415.tif 000016
【図１５】
2019003415.tif 000017
【図１６】
2019003415.tif 000018
【図１７】
2019003415.tif 000019