(57)【要約】【課題】スピンロックを取得しに行った順番に公平にスピンロックを取得できるデータ処理装置を提供する。【解決手段】スピンロック変数の予約域をＦＩＦＯ構成とし、スピンロックを取得しにいった順番をそこに記憶することにより、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようにしたものである。予め決められたプロセッシングユニットの番号に基づいてラウンドロビン順にプロセッシングユニットにスピンロックが行き渡る構成とは異なる。【選択図】図１
2011129024.tif 000002
【特許請求の範囲】
【請求項１】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロックの取得を行なうデータ処理装置であって、
前記スピンロック変数領域はスピンロックへの待ち順の登録領域を有し、
前記プロセッシングユニットは、スピンロックの取得を失敗したとき失敗した順番で当該プロセッシングユニット名を前記待ち順の登録領域に登録し、登録されている自らの順番が最先の順位に更新されるのを待ってスピンロックを取得し、取得したスピンロックを解放するとき前記待ち順の登録領域に登録されている夫々の待ち順の順位を一つ最先方向にシフトする、データ処理装置。
【請求項２】
複数個のプロセッシングユニットと、前記複数個のプロセッシングユニットが共有するリソースと、前記複数個のプロセッシングユニットによって操作されるスピンロック変数領域とを有するデータ処理システムであって、
前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域を有し、
前記プロセッシングユニットは、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する、スピンロック処理と、前記スピンロック処理で取得したスピンロック状態を解放するときは待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げ、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する、アンロック処理と、を行なうデータ処理システム。
【請求項３】
前記スピンロック処理を行うプロセッシングユニットは、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録する処理を行なうとき、前記スピンロック変数領域に対するアクセス権を占有する、請求項２記載のデータ処理システム。
【請求項４】
プロセッシングユニットは前記スピンロック変数領域に対するアクセス権を占有して前記アンロック処理を行う、請求項３記載のデータ処理システム。
【請求項５】
プロセッシングユニットは、前記待ち順の登録領域に登録されたプロセッシングユニット名を一方向にシフトすることによって待ち順の繰り上げを行う、請求項２記載のデータ処理システム。
【請求項６】
前記スピンロック変数領域は、スピンロック状態を現在取得しているプロセッシングユニットを示すカレントユニット名保持領域を更に有し、
前記スピンロック処理は、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名をカレントユニット名保持領域に記録し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する処理であり、
前記アンロック処理は、前記スピンロック処理で取得したスピンロック状態を解放するときは待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げて最先のプロセッシングユニット名でカレントユニット名保持領域を書換え、待っているプロセッシングユニットがなければスピンロック変数領域を初期化してスピンロック状態を解放する処理である、請求項３記載のデータ処理システム。
【請求項７】
前記スピンロック変数領域は、前記待ち順の登録領域に登録されて待っているプロセッシングユニットの数を保持する待ち数保持領域をさらに有し、
前記プロセッシングユニットは、待ち数保持領域が保持する数によって、待ち順の登録領域に登録されて待っているプロセッシングユニットの有無を判別する、請求項５記載のデータ処理システム。
【請求項８】
前記待ち順の登録領域は前記複数個のプロセッシングユニットの数に相当する数のエントリ領域と、前記エントリ領域のアドレスを指す第１ポインタと、前記エントリ領域のアドレスを指す第２ポインタと、を有し、
前記スピンロック処理は、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名を第１ポインタが指すエントリ領域に格納し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは第２ポインタの値を進めて当該第２ポインタの値が指すエントリ領域に当該プロセッシングユニット名を登録して、それが前記第１ポインタで指されるのを待ってスピンロック状態を取得する処理であり、
前記アンロック処理は、前記スピンロック処理で取得したスピンロック状態を解放するときは第１ポインタの値が第２ポインタの値に等しくなければ第1ポインタの値を進め、待っているプロセッシングユニットがなければスピンロック変数領域を初期化してスピンロック状態を解放する処理である、請求項３記載のデータ処理システム。
【請求項９】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロックの取得を行なうデータ処理方法であって、
前記スピンロック変数領域はスピンロック変数の予約域である待ち順の登録領域を有し、
スピンロックの取得を失敗したとき失敗した順番にプロセッシングユニット名を前記待ち順の登録領域に登録し、最先に予約登録されているプロセッシングユニットに次のスピンロックを取得させる、データ処理方法。
【請求項１０】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なうデータ処理方法であって、
前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域を有し、
前記スピンロック処理は、前記プロセッシングユニットが前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する処理であり、
前記アンロック処理は、取得したスピンロック状態を解放するとき待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げ、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である、データ処理方法。
【請求項１１】
前記スピンロック処理において、前記プロセッシングユニットは前記スピンロック変数領域に対するアクセス権を占有して、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録する処理を行なう、請求項１０記載のデータ処理方法。
【請求項１２】
前記プロセッシングユニットは前記スピンロック変数領域に対するアクセス権を占有して前記アンロック処理を行う、請求項１１記載のデータ処理方法。
【請求項１３】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なうデータ処理方法であって、
前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域と、スピンロック状態を現在取得しているプロセッシングユニットを示すカレントユニット名保持領域と、を有し、
前記スピンロック処理は、前記プロセッシングユニットが前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名をカレントユニット名保持領域に記録し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する処理であり、
前記アンロック処理は、取得したスピンロック状態を解放するときは待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げて最先のプロセッシングユニット名でカレントユニット名保持領域を書換え、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である、データ処理方法。
【請求項１４】
リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なうデータ処理方法であって、
前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域を有し、
前記待ち順の登録領域は前記複数個のプロセッシングユニットの数に相当する数のエントリ領域と、前記エントリ領域のアドレスを指す第１ポインタと、前記エントリ領域のアドレスを指す第２ポインタと、を有し、
前記スピンロック処理は、前記プロセッシングユニットが前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名を第１ポインタが指すエントリ領域に格納し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは第２ポインタの値を進めて当該第２ポインタの値が指すエントリ領域に当該プロセッシングユニット名を登録して、それが前記第１ポインタで指されるのを待ってスピンロック状態を取得する処理であり、
前記アンロック処理は、取得したスピンロック状態を解放するときは第１ポインタの値が第２ポインタの値に等しくなければ第1ポインタの値を進め、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である、データ処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセッシングユニットが共有リソースに対して排他制御を行うスピンロック及びアンロックの技術に関し、例えばマルチプロセッサシステムがオンチップされた半導体データ処理装置に適用して有効な技術に関する。
【背景技術】
【０００２】
複数のプロセッシングユニットを備えたマルチプロセッサシステムでは、１つのリソースを複数プロセッシングユニットがアクセスする可能性があるときに、１つのプロセッシングユニットが他のプロセッシングユニットから排他的にリソースをアクセスできる権利を得てからアクセスする。このような排他的アクセス権はロック（lock）の取得により与えられる。ロックはメモリ上のロック変数に対するアトミックなリード・モディファイ・ライトに成功した唯一のプロセッシングユニットが取得する。アトミックなリード・モディファイ・ライトに失敗したプロセッシングユニットは、ロックが解放されてから自分がロックの取得を成功するまでループをスピンしながらロック変数にアトミックなリード・モディファイ・ライトをトライする。このようなロックの実装をスピンロックと言う。複数プロセッシングが同一のスピンロックを取得しようとした場合、特定のプロセッシングユニットだけがスピンロックを取得し、その他のプロセッシングユニットがスピンロックをいつまでも取得できない飢餓状態（starvation）という問題が発生する。即ち、バスアクセス権の取得に所定の優先順位がある場合を想定すると、バスアクセス権に関する優先順位の高いプロセッシングユニットが続けてスピンロックを取得しようとすると、それよりもバスアクセス権の優先順位の低い他のプロセッシングユニットはメモリ上のロック変数に対するアトミックなリード・モディファイ・ライトを行うためのバス権すら取得できず、自分よりバスアクセス権の高いプロセッシングユニットによるバスアクセスが要求さる限り、スピンロックを取得することができない。
【０００３】
その飢餓状態を緩和する技術として特許文献１に記載の技術がある。これによれば、スピンロック変数の予約域にスピンロックを待っているプロセッシングユニット（単にコアとも称する）のコア番号をビット位置にエンコードしスピンロック待ち状態を表わす。スピンロックが解放されている状態で偶然最初にスピンロックを取りに行ったコアは問題無くスピンロックを取得できる。一方、既に他のコアがスピンロックを取得済みで自コアが取得できなかった場合は、スピンロック変数の予約域の自コア番号のビット位置に１を立ててスピンロックの解放を待つ。スピンロックを取得済みの他コアがスピンロックを解放する時に、ロック変数の予約域のビット位置をラウンドロビン順に検索し、ビットが立っているコアにロックを取得させる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許第６７７９０９０号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に記載の技術は、ラウンドロビン順でコアがスピンロックを取得できるようにしていることを特徴としている。このため、当該先行技術においてスピンロックがコア間を渡る順番がスピンロックを取得しに行った順ではなく、予め決められた順番にスピンロックが渡る点が問題であり、真にスピンロックを必要とするプロセッシングコアが効率的にスピンロックを取得することができない。
【０００６】
本発明の目的は、スピンロックを取得しに行った順番に公平にスピンロックを取得できるデータ処理装置を提供することにある。
【０００７】
本発明の別の目的は、スピンロックを取得しに行った順番に公平にスピンロックを取得できるデータ処理方法を提供することにある。
【０００８】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００９】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１０】
すなわち、スピンロック変数の予約域をＦＩＦＯ構成とし、スピンロックを取得しにいった順番をそこに記憶することにより、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようにしたものである。予め決められたプロセッシングユニットの番号に基づいてラウンドロビン順にプロセッシングユニットにスピンロックが行き渡る構成とは異なる。
【発明の効果】
【００１１】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記のとおりである。
【００１２】
すなわち、複数プロセッシングユニットがスピンロックを取得しに行った順番に公平にスピンロックを取得することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は第1の実施の形態に用いるスピンロック変数領域ＬＯＣＫ＿ＦＬＤの詳細な一例を示す説明図である。
【図２】図２は共通リソースである周辺回路ＰＲＰＨをアクセスするために夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１が並列に実行するプログラムＱを例示する説明図である。
【図３】図３はスピンロック変数領域の初期化フローを例示するフローチャートである。
【図４】図４は第１の実施の形態において関数spinlockを実行したときのスピンロック処理の制御フローを例示するフローチャートである。
【図５】図５は第１の実施の形態において関数unlockを実行したときのアンロック処理の制御フローを例示するフローチャートである。
【図６】図６データ処理システムの概略的な構成を例示するブロック図である。
【図７】図７は第１の実施の形態においけるスピンロック処理とアンロック処理による動作を具体的に説明するための動作説明図である。
【図８】図８は図７の続きを示す動作説明図である。
【図９】図９は図８の続きを示す動作説明図である。
【図１０】図１０は図９の続きを示す動作説明図である。
【図１１】図１１は図１０の続きを示す動作説明図である。
【図１２】図１２は図１１の続きを示す動作説明図である。
【図１３】図１３は図１２の続きを示す動作説明図である。
【図１４】図１４は図１３の続きを示す動作説明図である。
【図１５】図１５は図１４の続きを示す動作説明図である。
【図１６】図１６は図１５の続きを示す動作説明図である。
【図１７】図１７は図１６の続きを示す動作説明図である。
【図１８】図１８は図１７の続きを示す動作説明図である。
【図１９】図１９には第２の実施の形態に用いられるスピンロック変数領域ＬＯＣＫ＿ＦＬＤＳの詳細な一例を示す説明図である。
【図２０】図２０は第２の実施の形態において関数spinlockを実行したときのスピンロック処理の制御フローを例示するフローチャートである。
【図２１】図２１は第２の実施の形態において関数unlockを実行したときのアンロック処理の制御フローを例示するフローチャートである。
【発明を実施するための形態】
【００１４】
１．実施の形態の概要
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１５】
〔１〕代表的な実施の形態に係るデータ処理システム（ＳＹＳ）は、リソース（ＰＲＰＨ）を共有する複数個のプロセッシングユニット（ＣＰＵ＿００〜ＣＰＵ＿１１）がスピンロック変数領域（ＬＯＣＫ＿ＦＬＤ、ＬＯＣＫ＿ＦＬＤＳ）を操作してスピンロックの取得を行ない、前記スピンロック変数領域はスピンロックへの待ち順の登録領域（ＢＵＦＦ、ＲＩＮＧ＿ＢＵＦＦ）を有し、前記プロセッシングユニットは、スピンロックの取得に失敗したとき失敗した順番で当該プロセッシングユニット名を前記待ち順の登録領域に登録し、登録されている自らの順番が最先の順位に更新されるのを待ってスピンロックを取得し、取得したスピンロックを解放するとき前記待ち順の登録領域に登録されている夫々の待ち順の順位を一つ最先方向にシフトする。
【００１６】
上記より、スピンロック変数の予約域である待ち順の登録領域がＦＩＦＯとして構成され、スピンロックを取得しにいった順番をそこに登録し、最先に予約登録されたプロセッシングユニットが次にスピンロックを取得することができるから、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようになる。予め決められたプロセッシングユニット番号に基づいてラウンドロビン順にプロセッシングユニットにスピンロックが行き渡るものではないから、複数プロセッシングユニットがスピンロックを取得しに行った順番に公平にスピンロックを取得することができる。
【００１７】
〔２〕更に具体的な実施の形態に係るデータ処理システム（ＳＹＳ）は、複数個のプロセッシングユニット（ＣＰＵ＿００〜ＣＰＵ＿１１）と、前記複数個のプロセッシングユニットが共有するリソース（ＰＲＰＨ）と、前記複数個のプロセッシングユニットによって操作されるスピンロック変数領域（ＬＯＣＫ＿ＦＬＤ、ＬＯＣＫ＿ＦＬＤＳ）とを有する。前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット（ＬＯＣＫ＿ＢＩＴ）、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域（ＢＵＦＦ、ＲＩＮＧ＿ＢＵＦＦ）を有する。前記プロセッシングユニットはリソースを使用するときスピンロック処理（spinlock）とアンロック処理（unlock）を行なう。スピンロック処理は、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する処理である。アンロック処理は、前記スピンロック処理で取得したスピンロック状態を解放するときは待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げ、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である。
【００１８】
上記より、スピンロック変数の予約域である待ち順の登録領域をＦＩＦＯとして構成し、スピンロックを取得しにいった順番をそこに登録し、最先に予約登録されたプロセッシングユニットが次にスピンロックを取得することができるから、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようになる。予め決められたプロセッシングユニット番号に基づいてラウンドロビン順にプロセッシングユニットにスピンロックが行き渡るものではないから、複数プロセッシングユニットがスピンロックを取得しに行った順番に公平にスピンロックを取得することができる。
【００１９】
〔３〕＜スピンロック処理におけるアトミックな処理＞
項２のデータ処理システムにおいて、プロセッシングユニットは、前記スピンロック処理において前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録する処理を行なうとき、前記スピンロック変数領域に対するアクセス権を占有する。スピンロックの処理を矛盾なく行うことができる。
【００２０】
〔４〕＜アンロック処理におけるアトミックな処理＞
項２のデータ処理システムにおいて、プロセッシングユニットは前記スピンロック変数領域に対するアクセス権を占有して前記アンロック処理を行う。アンロックの処理を矛盾なく行うことができる。
【００２１】
〔５〕＜シフトレジスタによるFIFO方式＞
項２のデータ処理システムにおいて、前記プロセッシングユニットは、前記待ち順の登録領域に登録されたプロセッシングユニット名を一方向にシフトすることによって待ち順の繰り上げを行う。
【００２２】
〔６〕項３のデータ処理システムにおいて、前記スピンロック変数領域は、スピンロック状態を現在取得しているプロセッシングユニットを示すカレントユニット名保持領域（ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤ）を更に有する。このとき、前記スピンロック処理は、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名をカレントユニット名保持領域に記録し（Ｓ１２）、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して（Ｓ１３）、それが最先に繰り上げられるのを待って（Ｓ１４、Ｓ１５）スピンロック状態を取得する処理である。前記アンロック処理は、前記スピンロック処理で取得したスピンロック状態を解放するときは待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げて最先のプロセッシングユニット名でカレントユニット名保持領域を書換え（Ｓ２３）、待っているプロセッシングユニットがなければスピンロック変数領域を初期化して（Ｓ２２）スピンロック状態を解放する処理である。
【００２３】
〔７〕項５のデータ処理システムにおいて、前記スピンロック変数領域は、前記待ち順の登録領域に登録されて待っているプロセッシングユニットの数を保持する待ち数保持領域（ＦＩＦＯ＿ＬＥＮＧＴＨ）をさらに有する。このとき、前記プロセッシングユニットは、待ち数保持領域が保持する数によって、待ち順の登録領域に登録されて待っているプロセッシングユニットの有無を判別する。
【００２４】
〔８〕＜リングバッファによるFIFO方式＞
項３のデータ処理システムにおいて、前記待ち順の登録領域は前記複数個のプロセッシングユニット（ＣＰ＿００〜ＣＰＵ＿１１）の数に相当する数のエントリ領域（ＲＩＮＧ＿ＢＵＦＦ）を有する。さらに、前記エントリ領域のアドレスを指す第１ポインタ（ＴＯＰ）と、前記エントリ領域のアドレスを指す第２ポインタ（ＢＯＴＴＯＭ）と、を有する。このとき、前記スピンロック処理は、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名を第１ポインタの初期値が指すエントリ領域に格納し（Ｓ３２）、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは第２ポインタの値を進めて当該第２ポインタの値が指すエントリ領域に当該プロセッシングユニット名を登録して（Ｓ３３）、それが前記第１ポインタで指されるのを待って（Ｓ３４、Ｓ３５）スピンロック状態を取得する処理である。前記アンロック処理は、前記スピンロック処理で取得したスピンロック状態を解放するときは第１ポインタの値が第２ポインタの値に等しくなければ第1ポインタの値を進め（Ｓ４３）、待っているプロセッシングユニットがなければスピンロック変数領域を初期化して（Ｓ４２）スピンロック状態を解放する処理である。
【００２５】
〔９〕代表的な実施の形態に係るデータ処理方法は、リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロックの取得を行なう方法であって、前記スピンロック変数領域に割当てられたスピンロック変数の予約域である待ち順の登録領域に、スピンロックの取得を失敗したとき失敗した順番にプロセッシングユニット名を登録し、最先に予約登録されているプロセッシングユニットに次のスピンロックを取得させる。
【００２６】
〔１０〕更に具体的な実施の形態に係るデータ処理方法は、リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なう方法であり、前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域を有する。前記スピンロック処理は、前記プロセッシングユニットが前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する処理である。前記アンロック処理は、取得したスピンロック状態を解放するとき待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げ、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である。
【００２７】
〔１１〕＜スピンロック処理におけるアトミックな処理＞
項１０のデータ処理方法において、前記スピンロック処理では、前記プロセッシングユニットは前記スピンロック変数領域に対するアクセス権を占有して、前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録する処理を行なう。
【００２８】
〔１２〕＜アンロック処理におけるアトミックな処理＞
項１１のデータ処理方法において、前記プロセッシングユニットは前記スピンロック変数領域に対するアクセス権を占有して前記アンロック処理を行う。
【００２９】
〔１３〕＜シフトレジスタによるFIFO方式＞
別の具体的な実施の形態に係るデータ処理方法は、リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なう方法であって、前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域と、スピンロック状態を現在取得しているプロセッシングユニットを示すカレントユニット名保持領域と、を有する。前記スピンロック処理は、前記プロセッシングユニットが前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名をカレントユニット名保持領域に記録し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは当該プロセッシングユニットを待ち順の登録領域に登録して、それが最先に繰り上げられるのを待ってスピンロック状態を取得する処理である。前記アンロック処理は、取得したスピンロック状態を解放するときは待ち順の登録領域に登録されて待っているプロセッシングユニットがあれば待ち順を一つ繰り上げて最先のプロセッシングユニット名でカレントユニット名保持領域を書換え、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である。
【００３０】
〔１４〕＜リングバッファによるFIFO方式＞
更に別の具体的な実施の形態に係るデータ処理方法は、リソースを共有する複数個のプロセッシングユニットがスピンロック変数領域を操作してスピンロック処理とアンロック処理とを行なう方法であって、前記スピンロック変数領域は、前記リソースの利用が可能か否かを示すためのロックビット、前記リソースの利用を待っているプロセッシングユニットの順番を保持するための待ち順の登録領域を有する。前記待ち順の登録領域は前記複数個のプロセッシングユニットの数に相当する数のエントリ領域と、前記エントリ領域のアドレスを指す第１ポインタと、前記エントリ領域のアドレスを指す第２ポインタと、を有する。前記スピンロック処理は、前記プロセッシングユニットが前記ロックビットをリードしてスピンロック状態が解放されていることを検出したときは前記ロックビットを操作してスピンロック状態を取得し且つ当該プロセッシングユニット名を第１ポインタが指すエントリ領域に格納し、前記ロックビットをリードして既にスピンロック状態が取得されていることを検知したときは第２ポインタの値を進めて当該第２ポインタの値が指すエントリ領域に当該プロセッシングユニット名を登録して、それが前記第１ポインタで指されるのを待ってスピンロック状態を取得する処理である。前記アンロック処理は、取得したスピンロック状態を解放するときは第１ポインタの値が第２ポインタの値に等しくなければ第1ポインタの値を進め、待っているプロセッシングユニットがなければロックビットを操作してスピンロック状態を解放する処理である。
【００３１】
２．実施の形態の詳細
《第1の実施の形態》
図６には第１の実施の形態に係るデータ処理システムが例示される。同図に示されるデータ処理システムは、特に制限されないが、シングルチップ又はマルチチップで構成されたマイクロコンピュータである。シングルチップで構成されたマイクロコンピュータは、特に制限されないが、単結晶シリコンのような１個の半導体基板に相補型ＭＯＳ集積回路製造技術などによって構成され、マルチチップで構成されたマイクロコンピュータは、特に制限されないが、多層配線基板等に複数個の半導体集積回路が搭載されて構成される。何れの構成においてもデータ処理システムＳＹＳはマルチプロセッサシステムを構成する。
【００３２】
データ処理システムＳＹＳは、特に制限されないが、複数個例えば４個のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１と、前記複数個のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１が共有するリソース（共有リソース）として代表的に示された周辺回路ＰＲＰＨと、複数個のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１によってアクセス可能なＲＡＭ（Random Access Memory）等のメモリＭＲＹとがバスＢＵＳに接続されて構成される。
【００３３】
夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１は、特に制限されないが、少なくとも、命令を実行する中央処理装置（Central Processing Unit）を有し、その他、必要に応じて、キャッシュメモリ及びメモリマネージメントユニットなどを備える、プロセッサコアとして構成される。このデータ処理システムにおいて、１つのリソースを複数プロセッシングユニットがアクセスする可能性があるときに、１つのプロセッシングユニットが他のプロセッシングユニットから排他的にリソースをアクセスできる権利を得てからアクセスすることが必要になる。このような排他的アクセス権の取得と解放の制御をスピンロックの取得と解放によって行うために、前記メモリＭＲＹにはプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１によって操作されるスピンロック変数領域ＬＯＣＫ＿ＦＬＤが割当てられる。ここに示すスピンロック変数領域ＬＯＣＫ＿ＦＬＤは例えば一つの周辺回路ＰＲＰＨに関するものを代表的に示している。スピンロック変数領域ＬＯＣＫ＿ＦＬＤは、特に制限されないが、実際はスピンロックを用いたアクセス制御の対象とされるリソース毎に割当てられるのが望ましい。
【００３４】
前記バスＢＵＳには図示を省略するバスアービタ若しくはバスルータが配置され、採用されているバスプロトコルに従って競合するバスアクセス要求を調停し、バス権の付与や信号経路のルーティングの制御などを行う。スピンロック変数領域ＬＯＣＫ＿ＦＬＤを用いたスピンロックの制御は共有リソースに対するアクセスの競合をアクセス要求主体が自律的に制御するものである。
【００３５】
図１にはスピンロック変数領域ＬＯＣＫ＿ＦＬＤの詳細な一例が示される。スピンロック変数領域ＬＯＣＫ＿ＦＬＤは、例えば全部で３２ビットの領域を有し、ビットＢ３１−２６にＦＩＦＯ（First In-First Out）バッファＢＵＦＦ（ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄ）、ビット２５−２４にカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤ、ビットＢ１７−１６に待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨ、及びビットＢ０にロックビットＬＯＣＫ＿ＢＩＴが割当てられる。
【００３６】
ＦＩＦＯバッファＢＵＦＦは３個のエントリ領域ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄを有し、エントリ領域ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄにはスピンロックの取得に失敗して待っているプロセッシングユニットのＩＤが待ち順位で登録される。ＦＩＦＯエントリ領域ＦＩＦＯ＿１ｓｔが第1優先順位、ＦＩＦＯエントリ領域ＦＩＦＯ＿２ｎｄが第２優先順位、ＦＩＦＯエントリ領域ＦＩＦＯ＿３ｒｄが第３優先順位のＩＤを保持する。ここでは、プロセッシングユニットＣＰＵ＿００のＩＤは“００”、ＣＰＵ＿０１のＩＤは“０１”、ＣＰＵ＿１０のＩＤは“１０”、ＣＰＵ＿１１のＩＤは“１１”とする。詳細は後で説明するが、ＦＩＦＯエントリ領域ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄに対するＦＩＦＯ動作は登録ＩＤの高順位側への右シフト動作によって行われる。
【００３７】
カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤは現在スピンロックを取得しているプロセッシングユニットのＩＤを示す。
【００３８】
待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨはスピンロックの取得に失敗して以降の取得を待っているプロセッシングユニットの数、即ち、ＦＩＦＯバッファＢＵＦＦが保持するプロセッシングＩＤの数を示す。ＦＩＦＯエントリ領域ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄが保持する“００”がＩＤ“００”であるのか単なる初期値“００”であるのかを区別する意義を有する。
【００３９】
ロックビットＬＯＣＫ＿ＢＩＴは “１”でスピンロックの取得状態を示し、“０”で当該ロックの解放状態を示す。
【００４０】
次に、スピンロック変数領域ＬＯＣＫ＿ＦＬＤを用いたスピンロックの制御手順について具体例を説明する。
【００４１】
図２には共通リソースである周辺回路ＰＲＰＨをアクセスするために夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１が並列に実行するプログラムＱが例示される。Line_1のLOOP_0はループ開始アドレスのラベルである。Line_2では関数spinlockを実行する。この関数spinlockの実行はスピンロックを取得するまで完了せず、取得すると完了する。スピンロックの取得とロックの解放は周辺回路ＰＲＰＨへの排他的アクセス権の取得と解放と同一視する。Line_3では関数printを実行し、例えば周辺回路ＰＲＰＨに自分のプロセッシングＩＤ等を出力してプリンタ等の機器を制御する。この操作は、完了するまで他の３つのプロセッシングユニットが同一アドレスへアトミックなリード・モディファイ・ライトを順番にできる程度に時間がかかるものとする。要するに、プリンタ等の機器を制御している間、一時的にバス権が解放されて、他のプロセッシングユニットがスピンロック変数領域ＬＯＣＫ＿ＦＬＤをアクセスして関数spinlockを実行できる状態が与えられるということである。Line_4では関数unlockを実行して、取得したロックを解放する。この後、Line_5でループ開始アドレスLOOP_0へ戻る。
【００４２】
図３にはスピンロック変数領域ＬＯＣＫ＿ＦＬＤの初期化フローが例示される。夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１が図２のプログラムの実行を開始する前に所定のプロセッシングユニットがスピンロック変数領域ＬＯＣＫ＿ＦＬＤを図６に例示されるように全ビット“０”に初期化する（Ｓ１）。
【００４３】
図４には関数spinlockを実行したときのスピンロック処理の制御フローが示される。バス権を獲得したプロセッシングユニットはスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードして初期値であるかを判別する。すなわち、ロックビットＬＯＣＫ＿ＢＩＴが“０”にされている（スピンロック状態が解放されている）か否かを判別する（Ｓ１１）。スピンロック状態が解放されていることを判別したときは自らのプロセッシングユニットＩＤ（自ＣＰＵ＿ＩＤ）をカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの領域に記録し且つ前記ロックビットＬＯＣＫ＿ＢＩＴを“１”に書換えて（Ｓ１２）、スピンロック状態を取得する。スピンロック状態が解放されていないとき（スピンロックの取得に失敗したとき）は、自らのプロセッシングユニットＩＤ（自ＣＰＵ＿ＩＤ）をＦＩＦＯバッファＢＵＦＦの末尾に登録すると共に、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨに１を加算して更新する（Ｓ１３）。ＦＩＦＯバッファＢＵＦＦの末尾は、エントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値に１を加算した値が示す順位のＦＩＦＯエントリ領域を選べばよい。例えばＦＩＦＯエントリ領域ＦＩＦＯ＿１ｓｔにＣＰＵ＿ＩＤが登録されていて待ちエントリ数が１個のときは、エントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値“１”に１を加算した値“２”が示す第２順位のＦＩＦＯエントリ領域ＦＩＦＯ＿２ｎｄに自ＣＰＵ＿ＩＤを格納すればよい。即ち、スピンロックの取得に失敗したとき、失敗した順番で当該プロセッシングユニットＩＤをＦＩＦＯバッファＢＵＦＦに登録することになる。その後、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの領域が保有するプロセッシングＩＤが自らのプロセッシングＩＤに（自ＣＰＵ＿ＩＤ）に更新されるのを待って（Ｓ１４、Ｓ１５）、要するに、ＦＩＦＯバッファＢＵＦＦに登録されている自らの順番が最先の順位に更新されるのを待ってスピンロックを取得することができる。尚、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの更新は、後述するアンロック処理の中で他のプロセッシングユニットが、取得したスピンロックを解放するときに行われる。
【００４４】
前記ステップＳ１１、Ｓ１２、Ｓ１３はアトミック処理とされ、当該プロセッシングユニットはステップＳ１１、Ｓ１２、Ｓ１３の処理を完了するまでの間、スピンロック変数領域ＬＯＣＫ＿ＦＬＤに対するアクセス権を他のプロセッシングユニットに渡さない。プロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１はそのようなリード・モディファイ・ライトによるアクセスをアトミック処理として実現するために用いることができるロード命令及びストア命令を命令セットに持つ。
【００４５】
図５には関数unlockを実行したときのアンロック処理の制御フローが示される。前記アンロック処理では、エントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値をリードし、その値が“０”か否かによってＦＩＦＯバッファＢＵＦＦに登録されて待っているプロセッシングユニットがあるか否かを判別し（Ｓ２１）、待っているものがなければスピンロック変数領域ＬＯＣＫ＿ＦＬＤを初期化して（Ｓ２２）、スピンロックを解放する。待っているプロセッシングユニットがあれば、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの領域が保有するプロセッシングＩＤを、エントリ領域ＦＩＦＯ＿１ｓｔに登録されているプロセッシングＩＤに更新し、エントリ領域ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄが保持する値をシフトして、待ち順を一つ繰り上げ、更に、エントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値を１減算して更新し、アンロック処理を終る（Ｓ２３）。ステップＳ２３の処理が何回か行われることによって、スピンロックの取得に失敗したプロセッシングユニットの待ち順の順位が順次先頭の方向に繰り上げられていく。
【００４６】
以上のように、夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１は、スピンロックの取得に失敗したとき失敗した順番で当該プロセッシングユニットのＩＤをＦＩＦＯバッファＢＵＦＦに登録し、登録されている自らの順番が最先の順位に更新されるのを待ってスピンロックを取得し、取得したスピンロックを解放するときＦＩＦＯバッファＢＵＦＦに登録されている夫々の待ち順の順位を一つ最先方向にシフトして、他のプロセッシングユニットによるスピンロック獲得の機会を提供する。したがって、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようになる。予め決められたプロセッシングユニット番号に基づいてラウンドロビン順にプロセッシングユニットにスピンロックが行き渡るものではないから、複数プロセッシングユニットがスピンロックを取得しに行った順番に公平にスピンロックを取得することができる。
【００４７】
図７乃至図１８を参照しながらプロセッシングユニットＣＰ＿００〜ＣＰＵ＿１１によるスピンロック処理とアンロック処理による動作を具体的に説明する。
【００４８】
スピンロック変数領域ＬＯＣＫ＿ＦＬＤは図６の状態に初期化され、夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１は図２のプログラムＱを並列に実行する。このとき、バスＢＵＳの実装は夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１に対して公平でない。バス固有の優先順があり、同一アドレスへのアトミックなリード・モディファイ・ライトが複数のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１の間で競合したときのバス権を獲得する優先順は、例えば、ＣＰＵ＿００、ＣＰＵ＿０１、ＣＰＵ＿１０、ＣＰＵ＿１１の順に高いものとする。この仮定で一般性は失われない。
【００４９】
この優先順に従いプロセッシングユニットＣＰＵ＿００がバス権を獲得して関数spinlockを実行し、スピンロック変数領域ＬＯＣＫ＿ＦＬＤに対し、図７の（ａ）、（ｂ）の経路でアトミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤは、図７に示されるように、ロックビットＬＯＣＫ＿ＢＩＴが“０”から“１”に書換えられ、プログラムＱのLine_2の関数spinlockの処理を完了する。次いで、プロセッシングユニットＣＰＵ＿００は周辺回路ＰＲＰＨへの排他的アクセス権を取得して、プログラムＱのLine_3の関数printを実行し、自らのプロセッシングＩＤ（自CPU_ID）を経路(c)で周辺回路ＰＲＰＨに出力する。
【００５０】
プロセッシングユニットＣＰＵ＿００がプログラムQのLine_3における関数printを実行するとき前述の如く時間が掛かり、その間に、他の３つのプロセッシングユニットＣＰＵ＿０１、ＣＰＵ＿１０、ＣＰＵ＿１１はプログラムの関数spinlockを実行している。プロセッシングユニットＣＰＵ＿０１、ＣＰＵ＿１０、ＣＰＵ＿１１のうち、優先順が最も高いＣＰＵ＿０１がバス権を取得するが、スピンロックの取得に失敗するので図４のステップＳ１３を実行して、図８の（ｄ）、（ｅ）の経路でアトミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図８の如く変更される。即ち、ＦＩＦＯバッファＢＵＦＦにおける第１番目のエントリ領域ＦＩＦＯ＿１ｓｔにプロセッシングユニットＣＰＵ＿０１のＩＤ“０１”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが０１（１個）になる。その後プロセッシングユニットＣＰＵ＿０１はスピンロック変数領域ＬＯＣＫ＿ＦＬＤを図８の経路（ｆ）で読むが、スピンロック変数領域ＬＯＣＫ＿ＦＬＤのカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤが“００”であり自ＣＰＵ＿ＩＤの“０１”と等しくないので、図４のステップＳ１４、Ｓ１５を通るループを回る（スピンする）。プロセッシングユニットＣＰＵ＿００はループを回ってカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤが自ＣＰＵ＿ＩＤの“０１”に等しくなるのを待っている。
【００５１】
プロセッシングユニットＣＰＵ＿１０、ＣＰＵ＿１１はプログラムＱの関数spinlockを実行中であり、そのうち、優先順の高いプロセッシングユニットＣＰＵ＿１０がアトミックなリード・モディファイ・ライトを実行するバス権を取得し、図４のステップＳ１３を実行し、図９の（ｇ）、（ｈ）の経路でアトミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図９に示されるように、第２番目のエントリ領域ＦＩＦＯ＿２ｎｄにプロセッシングユニットＣＰＵ＿１０のＩＤ“１０”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが１０（２個）になる。その後プロセッシングユニットＣＰＵ＿１０はスピンロック変数領域ＬＯＣＫ＿ＦＬＤを図９の経路（ｉ）で読むが、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤが“００”であり、自ＣＰＵ＿ＩＤの“１０”に等しくないので、図４のステップＳ１４、Ｓ１５のループを回る（スピンする）。プロセッシングユニットＣＰＵ＿１０はループを回ってカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤが自ＣＰＵ＿ＩＤの“１０”に等しくなるのを待っている。
【００５２】
最後に残ったプロセッシングユニットＣＰＵ＿１１はプログラムＱの関数spinlockを実行中であり、そのうち、アトミックなリード・モディファイ・ライトを実行するバス権を取得し、図４のステップＳ１３を実行し、図１０の（ｊ）、（ｋ）の経路でアトミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図１０に示されるように、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄにプロセッシングユニットＣＰＵ＿１１のＩＤ“１１”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが１１（３個）になる。その後プロセッシングユニットＣＰＵ＿１１はスピンロック変数領域ＬＯＣＫ＿ＦＬＤを図１０の経路（ｍ）で読むが、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤが“００”であり、自ＣＰＵ＿ＩＤの“１１”に等しくないので、図４のステップＳ１４、Ｓ１５のループを回る（スピンする）。プロセッシングユニットＣＰＵ＿１１はループを回ってカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤが自ＣＰＵ＿ＩＤの“１１”に等しくなるのを待っている。
【００５３】
プロセッシングユニットＣＰＵ＿００はプログラムQのLine_3の関数printの実行を完了すると、Line_4の関数unlockのアンロック処理を実行し、周辺回路ＰＲＰＨへの排他的アクセス権を解放、即ちスピンロックを解放する。プロセッシングユニットＣＰＵ＿００は関数unlockの処理において待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが“０”でないので図５のステップＳ２３を実行し、図１１の（ｎ）、（ｏ）の経路でアドミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図１１のように書換えられる。即ち、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤに第１番目のエントリ領域ＦＩＦＯ＿１ｓｔの値である“０１”が転送され、ＦＩＦＯバッファＢＵＦＦにおける待ち順を1つずつ繰り上げて、第２番目のエントリ領域ＦＩＦＯ＿２ｎｄの値“１０”が第１番目のエントリ領域ＦＩＦＯ＿１ｓｔにシフトされ、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄの値“１１”が第２番目のエントリ領域ＦＩＦＯ＿２ｎｄにシフトされ、最後に待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値“１１”から1を引いて“１０”にする。第３番目のエントリ領域ＦＩＦＯ＿３ｒｄは空きとされる。
【００５４】
このとき、プロセッシングユニットＣＰＵ＿０１はスピンロック処理で図４のループの処理（ステップＳ１４、Ｓ１５）を行っているが、図１１の処理により、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤがプロセッシングユニットＣＰＵ＿０１の自ＣＰＵ＿ＩＤである“０１”になったので、経路（ｆ）によるスピンロック変数領域ＬＯＣＫ＿ＦＬＤのリードによってそれを検出することにより、当該プロセッシングユニットＣＰＵ＿０１はスピンロック処理を完了してスピンロックを取得する。これによってプロセッシングユニットＣＰＵ＿０１は周辺回路ＰＲＰＨへの排他的アクセス権を取得し、プログラムQのLine_3の処理を開始して、図１２の経路（ｐ）で周辺回路ＰＲＰＨへ自ＣＰＵ＿ＩＤの出力などを行う。
【００５５】
プロセッシングユニットＣＰＵ＿１０は経路（ｉ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“０１”であり、自ＣＰＵ＿ＩＤの“１０”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。同じく、プロセッシングユニットＣＰＵ＿１１は経路（ｍ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“０１”であり、自ＣＰＵ＿ＩＤの“１１”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。
【００５６】
プロセッシングユニットＣＰＵ＿００は前ステップに引き続きプログラムＱのLine_5を実行し、Line_1のラベルLOOP_0へ戻り、Line_2の関数spinlockのスピンロック処理を実行する。スピンロック変数領域ＬＯＣＫ＿ＦＬＤは初期値0x0000でないから、図４のステップＳ１３の処理として、図１２の経路（ｑ）、（ｒ）でアドミックなリード・モディファイ・ライトを実行し、それによって、スピンロック変数領域ＬＯＣＫ＿ＦＬＤは図１２のように書換えられる。即ち、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄにに自ＣＰＵ＿ＩＤの“００”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨに１が加算されて“１１”にされる。その後、プロセッシングユニットＣＰＵ＿００は、ステップＳ１４、Ｓ１５のループを回る。
【００５７】
プロセッシングユニットＣＰＵ＿０１はプログラムQのLine_3の関数printの実行を完了すると、Line_4の関数unlockのアンロック処理を実行し、周辺回路ＰＲＰＨへの排他的アクセス権を解放、即ちスピンロックを解放する。プロセッシングユニットＣＰＵ＿０１は関数unlockの処理において待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが“０”でないので図５のステップＳ２３を実行し、図１３の（ｔ）、（ｕ）の経路でアドミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図１３のように書換えられる。即ち、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤに第１番目のエントリ領域ＦＩＦＯ＿１ｓｔの値である“１０”が転送され、ＦＩＦＯバッファＢＵＦＦにおける待ち順を1つずつ繰り上げて、第２番目のエントリ領域ＦＩＦＯ＿２ｎｄの値“１１”が第１番目のエントリ領域ＦＩＦＯ＿１ｓｔにシフトされ、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄの値“００”が第２番目のエントリ領域ＦＩＦＯ＿２ｎｄにシフトされ、最後に待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値“１１”から1を引いて“１０”にする。第３番目のエントリ領域ＦＩＦＯ＿３ｒｄは空きとされる。
【００５８】
このとき、プロセッシングユニットＣＰＵ＿１０はスピンロック処理で図４のループの処理（ステップＳ１４、Ｓ１５）を行っているが、図１３の処理により、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤがプロセッシングユニットＣＰＵ＿１０の自ＣＰＵ＿ＩＤである“１０”になったので、当該プロセッシングユニットＣＰＵ＿１０はスピンロック処理を完了してスピンロックを取得する。これによってプロセッシングユニットＣＰＵ＿１０は周辺回路ＰＲＰＨへの排他的アクセス権を取得し、プログラムQのLine_3の処理を開始して、図１４の経路（ｖ）で周辺回路ＰＲＰＨへ自ＣＰＵ＿ＩＤの出力などを行う。
【００５９】
プロセッシングユニットＣＰＵ＿１１は経路（ｍ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“１０”であり、自ＣＰＵ＿ＩＤの“１１”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。同じく、プロセッシングユニットＣＰＵ＿００は経路（ｓ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“１０”であり、自ＣＰＵ＿ＩＤの“００”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。
【００６０】
プロセッシングユニットＣＰＵ＿０１は前ステップに引き続きプログラムＱのLine_5を実行し、Line_1のラベルLOOP_0へ戻り、Line_2の関数spinlockのスピンロック処理を実行する。スピンロック変数領域ＬＯＣＫ＿ＦＬＤは初期値0x0000でないから、図４のステップＳ１３の処理として、図１４の経路（ｗ）、（ｘ）でアドミックなリード・モディファイ・ライトを実行し、それによって、スピンロック変数領域ＬＯＣＫ＿ＦＬＤは図１４のように書換えられる。即ち、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄに自ＣＰＵ＿ＩＤの“０１”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨに１が加算されて“１１”にされる。その後、プロセッシングユニットＣＰＵ＿０１は、ステップＳ１４、Ｓ１５のループを回る。
【００６１】
プロセッシングユニットＣＰＵ＿１０はプログラムQのLine_3の関数printの実行を完了すると、Line_4の関数unlockのアンロック処理を実行し、周辺回路ＰＲＰＨへの排他的アクセス権を解放、即ちスピンロックを解放する。プロセッシングユニットＣＰＵ＿１０は関数unlockの処理において待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが“０”でないので図５のステップＳ２３を実行し、図１５の（ｚ）、（ａａ）の経路でアドミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図１５のように書換えられる。即ち、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤに第１番目のエントリ領域ＦＩＦＯ＿１ｓｔの値である“１１”が転送され、ＦＩＦＯバッファＢＵＦＦにおける待ち順を1つずつ繰り上げて、第２番目のエントリ領域ＦＩＦＯ＿２ｎｄの値“００”が第１番目のエントリ領域ＦＩＦＯ＿１ｓｔにシフトされ、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄの値“０１”が第２番目のエントリ領域ＦＩＦＯ＿２ｎｄにシフトされ、最後に待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値“１１”から1を引いて“１０”にする。第３番目のエントリ領域ＦＩＦＯ＿３ｒｄは空きとされる。
【００６２】
このとき、プロセッシングユニットＣＰＵ＿１１はスピンロック処理で図４のループの処理（ステップＳ１４、Ｓ１５）を行っているが、図１５の処理により、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤがプロセッシングユニットＣＰＵ＿１１の自ＣＰＵ＿ＩＤである“１１”になったので、当該プロセッシングユニットＣＰＵ＿１１はスピンロック処理を完了してスピンロックを取得する。これによってプロセッシングユニットＣＰＵ＿１１は周辺回路ＰＲＰＨへの排他的アクセス権を取得し、プログラムQのLine_3の処理を開始して、図１６の経路（ａｂ）で周辺回路ＰＲＰＨへ自ＣＰＵ＿ＩＤの出力などを行う。
【００６３】
プロセッシングユニットＣＰＵ＿００は経路（ｓ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“１１”であり、自ＣＰＵ＿ＩＤの“００”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。同じく、プロセッシングユニットＣＰＵ＿０１は経路（ｙ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“１１”であり、自ＣＰＵ＿ＩＤの“０１”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。
【００６４】
プロセッシングユニットＣＰＵ＿１０は前ステップに引き続きプログラムＱのLine_5を実行し、Line_1のラベルLOOP_0へ戻り、Line_2の関数spinlockのスピンロック処理を実行する。スピンロック変数領域ＬＯＣＫ＿ＦＬＤは初期値0x0000でないから、図４のステップＳ１３の処理として、図１６の経路（ａｃ）、（ａｄ）でアドミックなリード・モディファイ・ライトを実行し、それによって、スピンロック変数領域ＬＯＣＫ＿ＦＬＤは図１６のように書換えられる。即ち、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄに自ＣＰＵ＿ＩＤの“１０”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨに１が加算されて“１１”にされる。その後、プロセッシングユニットＣＰＵ＿１０は、ステップＳ１４、Ｓ１５のループを回る。
【００６５】
プロセッシングユニットＣＰＵ＿１１はプログラムQのLine_3の関数printの実行を完了すると、Line_4の関数unlockのアンロック処理を実行し、周辺回路ＰＲＰＨへの排他的アクセス権を解放、即ちスピンロックを解放する。プロセッシングユニットＣＰＵ＿１１は関数unlockの処理において待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨが“０”でないので図５のステップＳ２３を実行し、図１７の（ａｆ）、（ａｇ）の経路でアドミックなリード・モディファイ・ライトを実行する。その結果、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの内容は図１７のように書換えられる。即ち、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤに第１番目のエントリ領域ＦＩＦＯ＿１ｓｔの値である“００”が転送され、ＦＩＦＯバッファＢＵＦＦにおける待ち順を1つずつ繰り上げて、第２番目のエントリ領域ＦＩＦＯ＿２ｎｄの値“０１”が第１番目のエントリ領域ＦＩＦＯ＿１ｓｔにシフトされ、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄの値“１０”が第２番目のエントリ領域ＦＩＦＯ＿２ｎｄにシフトされ、最後に待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨの値“１１”から1を引いて“１０”にする。第３番目のエントリ領域ＦＩＦＯ＿３ｒｄは空きとされる。
【００６６】
このとき、プロセッシングユニットＣＰＵ＿００はスピンロック処理で図４のループの処理（ステップＳ１４、Ｓ１５）を行っているが、図１７の処理により、カレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤがプロセッシングユニットＣＰＵ＿００の自ＣＰＵ＿ＩＤである“００”になったので、当該プロセッシングユニットＣＰＵ＿００はスピンロック処理を完了してスピンロックを取得する。これによってプロセッシングユニットＣＰＵ＿００は周辺回路ＰＲＰＨへの排他的アクセス権を取得し、プログラムQのLine_3の処理を開始して、図１８の経路（ａｈ）で周辺回路ＰＲＰＨへ自ＣＰＵ＿ＩＤの出力などを行う。
【００６７】
プロセッシングユニットＣＰＵ＿０１は経路（ｙ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“００”であり、自ＣＰＵ＿ＩＤの“０１”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。同じく、プロセッシングユニットＣＰＵ＿１０は経路（ａｅ）でスピンロック変数領域ＬＯＣＫ＿ＦＬＤをリードしているがカレントユニット番号ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤの値は“００”であり、自ＣＰＵ＿ＩＤの“１０”とは異なるので、その後も図４のループの処理（ステップＳ１４、Ｓ１５）を継続する。
【００６８】
プロセッシングユニットＣＰＵ＿１１は前ステップに引き続きプログラムＱのLine_5を実行し、Line_1のラベルLOOP_0へ戻り、Line_2の関数spinlockのスピンロック処理を実行する。スピンロック変数領域ＬＯＣＫ＿ＦＬＤは初期値0x0000でないから、図４のステップＳ１３の処理として、図１８の経路（ａｉ）、（ａｊ）でアドミックなリード・モディファイ・ライトを実行し、それによって、スピンロック変数領域ＬＯＣＫ＿ＦＬＤは図１８のように書換えられる。即ち、第３番目のエントリ領域ＦＩＦＯ＿３ｒｄに自ＣＰＵ＿ＩＤの“１１”が登録され、待ちエントリ数ＦＩＦＯ＿ＬＥＮＧＴＨに１が加算されて“１１”にされる。その後、プロセッシングユニットＣＰＵ＿１０は、ステップＳ１４、Ｓ１５のループを回る。
【００６９】
以下同様の処理が繰り返され、図７で説明したようにプロセッシングユニットＣＰＵ＿００が周辺回路ＰＲＰＨへの排他的アクセス権を取得し、図１２で説明したようにプロセッシングユニットＣＰＵ＿０１が周辺回路ＰＲＰＨへの排他的アクセス権を取得し、図１４で説明したようにプロセッシングユニットＣＰＵ＿１０が周辺回路ＰＲＰＨへの排他的アクセス権を取得し、図１６で説明したようにプロセッシングユニットＣＰＵ＿１１が周辺回路ＰＲＰＨへの排他的アクセス権を取得し、図１８で説明したようにプロセッシングユニットＣＰＵ＿００が周辺回路ＰＲＰＨへの排他的アクセス権を取得するというように、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようになる。飢餓状態(starvation)の問題は完全に解消され、予め決められたプロセッシングコア番号に基づいてラウンドロビン順にスピンロックが行き渡るものではないから、複数プロセッシングユニットがスピンロックを取得しに行った順番に公平にスピンロックを取得することができる。
【００７０】
《第２の実施の形態》
第２の実施の形態に係るデータ処理システムは、第１の実施の形態に係るデータ処理システムに対して、スピンロック変数領域ＬＯＣＫ＿ＦＬＤの構成と、これを用いたスピンロック処理及びアンロック処理の手順とが相違される。以下その相違点を中心に説明する。
【００７１】
図１９には第２の実施の形態に係るデータ処理システムに用いられるスピンロック変数領域ＬＯＣＫ＿ＦＬＤＳが例示される。スピンロック変数領域ＬＯＣＫ＿ＦＬＤＳは上記同様にメモリＭＲＹに形成され、例えば４個のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１によって操作される。
【００７２】
スピンロック変数領域ＬＯＣＫ＿ＦＬＤＳは、例えば全部で３２ビットの領域を有し、ビットＢ３１−２４にリングバッファＲＩＮＧ＿ＢＵＦＦ（ＲＩＮＧ＿ＢＵＦＦ［０］〜ＲＩＮＧ＿ＢＵＦＦ［３］）、ビット１７−１６にボトムカウンタＢＯＴＴＯＭ、ビットＢ９−８にトップカウンタＴＯＰ、及びビットＢ０にロックビットＬＯＣＫ＿ＢＩＴが割当てられる。
【００７３】
ロックビットＬＯＣＫ＿ＢＩＴは “１”でスピンロックの取得状態を示し、“０”で当該ロックの解放状態を示す。
【００７４】
リングバッファＲＩＮＧ＿ＢＵＦＦは、４個のＦＩＦＯステージＲＩＮＧ＿ＢＵＦＦ［０］〜ＲＩＮＧ＿ＢＵＦＦ［３］を有し、キューイングバッファとして利用される。トップカウンタＴＯＰとボトムカウンタＢＯＴＴＯＭはリングバッファＲＩＮＧ＿ＢＵＦＦをキューイングバッファとして機能させるためのＦＩＦＯステージのポインタである。特に制限されないが、トップカウンタＴＯＰ及びボトムカウンタＢＯＴＯＭの初期値は“０”であり、“０”から“３”の間をラップアラウンドされる。トップカウンタＴＯＰはリングバッファＲＩＮＧ＿ＢＵＦＦにおけるキューイングの先頭のＦＩＦＯステージ（実際にはその番号０〜３）を指し、ボトムカウンタＢＯＴＴＯＭはリングバッファＲＩＮＧ＿ＢＵＦＦにおけるキューイングの末尾のＦＩＦＯステージ（実際にはその番号０〜３）を指す。リングバッファＲＩＮＧ＿ＢＵＦＦのキューイング動作については後で詳細に説明するが、初期値は共に“０”であり、ロック解放状態で最初にスピンロックが取得されたときスピンロックを取得したプロセッシングユニットの自ＣＰＵ＿ＩＤを先頭のＦＩＦＯステージＲＩＮＧ＿ＢＵＦＦ［０］に格納し、その後に他のプロセッシングユニットがスピンロックの獲得に失敗したときは1インクリメントしたボトムカウンタＢＯＴＴＯＭの値が指すＦＩＦＯステージに当該他のプロセッシングユニットのＣＰＵ＿ＩＤを格納し、ロックを解放するときにリングバッファＲＩＮＧ＿ＢＵＦＦにスピンロックを待っているプロセッシングユニットがあれば（ＴＯＰとＢＯＴＴＯＭが等しくなければ）トップカウンタＴＯＰの値を1インクリメントし、ロックの獲得を待っているプロセッシングユニットはトップカウンタＴＯＰが指すＣＰＵ＿ＩＤが自らのＣＰＵ＿ＩＤに一致したことをもってスピンロックを獲得する。インクリメントの演算手法は、特に制限されないが、元のカウンタの値を４で除算したときの余りとする。即ち、TOP＝[（TOP+1）mod４]、BOTTOM＝[（BOTTOM+1）mod４]とされ、例えばTOP=0のとき次のTOPは１になり、TOP=１のとき次のTOPは２になり、TOP=２のとき次のTOPは３になり、TOP=３のとき次のTOPは０になる。
【００７５】
次に、スピンロック変数領域ＬＯＣＫ＿ＦＬＤＳを用いたスピンロックの制御手順について具体例を説明する。図２で説明したのと同様に、共通リソースである周辺回路ＰＲＰＨをアクセスするために夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１はプログラムＱを並列に実行する。スピンロック変数領域ＬＯＣＫ＿ＦＬＤＳの初期化フローは図３で説明したのと同様であり、全ビット“０”に初期化される。
【００７６】
図２０には関数spinlockを実行したときのスピンロック処理の制御フローが示される。バス権を獲得したプロセッシングユニットはスピンロック変数領域ＬＯＣＫ＿ＦＬＤＳをリードして初期値であるかを判別する。すなわち、ロックビットＬＯＣＫ＿ＢＩＴが“０”にされている（スピンロック状態が解放されている）か否かを判別する（Ｓ３１）。スピンロック状態が解放されていることを判別したときは自らのプロセッシングユニットＩＤ（自ＣＰＵ＿ＩＤ）を初段のＦＩＦＯステージＲＩＮＧ＿ＢＵＦＦ［０］に格納し、且つ、前記ロックビットＬＯＣＫ＿ＢＩＴを“１”に書換えて（Ｓ３２）、スピンロック状態を取得する。スピンロック状態が解放されていないとき（スピンロックの取得に失敗したとき）は、１インクリメントしたボトムカウンタＢＯＴＴＯＭの値が指すＦＩＦＯステージに自らのプロセッシングユニットＩＤ（自ＣＰＵ＿ＩＤ）を格納する（Ｓ３３）。このように、リングバッファＲＩＮＧ＿ＢＵＦＦには最初にスピンロックを獲得したＣＰＵ＿ＩＤを先頭に、その後、スピンロックの獲得に失敗した順にそのプロセッシングユニットＩＤがキューイングされることになる。その後、スピンロックの獲得に失敗したプロセッシングユニットはトップカウンタＴＯＰが指すＦＩＦＯステージのプロセッシングＩＤが自らのプロセッシングＩＤに一致されるのを待って（Ｓ３４、Ｓ３５）、要するに、リングバッファＲＩＮＧ＿ＢＵＦＦに登録されている自らの順番が最先の順位に更新されるのを待ってスピンロックを取得することができる。
【００７７】
前記ステップＳ３１、Ｓ３２、Ｓ３３はアトミック処理とされ、当該プロセッシングユニットはステップＳ３１、Ｓ３２、Ｓ３３の処理を完了するまでの間、スピンロック変数領域ＬＯＣＫ＿ＦＬＤＳに対するアクセス権を他のプロセッシングユニットに渡さない。プロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１はそのようなリード・モディファイ・ライトによるアクセスをアトミック処理として実現するために用いることができるロード命令及びストア命令を命令セットに持つ。
【００７８】
図２１には関数unlockを実行したときのアンロック処理の制御フローが示される。前記アンロック処理では、トップカウンタＴＯＰの値とボトムカウンタＢＯＴＴＯＭの値をリードし、両者の値が一致するか否かによってスピンロックの獲得を待っているプロセッシングユニットがあるか否かを判別し（Ｓ４１）、待っているものがなければスピンロック変数領域ＬＯＣＫ＿ＦＬＤＳを初期化して（Ｓ４２）、スピンロックを解放する。待っているプロセッシングユニットがあれば、トップカウンタＴＯＰの値を1インクリメントし、待ち順を一つ繰り上げ、アンロック処理を終る（Ｓ４３）。ステップＳ４３の処理が何回か行われることによって、スピンロックの取得に失敗したプロセッシングユニットの待ち順の順位の方向にトップカウンタＴＯＰの値が繰り上げられていく。ステップＳ３４で説明したように、スピンロックの獲得を待っているプロセッシングユニットはトップカウンタＴＯＰが指すＣＰＵ＿ＩＤが自らのＣＰＵ＿ＩＤに一致したことをもってスピンロックを獲得することができる。
【００７９】
以上のように、夫々のプロセッシングユニットＣＰＵ＿００〜ＣＰＵ＿１１は、スピンロックの取得に失敗したとき失敗した順番で当該プロセッシングユニットのＩＤをリングバッファＲＩＮＧ＿ＢＵＦＦにキューイングし、キューイングされている自らの順番がトップカウンタＴＯＰの更新（Ｓ４３）により最先の順位にされるのを待ってスピンロックを取得し、取得したスピンロックを解放するときリングバッファＲＩＮＧ＿ＢＵＦＦにキューイングされている夫々の待ち順の順位をトップカウンタＴＯＰの更新（Ｓ４３）により一つ最先方向にシフトして、他のプロセッシングユニットによるスピンロック獲得の機会を提供する。したがって、プロセッシングユニットがスピンロックを取得しに行った順番にスピンロックが渡るようになる。予め決められたプロセッシングユニット番号に基づいてラウンドロビン順にプロセッシングユニットにスピンロックが行き渡るものではないから、複数プロセッシングユニットがスピンロックを取得しに行った順番に公平にスピンロックを取得することができる。
【００８０】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【００８１】
例えば、図２０のステップ３１においてロックビットＬＯＣＫ＿ＢＩＴが解放状態であるかを判別し、図２０のステップＳ３２において自ＣＰＵ＿ＩＤの登録先をトップポインタＴＯＰの値に従って行い、図２１のステップ４３においてスピンロック変数領域に対する初期化対象をロックビットＬＯＣＫ＿ＢＩＴだけにしてもよい。また、プロセッシングユニットの数は４個に限定されず適宜の複数個であればよい。スピンロック変数領域のビット数及びロックビットなどのビット配置は適宜変更可能である。共有リソースの種類は何ら限定されず、メモリなどであってもよい。
【符号の説明】
【００８２】
ＳＹＳ  データ処理装置
ＣＰＵ＿００〜ＣＰＵ＿１１  プロセッシングユニット
ＰＲＰＨ  リソース（共有リソース）としての周辺回路
ＭＲＹ  メモリ
ＬＯＣＫ＿ＦＬＤ  スピンロック変数領域
ＢＵＦＦ  ＦＩＦＯバッファ
ＦＩＦＯ＿１ｓｔ〜ＦＩＦＯ＿３ｒｄ  エントリ領域
ＣＵＲＲＥＮＴ＿ＣＰＵ＿ＩＤ  カレントユニット番号
ＦＩＦＯ＿ＬＥＮＧＴＨ  待ちエントリ数
ＬＯＣＫ＿ＢＩＴ  ロックビット
ＬＯＣＫ＿ＦＬＤＳ  スピンロック変数領域
ＲＩＮＧ＿ＢＵＦＦ  リングバッファ
ＲＩＮＧ＿ＢＵＦＦ［０］〜ＲＩＮＧ＿ＢＵＦＦ［３］  ＦＩＦＯステージ
ＢＯＴＴＯＭ  ボトムカウンタ
ＴＯＰ  トップカウンタ
【図１】
2011129024.tif 000003
【図２】
2011129024.tif 000004
【図３】
2011129024.tif 000005
【図４】
2011129024.tif 000006
【図５】
2011129024.tif 000007
【図６】
2011129024.tif 000008
【図７】
2011129024.tif 000009
【図８】
2011129024.tif 000010
【図９】
2011129024.tif 000011
【図１０】
2011129024.tif 000012
【図１１】
2011129024.tif 000013
【図１２】
2011129024.tif 000014
【図１３】
2011129024.tif 000015
【図１４】
2011129024.tif 000016
【図１５】
2011129024.tif 000017
【図１６】
2011129024.tif 000018
【図１７】
2011129024.tif 000019
【図１８】
2011129024.tif 000020
【図１９】
2011129024.tif 000021
【図２０】
2011129024.tif 000022
【図２１】
2011129024.tif 000023