(58)【調査した分野】(Int.Cl.,DB名)
タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する初期化手段と、
前記タスク内の、前記資源を専有する関数の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記関数を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記関数を実行する実行手段と
を備えた情報処理装置。
タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化し、
前記タスク内の、前記資源を専有する関数の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記関数を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記関数を実行する
情報処理方法。
タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、前記タスクを実行可能なプロセッサにそれぞれ対応するカウンタを作成し、当該カウンタの値を初期化する初期化処理と、
前記タスク内の、前記資源を専有する関数の実行において、当該タスクの実行を割り当てられている前記プロセッサのカウンタの値が初期値である場合、前記ロック情報を取得すると共に当該プロセッサのカウンタの値をカウントアップして前記関数を実行し、前記プロセッサのカウンタの値が初期値でない場合、前記ロック情報を取得せずに前記プロセッサのカウンタの値をカウントアップして前記関数を実行する実行処理とを、
コンピュータに実行させる情報処理プログラム。
【背景技術】
【0002】
ソフトウェアにおける最小の実行単位であるタスクと、そのタスクの実行中に発生する割り込みとの間の排他制御の方式として、一般に、スピンロック(Spinlock)が用いられる。スピンロックでは、1つの資源に対して1つのロック変数がメモリに用意される(スピンロック初期化)。そして、タスクを実行するCPU(Central Processing Unit)またはCPUコアのうち、ロック変数を取得(スピンロック取得)できたCPUまたはCPUコアのみが、資源にアクセス可能となる。
【0003】
CPUまたはCPUコアは、資源へのアクセスが完了した際にロック変数を解放する(スピンロック解放)。これにより、他のCPUまたはCPUコアが、資源にアクセス可能となる。CPUまたはCPUコアは、他のCPUまたはCPUコアが資源にアクセスしている場合、ロック変数を取得できるまでループしながらその資源が解放されるのを待ち続ける。なお、以降の説明では、ロック変数の取得または解放を、それぞれスピンロックの取得または解放とも表記する。
【0004】
図15は、関数A、Bの処理について説明する図である。
図15に示すように、関数A、Bにおいて、それぞれ処理A、Bは、排他が必要な処理であるため、その処理A、Bの前後に、それぞれスピンロックの取得と解放が行われる。
【0005】
図16は、関数A、Bの処理の実行について説明する図である。
図16において、矢印tで示す方向は、各関数の実行中の時間経過を示す。関数Aの実行中に関数Bが実行された場合、関数Bにおけるスピンロックの取得は、関数Aにおいて取得されたスピンロックが解放されるまでの間、ループしながら待機される。よって、同じスピンロックを取得する処理が、同時に複数実行されることはない。また、スピンロックを取得して処理を実行しているCPUまたはCPUコアでは、他のタスクや割り込みは実行されない。
【0006】
ここで、特許文献1には、共有リソースに対する排他制御を確実に実行しながら、排他制御によるマイクロコントローラの処理負荷を低減し、処理性能を効率的に利用できる電子制御装置が開示されている。
【発明を実施するための形態】
【0017】
以下、本発明の実施形態について図面を参照して詳細に説明する。
【0018】
第1の実施形態
図1は、本発明の第1の実施形態に係る情報処理装置100の構成を示す図である。
図1に示すように、情報処理装置100は、初期化部110および実行部120を備える。
【0019】
初期化部110は、タスクの実行中にアクセスする資源を排他するために作成されるロック情報ごとに、タスクを実行可能なプロセッサ(コア)にそれぞれ対応するカウンタを作成し、そのカウンタの値を初期化する。
【0020】
実行部120は、タスクにおける資源を専有する処理の実行において、そのタスクの実行を割り当てられているプロセッサのカウンタの値が初期値である場合、ロック情報を取得すると共にプロセッサのカウンタの値をカウントアップして処理を実行し、プロセッサのカウンタの値が初期値でない場合、ロック情報を取得せずにプロセッサのカウンタの値をカウントアップして処理を実行する。
【0021】
なお、初期化部110および実行部120は、それぞれ一例として、以降の実施形態において説明するスピンロック初期化部220およびタスク実行部230により実現される。
【0022】
上記構成を採用することにより、本第1の実施形態によれば、タスク実行中にそのタスク内でロック情報を取得している場合は、多重にロック情報を取得することなく処理を実行できるので、タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができるという効果が得られる。
【0023】
第2の実施形態
図2は、本発明の第2の実施形態に係る情報処理装置200の構成を模式的に示す図である。
図2に示すように、情報処理装置200は、CPU501を備える。CPU501は、番号1乃至Nの複数のプロセッサ(以降、「コア」とも称する)が動作するマルチコア構成を有する。
【0024】
ソフトウェア520は、ユーザ等により作成されたソフトウェアであるとする。OS(Operating System)530は、情報処理装置200の動作を制御する。ソフトウェア520およびOS530は、例えば後述する情報処理装置200の記憶装置等に格納されていてもよい。ソフトウェア520は、OS530上で、番号1乃至Nのコア(以降、「コア1乃至コアN」とも称する)を含むCPU501により実行される。
【0025】
図3は、
図2に示した情報処理装置200の構成を機能単位に示す機能ブロック図である。
図3に示すように、情報処理装置200は、スピンロック初期化部220、タスク実行部230およびカウンタ記憶部240を備える。
【0026】
タスク実行部230は、スピンロック取得部231、処理部232、スピンロック解放部233およびコア番号記憶部234を備える。タスク実行部230は、ソフトウェア520に含まれるプログラムの最小の実行単位であるタスクを実行する機能を有する。
【0027】
図4は、本実施形態および他の実施形態に示す情報処理装置を実現するコンピュータ装置500のハードウェア構成の一例を示す図である。情報処理装置の各構成要素は、例えば
図4に示すようなコンピュータ装置500とソフトウェアとの任意の組み合わせにより実現することができる。
【0028】
図4に示すように、コンピュータ装置500は、CPU501、ROM(Read Only Memory)502、RAM(Random Access Memory)503、記憶装置505、ドライブ装置507、通信インタフェース508、入出力インタフェース510およびバス511を備える。
【0029】
記憶装置505は、プログラム504を格納する。プログラム504には、
図2に示した、作成されたソフトウェア520や、OS530等が含まれる。ドライブ装置507は、記録媒体506の読み書きを行う。通信インタフェース508は、ネットワーク509と接続する。入出力インタフェース510は、データの入出力を行う。バス511は、各構成要素を接続する。
【0030】
CPU501は、
図2に示したように、マルチコア構成を有する。CPU501は、RAM503を用いてプログラム504を実行する。プログラム504は、ROM502に記憶されていてもよい。また、プログラム504は、記録媒体506に記録され、ドライブ装置507によって読み出されてもよいし、外部装置からネットワーク509を介して送信されてもよい。通信インタフェース508は、ネットワーク509を介して外部装置とデータをやり取りする。入出力インタフェース510は、周辺機器(キーボード、マウス、表示装置など)とデータをやり取りする。通信インタフェース508および入出力インタフェース510は、データを取得または出力する手段として機能することができる。出力情報などのデータは、記憶装置505に記憶されていてもよいし、プログラム504に含まれていてもよい。
【0031】
図2に示したソフトウェア520は、OS530上でCPU501により実行される際に、プログラムの最小の実行単位であるタスクを生成する。ソフトウェア520は、タスク生成時に、そのタスクで実行する関数と実行優先度を指定する。実行優先度は、例えば0以上の数字であり、数字が小さいほど優先度が高いように設定されてもよい。OS530は、作成されたタスクごとに、そのタスクを実行するコアを指定する。タスクは、OS530により指定されたコア1乃至コアNのいずれかにより実行される。
【0032】
図3に示したスピンロック初期化部220、およびタスク実行部230のスピンロック取得部231、処理部232およびスピンロック解放部233は、例えば、ソフトウェア520(プログラムコード)を、CPU501のコア1乃至コアNのいずれかが、情報処理装置200のRAM503に読み出して実行することにより、実現される。また、
図3に示したカウンタ記憶部240、およびコア番号記憶部234は、例えばRAM503により実現されてもよい。
【0033】
タスク実行部230は、OS530上で、スピンロックにより排他制御を行いながらタスクを実行する。
【0034】
スピンロックによる排他制御では、タスク実行部230によるタスクの実行中にアクセスされる資源を排他するためのロック情報が作成される。資源を排他するためのロック情報を作成することを、スピンロックを作成(または初期化)する、とも称する。スピンロック(ロック情報)を取得できたコアのみが、資源にアクセスできる。
【0035】
図5は、情報処理装置200におけるタスク実行部230のスピンロック初期化部220によるスピンロックの初期化処理を説明するフローチャートである。
図5を参照して、スピンロック初期化部220によるスピンロックの初期化処理について説明する。なお、タスク実行中、OS530によりそのタスクの実行を割り当てられているコアの番号は、コア番号記憶部234に記憶されているとする。
【0036】
スピンロック初期化部220は、タスクで資源にアクセスする前に、スピンロックを初期化する(ステップS110)。
【0037】
続いて、スピンロック初期化部220は、動作中のCPUのコアのそれぞれに対応するカウンタを作成し、それぞれを0で初期化して、カウンタ記憶部240に格納する(ステップS120)。カウンタは、0以上の整数を示す値を有する。
図6は、スピンロック初期化部220により作成されたカウンタの例を示す図である。
図6に示すように、例えば、スピンロック初期化部220は、RAM503のアドレス1乃至Nに、それぞれコア1乃至Nの初期値0のカウンタを作成する。
【0038】
図7は、タスク実行部230のスピンロック取得部231によるスピンロック取得処理を説明するフローチャートである。
【0039】
タスク実行部230は、タスク実行中に、ある資源を専有する処理(処理Eと称する)を実行する際、スピンロック取得部231において、
図7に示すスピンロック取得処理を実行する。
【0040】
スピンロック取得部231は、自タスクが動作中のコアの番号をコア番号記憶部234から取得する(ステップS210)。スピンロック取得部231は、カウンタ記憶部240に記憶される、取得した番号のコアのカウンタ値を判定する。
【0041】
スピンロック取得部231は、カウンタ値が「0」(初期値)の場合(ステップS220においてYes)、スピンロックを取得する(ステップS230)。そして、スピンロック取得部231は、カウンタ記憶部240に記憶される、動作中のコアのカウンタ値に「1」を加算(カウントアップ)する(ステップS240)。
【0042】
一方、スピンロック取得部231は、カウンタ値が「0」でない場合(ステップS220においてNo)、スピンロックを取得せずに、カウンタ記憶部240に記憶される、動作中のコアのカウンタ値に「1」を加算する。
【0043】
処理S220においてカウンタ値が「0」の場合、スピンロック取得部231がスピンロックを取得してカウンタ値に「1」を加算した後、処理部232は、処理Eを実行する。処理S220においてカウンタ値が0でない場合、すでに同じスピンロックが取得されているので、スピンロック取得部231はスピンロックの取得処理を行わずにカウンタ値に「1」を加算した後、処理部232は、処理Eを実行する。
【0044】
図8は、タスク実行部230のスピンロック解放部233によるスピンロック解放処理を説明するフローチャートである。
図8を参照して、スピンロック解放部233によるスピンロック解放処理を説明する。
【0045】
処理部232による排他した資源へのアクセスが完了すると、スピンロック解放部233は、自タスクが動作中のコアの番号を、コア番号記憶部234から取得する(ステップS310)。
【0046】
続いて、スピンロック解放部233は、取得した番号のコアのカウンタ値をカウンタ記憶部240から読み出し、判定する。カウンタ値が「0」の場合(ステップS320においてYes)、スピンロック解放部233は、処理を終了する。これは、スピンロック未取得時に、スピンロック解放処理が実行された場合を考慮した処理である。
【0047】
カウンタ値が「0」でない場合(ステップS320においてNo)、スピンロック解放部233は、カウンタ記憶部240に記憶される、動作中のコアのカウンタ値から「1」を減算(カウントダウン)し(ステップS330)、再度、カウンタ値を判定する(ステップS340)。
【0048】
カウンタ値が「0」である場合(ステップS340においてYes)、スピンロック解放部233は、スピンロックを解放する(ステップS350)。一方、カウンタ値が「0」でない場合は、スピンロック解放部233は、スピンロックの解放を行わない。その後、タスク実行部230によりタスクの実行が継続される。
【0049】
ここで、
図9は、情報処理装置200において作成されるスピンロックとカウンタの構成を、模式的に示す図である。必要なスピンロックの数がM個(Mは整数)の場合、M個のスピンロックが、OS530により作成される。
図9では、例えば、スピンロック1、スピンロックMは、それぞれ、資源1、資源2を排他するために作成されたスピンロックである。スピンロックが作成されるごとに、ソフトウェア520により、コア1乃至コアNにそれぞれ対応するカウンタが作成される。
[具体例]
上述した動作を、具体例を用いて説明する。
図10は、タスクTにおける処理の流れを説明する図である。
図10において矢印tで示す方向は、関数実行中の時間経過を示すとする。タスクTは、関数A、Bを含む。関数A、Bは、ともにアクセスする資源の排他制御が必要な処理を含む。
【0050】
関数Aにおいて、スピンロックが取得された後、関数Bの呼び出しが行われる。関数Bが呼び出されると、関数Bにおいても、再度スピンロックの取得が行われる。このため、
図10の流れの場合、関数Bにおけるスピンロック取得時に自己デッドロックが発生する。しかし、関数Bにおけるスピンロック取得は、関数Aでスピンロックを取得中に実行されるので、関数Bにおけるスピンロックの取得と解放は、不要な処理であると考えられる。
【0051】
そこで、本実施形態では、上記のように不要と考えられるスピンロックの取得処理と解放処理を行わないように、以下に示すように、スピンロックの初期化、取得および解放の各処理を行うことを説明する。
【0052】
ここでは、
図10に示すタスクTが、コア1乃至コアNのうち、コア1において実行される例について説明する。このとき、情報処理装置200のコア番号記憶部234には、タスクTの実行を割り当てられたコアの番号として「1」が記憶されているとする。
【0053】
また、タスクTの実行前に、
図5に示したように、スピンロック初期化部220により、スピンロックの初期化と、コア1乃至コアNの各カウンタの作成が行われているとする。
図11は、
図10に示す関数Aにおけるスピンロック取得処理の実行前と実行後の、コア1乃至コアNの各カウンタの値を例示する図である。関数Aにおけるスピンロック取得処理の実行前は、コア1を含むすべてのコアのカウンタ値は「0」である。これらのカウンタが、情報処理装置200のカウンタ記憶部240に記憶されているとする。
【0054】
タスクTにおける関数Aの実行にあたり、スピンロック取得部231は、アクセスする資源を排他するため、
図7に示すスピンロック取得処理を実行する。すなわち、処理S210に示すように、スピンロック取得部231は、タスクTが動作中のコアの番号を取得する。ここでは、スピンロック取得部231は、「1」を取得する。
【0055】
続いて、処理S210に示すように、スピンロック取得部231は、カウンタ記憶部240に記憶される、コア1のカウンタ値を判定すると、コア1のカウンタ値は「0」である。したがって、スピンロック取得部231は、処理S230に示すようにスピンロックを取得すると共に、コア1のカウンタ値に「1」を加算する。これにより、
図11に示すように、関数Aのスピンロック取得処理実行後のコア1のカウンタ値は、「1」となる。
【0056】
スピンロック取得後、
図10に示すように、関数Aでは、関数Bの呼び出しが行われる。
図12は、関数Bにおけるスピンロック取得処理の実行前と実行後の、コア1乃至コアNの各カウンタの値を例示する図である。
図12に示すように、関数Bのスピンロック取得処理の実行前のコア1のカウンタ値は「1」である。この状態で、関数Bが実行されると、スピンロック取得部231は、
図7に示すスピンロック取得処理を実行する。
【0057】
処理S210で取得されるコアの番号は「1」であり、このときのコア1のカウンタ値は、
図12に示すように「1」である。したがって、処理S220においてカウンタ値は0でないので、スピンロック取得部231は、スピンロックの取得は行わず、カウンタに「1」を加算する。これにより、コア1のカウンタ値は、「2」になる。このように、関数Aにより取得されているスピンロックと同じスピンロックの取得処理を、関数Bでは行われないので、自己デッドロックは発生しない。
【0058】
関数Bでは、スピンロックの取得は行わずに、処理Bが処理部232により実行される。処理Bにおいて、資源へのアクセスが完了すると、スピンロック解放部233は、
図8に示すスピンロック解放処理を実行する。
図13は、
図10に示す関数Bにおけるスピンロック解放処理の実行前と実行後の、コア1乃至コアNの各カウンタの値を例示する図である。
図13に示すように、関数Bのスピンロック解放処理の実行前のコア1のカウンタ値は「2」である。
【0059】
処理S310で取得されるコアの番号は「1」であり、このときのコア1のカウンタ値は、
図13に示すように「2」である。したがって、処理S320においてカウンタ値は「0」でないので、スピンロック解放部233は、処理S330に示すように、動作中のコアのカウンタ値から「1」を減算する。これにより、コア1のカウンタ値は、「1」になる。
【0060】
処理S340においても、コア1のカウンタ値は「0」ではないので、スピンロック解放部233は、スピンロックの解放を行わない。
【0061】
続いて、
図10に示すタスクTでは、関数Aの実行に戻り、関数Aにおける処理Aが処理部232により実行される。その後、スピンロック解放部233は、スピンロック解放処理を実行する。
【0062】
図14は、
図10に示す関数Aにおけるスピンロック解放処理の実行前と実行後の、コア1乃至コアNの各カウンタの値を例示する図である。
図14に示すように、関数Aのスピンロック解放処理の実行前のコア1のカウンタ値は「1」である。
【0063】
処理S310で取得されるコアの番号は「1」であり、このときのコア1のカウンタ値は、
図14に示すように「1」である。したがって、処理S320においてカウンタ値は「0」でないので、スピンロック解放部233は、処理S330に示すように、動作中のコアのカウンタ値から「1」を減算する。これにより、コア1のカウンタ値は、「0」になる。よって、処理S350に示すように、スピンロック解放部233は、スピンロックを解放する。
【0064】
これにより、排他される資源にアクセスする処理が完了し、引き続いて、関数Aにおける処理が実行される。
【0065】
以上のように、本第2の実施形態によれば、スピンロック初期化部220は、スピンロックの作成ごとに、各コアに対応するカウンタを作成してその値を初期化する。タスク実行部230は、タスク実行中に、資源を専有する処理を実行する際、そのタスクが動作中のコアのカウンタの値が「0」でない場合、スピンロックを取得せずにカウンタの値をカウントアップして、上記処理を実行する。
【0066】
上記構成を採用することにより、本第2の実施形態によれば、カウンタの値が「0」でないとき、すなわち、タスクが動作しているコアで、すでにそのタスクにおいてスピンロックが取得されているときは、多重にスピンロックを取得することなく、処理を進める。これにより、タスク実行中の不要な排他制御によるデッドロックの発生を防ぐことができるという効果が得られる。
【0067】
また、上記デッドロックを防ぐことができるので、ソフトウェアの変更等により関数のコールツリーが変更されたとしても、排他制御の有無の再確認や修正が不要となるという効果が得られる。
【0068】
なお、スピンロックのカウンタをコアごとに用意しているので、異なるコアでスピンロックによる排他制御が必要な処理を実行する場合は、コアごとにスピンロックの取得が行われる。
【0069】
上記各実施形態における情報処理装置の実現方法には様々な変形例がある。例えば、情報処理装置は、複数の装置の組み合わせにより実現することができる。
【0070】
また、情報処理装置におけるスピンロック初期化部220、スピンロック取得部231、処理部232およびスピンロック解放部233は、上述したように、例えば、プログラム制御に従って処理を実行するCPU501によって実現されてもよい。
【0071】
また、これらの機能を実現するように動作させるプログラムを記録媒体506に記録させ、その記録媒体506に記録されたプログラムをコードとして読み出し、コンピュータにおいて実行する処理方法も各実施形態の範疇に含まれる。すなわち、コンピュータ読取可能な記録媒体506も各実施形態の範囲に含まれる。また、上述のプログラムが記録された記録媒体506はもちろん、そのプログラム自体も各実施形態に含まれる。
【0072】
以上、上述した実施形態を参照して本発明を説明した。しかしながら、本発明は、上述した実施形態には限定されない。即ち、本発明は、本発明のスコープ内において、種々の上記開示要素の多様な組み合わせ乃至選択など、当業者が理解し得る様々な態様を適用することができる。