(57)【要約】【課題】真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができるデータ処理方法を提供する。【解決手段】スピンロックの要求はロック許可ビット（Ｐｉ）が許可を示すプロセッシングユニット（ＣＰＵ０〜ＣＰＵ３）の範囲で可能にされ、スピンロックの取得に失敗して取得を待つプロセッシングユニットは要求ビット（Ｒｊ）が要求にされている範囲で新たなスピンロックの取得を試みることができ、一旦スピンロックを取得したプロセッシングユニットは自らの許可ビットが非許可にされ、全ての要求ビットが非要求になったところでロック許可ビットを再度初期化するから、初期化によってスピンロックの取得が許可されたプロセッシングユニットは第１領域の初期化毎に重複することなくスピンロックの取得が可能になる。【選択図】図１
2011128933.tif 000002
【特許請求の範囲】
【請求項１】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロックの取得を行なうデータ処理装置であって、
前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットが設定される第１領域と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビットと、を有し、
前記プロセッシングユニットは、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件にスピンロックの取得を試みるスピンロック処理と、取得したスピンロックを解放するときは自ら以外のプロセッシングユニットのロック許可ビットが全て不許可であるか否かを判別し、全て不許可のときは前記第１領域を初期化し、全て不許可でないときは自らのロック許可ビットを不許可にするスピンアンロック処理とを行う、データ処理システム。
【請求項２】
前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である、請求項１記載のデータ処理システム。
【請求項３】
前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である、請求項２記載のデータ処理システム。
【請求項４】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロックの取得を行なうデータ処理装置であって、
前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットが設定される第１領域と、前記複数個のプロセッシングユニットのそれぞれがスピンロックの取得を要求したか否かを個別に示すロック要求ビットが設定される第２領域と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビットと、を有し、
前記プロセッシングユニットは、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件に自らのロック要求ビットを要求する値に操作してスピンロックの取得を試み、スピンロックを取得できたときは自らのロック要求ビットを非要求とする値に操作するスピンロック処理と、取得したスピンロックを解放するときは全てのロック要求ビットが非要求を示しているか否かを判別し、全て非要求のときは前記第１領域を初期化し、全て非要求でないときは自らのロック許可ビットを不許可にするスピンアンロック処理とを行う、データ処理システム。
【請求項５】
前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である、請求項４記載のデータ処理システム。
【請求項６】
前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である、請求項５記載のデータ処理システム。
【請求項７】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なうデータ処理方法であって、
前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットが設定される第１領域と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビットと、を有し、
前記スピンロック処理は、プロセッシングユニットが、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件にスピンロックの取得を試みる処理であり、
前記スピンアンロック処理は、取得したスピンロックを前記プロセッシングユニットが解放するとき自ら以外のプロセッシングユニットのロック許可ビットが全て不許可であるか否かを判別し、全て不許可のときは前記第１領域を初期化し、全て不許可でないときは自らのロック許可ビットを不許可にする処理であり、
前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である、データ処理方法。
【請求項８】
前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である、請求項７記載のデータ処理方法。
【請求項９】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なうデータ処理方法であって、
前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットが設定される第１領域と、前記複数個のプロセッシングユニットのそれぞれがスピンロックの取得を要求したか否かを個別に示すロック要求ビットが設定される第２領域と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビットと、を有し、
前記スピンロック処理は、前記プロセッシングユニットが、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件に自らのロック要求ビットを要求する値に操作してスピンロックの取得を試み、スピンロックを取得できたときは自らのロック要求ビットを非要求とする値に操作する処理であり、
前記スピンアンロック処理は、取得したスピンロックを前記プロセッシングユニットが解放するとき全てのロック要求ビットが非要求を示しているか否かを判別し、全て非要求のときは前記第１領域を初期化し、全て非要求でないときは自らのロック許可ビットを不許可にする処理であり、
前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である、データ処理システム。
【請求項１０】
前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である、請求項９記載のデータ処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセッシングユニットが共有リソースに対して排他制御を行うスピンロック及びアンロックの技術に関し、例えばマルチプロセッサシステムがオンチップされた半導体データ処理装置に適用して有効な技術に関する。
【背景技術】
【０００２】
複数のプロセッシングユニットを備えたマルチプロセッサシステムでは、１つのリソースを複数プロセッシングユニットがアクセスする可能性があるときに、１つのプロセッシングユニットが他のプロセッシングユニットから排他的にリソースをアクセスできる権利を得てからアクセスする。このような排他的アクセス権はロック（lock）の取得により与えられる。ロックはメモリ上のロック変数に対するアトミックなリード・モディファイ・ライトに成功した唯一のプロセッシングユニットが取得する。アトミックなリード・モディファイ・ライトに失敗したプロセッシングユニットは、ロックが解放されてから自分がロックの取得を成功するまでループをスピンしながらロック変数にアトミックなリード・モディファイ・ライトをトライする。このようなロックの実装をスピンロックと言う。複数プロセッシングが同一のスピンロックを取得しようとした場合、特定のプロセッシングユニットだけがスピンロックを取得し、その他のプロセッシングユニットがスピンロックをいつまでも取得できない飢餓状態（starvation）という問題が発生する。即ち、バスアクセス権の取得に所定の優先順位がある場合を想定すると、バスアクセス権に関する優先順位の高いプロセッシングユニットが続けてスピンロックを取得しようとすると、それよりもバスアクセス権の優先順位の低い他のプロセッシングユニットはメモリ上のロック変数に対するアトミックなリード・モディファイ・ライトを行うためのバス権すら取得できず、自分よりバスアクセス権の高いプロセッシングユニットによるバスアクセスが要求さる限り、スピンロックを取得することができない。
【０００３】
その飢餓状態を緩和する技術として特許文献１に記載の技術がある。これによれば、スピンロック変数の予約域にスピンロックを待っているプロセッシングユニット（単にコアとも称する）のコア番号をビット位置にエンコードしスピンロック待ち状態を表わす。スピンロックが解放されている状態で偶然最初にスピンロックを取りに行ったコアは問題無くスピンロックを取得できる。一方、既に他のコアがスピンロックを取得済みで自コアが取得できなかった場合は、スピンロック変数の予約域の自コア番号のビット位置に１を立ててスピンロックの解放を待つ。スピンロックを取得済みの他コアがスピンロックを解放する時に、ロック変数の予約域のビット位置をラウンドロビン順に検索し、ビットが立っているコアにロックを取得させる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許第６７７９０９０号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に記載の技術は、ラウンドロビン順でコアがスピンロックを取得できるようにしていることを特徴としている。このため、当該先行技術においてスピンロックがコア間を渡る順番がスピンロックを取得しに行った順とは無関係となり、予め決められた順番に固定される点が問題であり、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができない虞がある。
【０００６】
本発明の目的は、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができるデータ処理装置を提供することにある。
【０００７】
本発明の別の目的は、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができるデータ処理方法を提供することにある。
【０００８】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００９】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１０】
すなわち、夫々のプロセッシングユニットに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットを採用し、最初に所要のロック許可ビットを許可に初期設定し、許可に設定されたプロセッシングユニットの中でスピンロックを取得させ、スピンロックを取得したプロセッシングユニットがスピンロックを解放するときに自らの許可ビットを不許可とし、それが最後の場合には全ての許可ビットを再度初期化する手順を採用して、スピンロックの取得と開放の制御を行う。これにより、スピンロックの取得がプロセッシングユニット間を渡る順番は、スピンロックを取得しに行った順とは無関係な予め決められた順番に固定されることも、特定のプロセッシングユニットに独占されて所謂飢餓状態を生ずることもない。
【発明の効果】
【００１１】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記のとおりである。
【００１２】
すなわち、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は第１の実施の形態に係るデータ処理システムにおいてプロセッシングユニットＣＰＵ０〜ＣＰＵ３によるスピンロック処理とアンロック処理による動作を具体的に例示する説明図である。
【図２】図２はスピンロック変数領域ＬＯＣＫｍの詳細な一例を示す説明図である。
【図３】図３はスピンロック変数領域ＬＯＣＫｍの初期値を例示する説明図である。
【図４】図４は共通リソースであるリソースＲＳＲＣｍをアクセスするために夫々のプロセッシングユニットＣＰＵ０〜ＣＰＵｎが並列に実行するプログラムＱを例示する説明図である。
【図５】図５はスピンロック変数領域ＬＯＣＫｍの初期化フローを例示するフローチャートである。
【図６】図６は関数spinlockを実行したときのスピンロック処理の制御フローを例示するフローチャートである。
【図７】図７は関数spinunlockを実行したときのアンロック処理の制御フローを例示するフローチャートである。
【図８】図８は第１の実施の形態に係るデータ処理システムを例示するブロック図である。
【図９】図９は第２の実施の形態に係るデータ処理システムに用いられるスピンロック変数領域ＬＯＣＫｍ２を例示する説明図である。
【図１０】図１０はスピンロック変数領域ＬＯＣＫｍ２の初期値を例示する説明図である。
【図１１】図１１は関数spinlockを実行したときのスピンロック処理の制御フローを例示するフローチャートである。
【図１２】図１２は関数spinunlockを実行したときのアンロック処理の制御フローを例示するフローチャートである。
【発明を実施するための形態】
【００１４】
１．実施の形態の概要
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１５】
〔１〕《許可ビットによるスピンロックの制御》
代表的な実施の形態に係るデータ処理システム（ＳＹＳ）は、リソース（ＲＳＲＣ）を共有する複数個のプロセッシングユニット（ＣＰＵ０〜ＣＰＵｎ）がスピンロック変数領域（ＬＯＣＫｍ２）を操作してスピンロックの取得を行ない、前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビット（Ｐｉ）が設定される第１領域（ＰＦＬＤ）と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビット（Ｌ）と、を有する。前記プロセッシングユニットは、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件にスピンロックの取得を試みるスピンロック処理（図１１のspinlocl）と、取得したスピンロックを解放するときは自ら以外のプロセッシングユニットのロック許可ビットが全て不許可であるか否かを判別し、全て不許可のときは前記第１領域を初期化し、全て不許可でないときは自らのロック許可ビットを不許可にするスピンアンロック処理（図１２のspinunlock）とを行う。
【００１６】
上記より、スピンロックの取得はロック許可ビットが許可を示すプロセッシングユニットの範囲で可能にされ、一旦スピンロックを取得したプロセッシングユニットはその範囲から除外され、ロック許可ビットの初期化によって許可とされた全てのプロセッシングユニットが除外されたときにロック許可ビットを再度初期化するから、初期化によってスピンロックの取得が許可されたプロセッシングユニットは初期化毎に必ず１回、重複することなくスピンロックの取得が可能になる。ロック許可ビットが許可を示すプロセッシングユニットの範囲で何れがスピンロックを取得するかは、即ち、スピンロックの取得がプロセッシングユニット間を渡る順番は、スピンロックを取得しに行った順とは無関係な予め決められた順番に固定されることも、特定のプロセッシングユニットに独占されて所謂飢餓状態を生ずることもなく、スピンロックを取得しに行ったときの早遅によって決めることができる。したがって、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【００１７】
〔２〕項１のデータ処理システムにおいて、前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である。スピンロックの処理を矛盾なく行うことができる。
【００１８】
〔３〕項２のデータ処理システムにおいて、前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である。
【００１９】
項１の実施の形態では、第１領域の初期化によってスピンロックの取得が許可された全てのプロセッシングユニットにスピンロックの取得が一巡されるまで、第１領域は再度初期化されない。よって、１回の初期化に従って許可された全てのプロセッシングユニットにスピンロックの取得が一巡されるまで、同じプロセッシングユニットが再度スピンロックを取得することはできない。したがって、この実施の形態においては、真にスピンロックの取得が必要とされるプロセッシングユニットの許可ビットだけを許可にするように第１領域の初期化を行うことが望ましい。
【００２０】
〔４〕《許可ビット及び要求ビットによるスピンロックの制御》
別の実施の形態に係るデータ処理システム（ＳＹＳ）は、リソース（ＲＳＲＣ）を共有する複数個のプロセッシングユニット（ＣＰＵ０〜ＣＰＵｎ）がスピンロック変数領域（ＬＯＣＫｍ）を操作してスピンロックの取得を行ない、前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビット（Ｐｉ）が設定される第１領域（ＰＦＬＤ）と、前記複数個のプロセッシングユニットのそれぞれがスピンロックの取得を要求したか否かを個別に示すロック要求ビット（Ｒｊ）が設定される第２領域（ＲＦＬＤ）と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビット（Ｌ）と、を有する。前記プロセッシングユニットは、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件に自らのロック要求ビットを要求する値に操作してスピンロックの取得を試み、スピンロックを取得できたときは自らのロック要求ビットを非要求とする値に操作するスピンロック処理（図６のspinlock）と、取得したスピンロックを解放するときは全てのロック要求ビットが非要求を示しているか否かを判別し、全て非要求のときは前記第１領域を初期化し、全て非要求でないときは自らのロック許可ビットを不許可にするスピンアンロック処理（図７のspinunlock）とを行う。
【００２１】
上記より、スピンロックの要求はロック許可ビットが許可を示すプロセッシングユニットの範囲で可能にされ、スピンロックの取得に失敗して取得を待つプロセッシングユニットは要求ビットが要求にされている範囲で新たなスピンロックの取得を試みることができ、一旦スピンロックを取得したプロセッシングユニットは自らの許可ビットが非許可にされ、全ての要求ビットが非要求になったところでロック許可ビットを再度初期化するから、初期化によってスピンロックの取得が許可されたプロセッシングユニットは第１領域の初期化毎に重複することなくスピンロックの取得が可能になる。ロック許可ビットが許可を示すプロセッシングユニットの範囲で何れがスピンロックを取得するかは、即ち、スピンロックの取得がプロセッシングユニット間を渡る順番は、スピンロックの取得に失敗して取得を待つプロセッシングユニット（要求ビットが要求にされているプロセッシングユニット）の範囲でスピンロックを取得しに行ったときの早遅によって決めることができ、スピンロックを取得しに行った順とは無関係な予め決められた順番に固定されることも、特定のプロセッシングユニットに独占されて所謂飢餓状態を生ずることもない。したがって、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【００２２】
〔５〕項４のデータ処理システムにおいて、前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である。スピンロックの処理を矛盾なく行うことができる。
【００２３】
〔６〕項５のデータ処理システムにおいて、前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である。
【００２４】
項４の実施の形態では、第１領域の初期化によってスピンロックの取得が許可され且つスピンロックの取得に失敗して次の取得を待つ全てのプロセッシングユニットにスピンロックの取得が一巡されるまで、第１領域は再度初期化されない。よって、第１領域が初期化されてロック許可された全てのプロセッシングユニットにスピンロックの取得が一巡されなくても、第２領域でロックを要求するプロセッシングユニットがなくなれば、第１領域でロックが許可されているプロセッシングユニットが残っていても、第１領域の初期化が可能である。したがって、この実施の形態においては、許可ビットによるスピンロックの許可を項１の実施の形態ほど厳密に予め規定することを要しない。
【００２５】
〔７〕《許可ビットによるスピンロックの制御》
代表的な実施の形態に係るデータ処理方法は、リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なう方法であって、前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットが設定される第１領域と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビットと、を有する。前記スピンロック処理は、プロセッシングユニットが、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件にスピンロックの取得を試みる処理である。前記スピンアンロック処理は、取得したスピンロックを前記プロセッシングユニットが解放するとき自ら以外のプロセッシングユニットのロック許可ビットが全て不許可であるか否かを判別し、全て不許可のときは前記第１領域を初期化し、全て不許可でないときは自らのロック許可ビットを不許可にする処理である。前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である。
【００２６】
これによれば、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【００２７】
〔８〕項７のデータ処理方法において、前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である。
【００２８】
〔９〕《許可ビット及び要求ビットによるスピンロックの制御》
別の実施の形態に係るデータ処理方法は、リリソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なう方法であって、前記スピンロック変数領域は、前記複数個のプロセッシングユニットのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビットが設定される第１領域と、前記複数個のプロセッシングユニットのそれぞれがスピンロックの取得を要求したか否かを個別に示すロック要求ビットが設定される第２領域と、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示すためのロックビットと、を有する。前記スピンロック処理は、前記プロセッシングユニットが、初期化を経た前記第1領域における自らのロック許可ビットが許可を示していることを条件に自らのロック要求ビットを要求する値に操作してスピンロックの取得を試み、スピンロックを取得できたときは自らのロック要求ビットを非要求とする値に操作する処理である。前記スピンアンロック処理は、取得したスピンロックを前記プロセッシングユニットが解放するとき全てのロック要求ビットが非要求を示しているか否かを判別し、全て非要求のときは前記第１領域を初期化し、全て非要求でないときは自らのロック許可ビットを不許可にする処理である。前記第１領域の初期化は所要のロック許可ビットを許可に初期設定する処理である。
【００２９】
これによれば、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【００３０】
〔１０〕項９のデータ処理方法において、前記スピンロックの取得を試みる処理は、前記スピンロックの取得が許可されたプロセッシングユニットが前記ロックビットを参照してスピンロックが解放されていることを検出してからスピンロックが取得されている状態にロックビットを反転する操作を、スピンロック変数領域に対するアクセス権を占有して行なう処理である。
【００３１】
２．実施の形態の詳細
《第1の実施の形態；許可ビット及び要求ビットによるスピンロックの制御》
図８には第１の実施の形態に係るデータ処理システムが例示される。同図に示されるデータ処理システムは、特に制限されないが、シングルチップ又はマルチチップで構成されたマイクロコンピュータである。シングルチップで構成されたマイクロコンピュータは、特に制限されないが、単結晶シリコンのような１個の半導体基板に相補型ＭＯＳ集積回路製造技術などによって構成され、マルチチップで構成されたマイクロコンピュータは、特に制限されないが、多層配線基板等に複数個の半導体集積回路が搭載されて構成される。何れの構成においてもデータ処理システムＳＹＳはマルチプロセッサシステムを構成する。
【００３２】
データ処理システムＳＹＳは、特に制限されないが、複数個例えばｎ個のプロセッシングユニットＣＰＵ０〜ＣＰＵｎと、前記複数個のプロセッシングユニットＣＰＵ０〜ＣＰＵｎが共有するリソース（共有リソース）として代表的に示された一つのリソースＲＳＲＣｍと、複数個のプロセッシングユニットＣＰＵ０〜ＣＰＵｎによってアクセス可能なＲＡＭ（Random Access Memory）等のメモリＭＲＹとがバスＢＵＳに接続されて構成される。
【００３３】
夫々のプロセッシングユニットＣＰＵ０〜ＣＰＵｎは、特に制限されないが、少なくとも、命令を実行する中央処理装置（Central Processing Unit）を有し、その他、必要に応じて、キャッシュメモリ及びメモリマネージメントユニットなどを備える、プロセッサコアとして構成される。このデータ処理システムにおいて、１つのリソースを複数プロセッシングユニットがアクセスする可能性があるときに、１つのプロセッシングユニットが他のプロセッシングユニットから排他的にリソースをアクセスできる権利を得てからアクセスすることが必要になる。このような排他的アクセス権の取得と解放の制御をスピンロックの取得と解放によって行うために、前記メモリＭＲＹにはプロセッシングユニットＣＰＵ０〜ＣＰＵｎによって操作されるスピンロック変数領域ＬＯＣＫｍが割当てられる。ここに示すスピンロック変数領域ＬＯＣＫｍは例えば一つのリソースＲＳＲＣｍに関するものを代表的に示している。スピンロック変数領域は、特に制限されないが、実際はスピンロックを用いたアクセス制御の対象とされるリソース毎に割当てられるのが望ましい。
【００３４】
前記バスＢＵＳには図示を省略するバスアービタ若しくはバスルータが配置され、採用されているバスプロトコルに従って競合するバスアクセス要求を調停し、バス権の付与や信号経路のルーティングの制御などを行う。スピンロック変数領域ＬＯＣＫｍを用いたスピンロックの制御は共有リソースに対するアクセスの競合をアクセス要求主体が自律的に制御するものである。
【００３５】
図２にはスピンロック変数領域ＬＯＣＫｍの詳細な一例が示される。スピンロック変数領域ＬＯＣＫｍは、例えば全部で３２ビットの領域を有し、ビットＢ０−１４にロック許可領域（第１領域）ＰＦＬＤ、ビット１６−３０にロック要求領域（第２領域）ＲＦＬＤ、及びビットＢ３１にロックビットＬが割当てられる。ビットＢ１５は未使用とされる。
【００３６】
ロック許可領域ＰＦＬＤは、プロセッシングユニットＣＰＵ０〜ＣＰＵｎのそれぞれに対して個別的にスピンロックの取得を許可するか否かを示すロック許可ビット（単に許可ビットとも記す）Ｐｉ(例えばＰ０〜Ｐｎ)が設定される領域である。ロック許可ビットＰ０〜Ｐｎは順次プロセッシングユニットＣＰＵ０〜ＣＰＵｎに対応され、ロック許可ビットＰ０〜Ｐｎの各ビットは“１”で許可、“０”で非許可を示し、初期化処理毎に、所要のロック許可ビットが“１”にされる。ロック要求領域ＲＦＬＤは、プロセッシングユニットＣＰＵ０〜ＣＰＵｎのそれぞれがスピンロックの取得を要求したか否かを個別に示すロック要求ビット（単に要求ビットとも記す）Ｒｊ（例えばＲ０〜Ｒｎ）が設定される領域である。ロック要求ビットＲ０〜Ｒｎは順次プロセッシングユニットＣＰＵ０〜ＣＰＵｎに対応され、ロック要求ビットＲ０〜Ｒｎの各ビットは“１”で要求、“０”で非要求を示し、初期値は全ビット“０”である。ここでは、ｎ＝１４とする。
【００３７】
ロックビットＬは、前記スピンロックの取得が許可されたプロセッシングユニットの内のどれかがスピンロックを取得してリソースの利用が占有されているか否かを示す。ロックビットＬは“１”でスピンロックの取得状態を示し、“０”でロックの解放状態を示す。
【００３８】
次に、スピンロック変数領域ＬＯＣＫｍを用いたスピンロックの制御手順について具体例を説明する。
【００３９】
図４には共通リソースであるリソースＲＳＲＣｍをアクセスするために夫々のプロセッシングユニットＣＰＵ０〜ＣＰＵｎが並列に実行するプログラムＱが例示される。Line_1のLOOP_0はループ開始アドレスのラベルである。Line_2では関数spinlockを実行する。この関数spinlockの実行はスピンロックを取得するまで完了せず、取得すると完了する。スピンロックの取得とロックの解放はリソースＲＳＲＣへの排他的アクセス権の取得と解放と同一視する。Line_3では関数rsrcを実行し、例えばリソースＲＳＲＣに自分のプロセッシングＩＤ等を出力してプリンタ等の機器を制御する。この操作は、完了するまで他のプロセッシングユニットが同一アドレスへアトミックなリード・モディファイ・ライトを順番にできる程度に時間がかかるものとする。要するに、プリンタ等の機器を制御している間、一時的にバス権が解放されて、他のプロセッシングユニットがスピンロック変数領域ＬＯＣＫ＿ＦＬＤをアクセスして関数spinlockを実行できる状態が与えられるということである。Line_4では関数spinunlockを実行して、取得したロックを解放する。この後、Line_5でループ開始アドレスLOOP_0へ戻る。
【００４０】
図５にはスピンロック変数領域ＬＯＣＫｍの初期化フローが例示される。夫々のプロセッシングユニットＣＰＵ０〜ＣＰＵｎが図４のプログラムの実行を開始する前に所定のプロセッシングユニットがスピンロック変数領域ＬＯＣＫｍを図３に例示されるように初期化する（Ｓ１）。図３の初期化の例は、プロセッシングユニットをＣＰＵ０〜ＣＰＵ４の４個とし、全てのプロセッシングユニットをＣＰＵ０〜ＣＰＵ４にスピンロックの取得を許可するものとし、１６進数で“０ｘ０００００００Ｆ”がスピンロック変数領域ＬＯＣＫｍに初期設定される。以下の説明においてプロセッシングユニットを単位にコアとも称する。
【００４１】
図６には関数spinlockを実行したときのスピンロック処理の制御フローが示される。バス権を獲得したプロセッシングユニットはスピンロック変数領域ＬＯＣＫｍをリードしてロック許可領域ＰＦＬＤにおいて自コアのロック許可ビットの値が“１”、即ち許可を示しているかを判別する（Ｓ１１）。許可されている場合にはロック要求領域ＲＦＬＤの自コアのロック要求ビットを“１”として（Ｓ１２）、スピンロックの取得を試みる（Ｓ１３）。即ち、前記スピンロックの取得が許可されたコアが前記ロックビットＬを参照してスピンロックが解放されているか否かを判別し、解放されていれば（Ｌ＝０）、スピンロックが取得されている状態にロックビットＬを反転する操作（Ｌ←１）を行う。ロックビットに対するリード・モディファイ・ライトの一連の処理は、スピンロック変数領域に対するアクセス権を占有して行なわれるアトミック処理とされる。スピンロックが既に取得されていれば（Ｌ＝１）、バス権の獲得を再度行って、再びスピンロックの獲得を試みる。ステップＳ１３でスピンロックを取得したときは自コアのロック要求ビットを“０”にクリアする（Ｓ１４）。
【００４２】
図７には関数spinunlockを実行したときのアンロック処理の制御フローが示される。前記アンロック処理では、ロック要求領域ＲＦＬＤをリードし、その値が全て“０”か否か、即ち、スピンロックに失敗して待っているコアがあるか否かを判別し（Ｓ２１）、待っているコアがあれば、自コアのロック許可ビットを“０”とし（Ｓ２２）、待ているコアがなければロック許可領域ＰＦＬＤを初期化し（Ｓ２３）、最後にロックビットＬを値“０”に変更してスピンロックを解放する（Ｓ２４）。
【００４３】
図１を参照しながらプロセッシングユニットＣＰＵ０〜ＣＰＵ３によるスピンロック処理とアンロック処理による動作を具体的に説明する。
【００４４】
スピンロック変数領域ＬＯＣＫｍの初期値は図３と同じであり、ロックビットＬ＝０，要求ビットＲ３〜Ｒ０＝０，許可ビットＰ３〜Ｐ０＝１とされる。その他のビットは図示を省略するが全ビット“０”にされる。コアはＣＰＵ０，ＣＰＵ１，ＣＰＵ２，ＣＰＵ３の４個とする。スピンロック変数領域ＬＯＣＫｍの初期値に対してその状態が動作の進行に従ってＳＴ１〜ＳＴ１３に示される。Lock()はコアが関数spinlockを実行してスピンロック処理を開始することを意味し、unlock()はコアが関数spinunlockを実行してスピンアンロック処理を開始することを意味する。
【００４５】
状態ＳＴ１では３個のコアＣＰＵ０，ＣＰＵ１，ＣＰＵ２がスピンロック処理を開始し、自コアのロック要求ビット（Ｒ０，Ｒ１，Ｒ２）を“１”に書換える。
【００４６】
状態ＳＴ２では、コアＣＰＵ０，ＣＰＵ１，ＣＰＵ２のそれぞれがスピンロックの獲得を試みて、スピンロックを取り合い、例えばＣＰＵ２がスピンロックを取得し、要求ビットＲ２を“１”から“０”に、ロックビットＬを“０”から“１”に書換える。スピンロックを取得したコアＣＰＵ２はリソースＲＳＲＣを排他的に用いる。
【００４７】
状態ＳＴ３ではリソースＲＳＲＣを排他的に用いた処理を終ったコアＣＰＵ２が関数spinunlockを実行してスピンアンロック処理を開始する。ロックビットLが“０”にされてスピンロックが解放されると、今度はコアＣＰＵ０，ＣＰＵ１がスピンロックを取り合う。これによって状態ＳＴ４ではコア１がスピンロックを取得し、ロックビットＬが“１”に、ロック要求ビットＲ１が“０”にされる。スピンロックを取得したコア１はリソースＲＳＲＣを排他的に使用する。
【００４８】
このとき、状態５で新たにコアＣＰＵ３がロック要求処理を開始してロックを要求し、ロック許可ビットＰ３が“１”であるから、コアＣＰＵ３はロック要求ビットＲ３を“１”にする。
【００４９】
状態６ではスピンロックを獲得しているコアＣＰＵ１がアンロック処理を開始し、ロックビットＬを“０”に、ロック許可ビットＰ１を“０”にする。
【００５０】
状態ＳＴ７ではコアＣＰＵ０とコアＣＰＵ３がスピンロックを取り合い、例えばコアＣＰＵ３がロックを獲得し、ロックビットＬを“１”、ロック要求ビットＲ３を“０”にする。
【００５１】
状態ＳＴ８ではコアＣＰＵ２が再びスピンロックを要求し、ロック許可ビットＲ２が“０”なので、許可ビットＰ２の初期化、即ち、ロック許可領域ＰＦＬＤの初期化を待つ。
【００５２】
状態ＳＴ９でコアＣＰＵ３がスピンアンロック処理を行ない、ロックビットＬを“０”、許可ビットＰ３を“０”にする。
【００５３】
状態ＳＴ１０では、唯一スピンロックの獲得待ちを行っているコアＣＰＵ０がスピンロックを獲得し、コアＣＰＵ０がロックビットＬを“１”、ロック要求ビットＲ０を“０”にする。
【００５４】
状態ＳＴ１１においてコアＣＰＵ０がリソースＲＳＲＣに対する排他処理を終ってスピンアンロック処理を行なう。このとき、ロック要求ビットＲ０〜Ｒ３が全て“０”になっているので、ロック許可ビットＰ０〜Ｐ３を初期化する（Ｐ３〜Ｐ０＝１）と共に、ロックビットＬが“０にする。
【００５５】
状態ＳＴ１１でコアＣＰＵ１２のロック許可ビットＰ２が“１”にされたから、状態ＳＴ１２において、コアＣＰＵ２は図６のステップＳ１１における許可ビット初期化待ちスピンを抜けてロック要求ビットＲ２を“１”とし、他のコアはスピンロックを獲得しようとしてないので、コアＣＰＵ２がロック要求ビットＲ２を“１”に、スピンロックを獲得してロックビットＬを“１”にすると共に、ロック要求ビットＲ２を“０”に戻す。これによって、コアＣＰＵ２はリソースＲＳＲＣを排他的に利用する。
【００５６】
状態ＳＴ１３においてコアＣＰＵ２はスピンアンロック処理を開始し、スピンロックを要求しているコアがないので、Ｐ３〜Ｐ０を“１”にしてロック許可ビットを初期化し、ロックビットＬを“０”に戻す。
【００５７】
上記実施の形態１によれば、スピンロックの要求はロック許可ビットＰｉが許可を示すプロセッシングユニットの範囲で可能にされ、スピンロックの取得に失敗して取得を待つプロセッシングユニットは要求ビットＲｊが要求にされている範囲で新たなスピンロックの取得を試みることができ、一旦スピンロックを取得したプロセッシングユニットは自らの許可ビットが非許可にされ、全ての要求ビットが非要求になったところでロック許可ビットを再度初期化するから、初期化によってスピンロックの取得が許可されたプロセッシングユニットはスピンロック許可領域ＰＦＬＤの初期化毎に重複することなくスピンロックの取得が可能になる。ロック許可ビットが許可を示すプロセッシングユニットの範囲で何れがスピンロックを取得するかは、即ち、スピンロックの取得がプロセッシングユニット間を渡る順番は、スピンロックの取得に失敗して取得を待つプロセッシングユニット（要求ビットが要求にされているプロセッシングユニット）の範囲でスピンロックを取得しに行ったときの早遅によって決めることができ、スピンロックを取得しに行った順とは無関係な予め決められた順番に固定されることも、特定のプロセッシングユニットに独占されて所謂飢餓状態を生ずることもない。したがって、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【００５８】
《第２の実施の形態；許可ビットによるスピンロックの制御》
第２の実施の形態に係るデータ処理システムは、第１の実施の形態に係るデータ処理システムに対して、スピンロック変数領域ＬＯＣＫｍ２の構成と、これを用いたスピンロック処理及びアンロック処理の手順とが相違される。以下その相違点を中心に説明する。
【００５９】
図９には第２の実施の形態に係るデータ処理システムに用いられるスピンロック変数領域ＬＯＣＫｍ２が例示される。スピンロック変数領域ＬＯＣＫｍ２はロックビットＬとロック許可領域ＰＦＬＤを有し、ロック要求フィールドＲＦＬＤを備えていない。スピンロック変数領域ＬＯＣＫｍ２上記同様にメモリＭＲＹに形成され、プロセッシングユニットＣＰＵ０〜ＣＰＵｎによって操作される。
【００６０】
次に、スピンロック変数領域ＬＯＣＫｍ２を用いたスピンロックの制御手順について説明する。図４で説明したのと同様に、共通リソースＲＳＲＣをアクセスするために夫々のプロセッシングユニットＣＰＵ０〜ＣＰＵｎは図４のプログラムを並列に実行する。スピンロック変数領域ＬＯＣＫｍ２の初期化フローは図５で説明したのと同様であり、例えば図１０の例では、プロセッシングユニットをＣＰＵ０〜ＣＰＵ４の４個とし、全てのプロセッシングユニットをＣＰＵ０〜ＣＰＵ４にスピンロックの取得を許可するものとし、１６進数で“０ｘ０００００００Ｆ”がスピンロック変数領域ＬＯＣＫｍ２に初期設定される。
【００６１】
図１１には関数spinlockを実行したときのスピンロック処理の制御フローが示される。バス権を獲得したプロセッシングユニットはスピンロック変数領域ＬＯＣＫｍ２をリードしてロック許可領域ＰＦＬＤにおいて自コアのロック許可ビットの値が“１”、即ち許可を示しているかを判別する（Ｓ３１）。許可されている場合にはスピンロックの取得を試みる（Ｓ３２）。即ち、前記スピンロックの取得が許可されたコアが前記ロックビットＬを参照してスピンロックが解放されているか否かを判別し、解放されていれば（Ｌ＝０）、スピンロックが取得されている状態にロックビットＬを反転する操作（Ｌ←１）を行う。ロックビットに対するリード・モディファイ・ライトの一連の処理は、スピンロック変数領域に対するアクセス権を占有して行なわれるアトミック処理とされる。スピンロックが既に取得されていれば（Ｌ＝１）、バス権の獲得を再度行って、再びスピンロックの獲得を試みる。
【００６２】
図１２には関数spinunlockを実行したときのアンロック処理の制御フローが示される。前記アンロック処理では、ロック許可領域ＰＦＬＤをリードし、自コア以外のロック許可ビットの値が全て“０”か否か、即ち、スピンロックの取得が許可されている他のコアがあるか否かを判別し（Ｓ４１）、許可されている他のコアがあれば、自コアのロック許可ビットを“０”とし（Ｓ４２）、許可されている他のコアがなければロック許可領域ＰＦＬＤを初期化し（Ｓ４３）、最後にロックビットＬを値“０”に変更してスピンロックを解放する（Ｓ４４）。
【００６３】
実施の形態によれば、スピンロックの取得はロック許可ビットＰｉが許可を示すプロセッシングユニットの範囲で可能にされ、一旦スピンロックを取得したプロセッシングユニットはその範囲から除外され、ロック許可ビットの初期化によって許可とされた全てのプロセッシングユニットが除外されたときにロック許可ビットを再度初期化するから、初期化によってスピンロックの取得が許可されたプロセッシングユニットは初期化毎に必ず１回重複することなくスピンロックの取得が可能になる。ロック許可ビットが許可を示すプロセッシングユニットの範囲で何れがスピンロックを取得するかは、即ち、スピンロックの取得がプロセッシングユニット間を渡る順番は、スピンロックを取得しに行った順とは無関係な予め決められた順番に固定されることも、特定のプロセッシングユニットに独占されて所謂飢餓状態を生ずることもなく、スピンロックを取得しに行ったときの早遅によって決めることができる。したがって、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができる。
【００６４】
特に、スピンロック許可領域ＰＦＬＤの初期化によってスピンロックの取得が許可された全てのプロセッシングユニットにスピンロックの取得が一巡されるまで、スピンロック許可領域ＰＦＬＤは再度初期化されない。よって、１回の初期化に従って許可された全てのプロセッシングユニットにスピンロックの取得が一巡されるまで、同じプロセッシングユニットが再度スピンロックを取得することはできない。したがって、実施の形態２においては、真にスピンロックの取得が必要とされるプロセッシングユニットの許可ビットだけを許可にするようにスピンロック許可領域ＰＦＬＤの初期化を行うことが望ましい。
【００６５】
これに対し、第１の実施の形態では、スピンロック許可領域ＰＦＬＤの初期化によってスピンロックの取得が許可され且つスピンロックの取得に失敗して次の取得を待つ全てのプロセッシングユニットにスピンロックの取得が一巡されるまで、スピンロック許可領域ＰＦＬＤは再度初期化されない。よって、スピンロック許可領域ＰＦＬＤが初期化されてロック許可された全てのプロセッシングユニットにスピンロックの取得が一巡されなくても、ロック要求領域ＲＦＬＤでスピンロックを要求するプロセッシングユニットがなくなれば、スピンロック許可領域ＰＦＬＤでロックが許可されているプロセッシングユニットが残っていても、スピンロック許可領域ＰＦＬＤの初期化が可能である。したがって、前記第１の実施の形態においては、許可ビットによるスピンロックの許可を第２の実施の形態ほど厳密に予め規定することを要しない。
【００６６】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【００６７】
例えば、プロセッシングユニットの数は４個に限定されず適宜の複数個であればよい。スピンロック変数領域のビット数及びロックビットなどのビット配置は適宜変更可能である。共有リソースの種類は何ら限定されず、メモリなどであってもよい。
【符号の説明】
【００６８】
ＳＹＳ  データ処理装置
ＣＰＵ０〜ＣＰＵｎ  プロセッシングユニット
ＲＳＲＣ  リソース
ＭＲＹ  メモリ
ＬＯＣＫｍ、ＬＯＣＫｍ２  スピンロック変数領域
Ｌ  ロックビット
ＰＦＬＤ  スピンロック許可領域
Ｐ０〜Ｐ１４  ロック許可ビット
ＲＦＬＤ  スピンロック要求領域
Ｒ０〜Ｒ１４  ロック要求ビット
【図１】
2011128933.tif 000003
【図２】
2011128933.tif 000004
【図３】
2011128933.tif 000005
【図４】
2011128933.tif 000006
【図５】
2011128933.tif 000007
【図６】
2011128933.tif 000008
【図７】
2011128933.tif 000009
【図８】
2011128933.tif 000010
【図９】
2011128933.tif 000011
【図１０】
2011128933.tif 000012
【図１１】
2011128933.tif 000013
【図１２】
2011128933.tif 000014