(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-09-08
(45)【発行日】2023-09-19
(54)【発明の名称】同期制御システムおよび同期制御方法
(51)【国際特許分類】
G06F 9/52 20060101AFI20230911BHJP
G06F 9/48 20060101ALI20230911BHJP
【FI】
G06F9/52 120Z
G06F9/48 300Z
(21)【出願番号】P 2022062393
(22)【出願日】2022-04-04
(62)【分割の表示】P 2019183481の分割
【原出願日】2019-10-04
【審査請求日】2022-04-04
(73)【特許権者】
【識別番号】501100881
【氏名又は名称】イーソル株式会社
(74)【代理人】
【識別番号】100157912
【氏名又は名称】中島 健
(74)【代理人】
【識別番号】100074918
【氏名又は名称】瀬川 幹夫
(72)【発明者】
【氏名】ローラン・ドゥデマイン
(72)【発明者】
【氏名】権藤 正樹
(72)【発明者】
【氏名】坂本 裕和
(72)【発明者】
【氏名】浦上 敦
(72)【発明者】
【氏名】松尾 篤
【審査官】三坂 敏夫
(56)【参考文献】
【文献】国際公開第2013/175858(WO,A1)
【文献】特開平07-160645(JP,A)
【文献】特開2011-232956(JP,A)
【文献】特開2013-168103(JP,A)
【文献】特開2015-164052(JP,A)
【文献】特開平11-085546(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/455-9/54
(57)【特許請求の範囲】
【請求項1】
複数のプロセッサコアを搭載したコンピュータ上で実行され、前記複数のプロセッサコアごとにスレッドのスケジューリングを行うマイクロカーネルを配置した同期制御システムであって、
異なるプロセッサコアまたは同一のプロセッサコアに割り当てられたスレッド間での同期処理を実行するための共有資源であり、割り当てられた前記プロセッサコアにかかわらずすべてのスレッドがアクセス可能なロックオブジェクトを備え、
前記ロックオブジェクトは、前記複数のプロセッサコアごとに1つずつの、次に起床されるべきスレッド
を特定可能な識別子を含むスレッド情報を格納可能であり、
任意のスレッドが前記ロックオブジェクトを解放するときに、当該ロックオブジェクトに格納されたスレッド情報から所定の待ち解除ポリシーに従って起床するスレッドを決定した後に、前記任意のスレッドを管理するマイクロカーネルから前記起床するスレッドを管理するマイクロカーネルへ待ち解除のメッセージを直接送信する、同期制御システム。
【請求項2】
前記ロックオブジェクトは、前記複数のプロセッサコア数分の配列であるスレッド情報格納配列を含み、
前記スレッド情報格納配列に、前記スレッド情報を格納する、請求項1記載の同期制御システム。
【請求項3】
前記スレッド情報格納配列の各要素のサイズは、CPUが不可分操作可能な最大ビット数を超えないように設定されている、請求項2記載の同期制御システム。
【請求項4】
スレッドを制御するためにスレッドごとに生成されるスレッド制御ブロックを備え、
前記ロックオブジェクトにより待ち状態となったスレッドに係る前記スレッド制御ブロックには、同じロックオブジェクトにより待ち状態となったスレッド群を管理するための待ち管理キューが登録される、請求項1~3のいずれか1項に記載の同期制御システム。
【請求項5】
前記メッセージは、オペレーティングが備えるメッセージング機能を使用して送信される、請求項1~4のいずれか1項に記載の同期制御システム。
【請求項6】
前記ロックオブジェクトは、同期を必要とするイベントごとに動的に生成可能である、請求項1~5のいずれか1項に記載の同期制御システム。
【請求項7】
複数のプロセッサコアを搭載したコンピュータ上で、前記複数のプロセッサコアごとにスレッドのスケジューリングを行うマイクロカーネルを配置して実行される同期制御方法であって、
異なるプロセッサコアまたは同一のプロセッサコアに割り当てられたスレッド間での同期処理を実行するための共有資源であり、割り当てられた前記プロセッサコアにかかわらずすべてのスレッドがアクセス可能なロックオブジェクトを生成するステップと、
前記ロックオブジェクトによりスレッドが待ち状態となったときに、前記ロックオブジェクトに当該スレッド
を特定可能な識別子を含むスレッド情報を登録するステップと、
任意のスレッドが前記ロックオブジェクトを解放するときに、当該ロックオブジェクトに格納されたスレッド情報から所定の待ち解除ポリシーに従って起床するスレッドを決定した後に、前記任意のスレッドを管理するマイクロカーネルから前記起床するスレッドを管理するマイクロカーネルへ待ち解除のメッセージを直接送信するステップと、
を備え、
前記ロックオブジェクトには、前記複数のプロセッサコアごとに1つずつの、次に起床されるべきスレッドのスレッド情報を格納可能である、同期制御方法。
【請求項8】
前記ロックオブジェクトは、前記複数のプロセッサコア数分の配列であるスレッド情報格納配列を含み、
前記ロックオブジェクトによりスレッドが待ち状態となったときに、当該スレッドが実行されているプロセッサコアの番号に対応した前記スレッド情報格納配列の要素に当該スレッドのスレッド情報を格納する、請求項7記載の同期制御方法。
【請求項9】
前記スレッド情報格納配列の各要素のサイズは、CPUのビット数を超えないように設定されている、請求項8記載の同期制御方法。
【請求項10】
スレッドを制御するためにスレッドごとに生成されるスレッド制御ブロックを備え、
前記ロックオブジェクトによりスレッドが待ち状態となったときに、当該スレッドに係る前記スレッド制御ブロックに、同じロックオブジェクトにより待ち状態となったスレッド群を管理するための待ち管理キューが登録される、請求項7~9のいずれか1項に記載の同期制御方法。
【請求項11】
前記メッセージは、オペレーティングが備えるメッセージング機能を使用して送信される、請求項7~10のいずれか1項に記載の同期制御方法。
【請求項12】
前記ロックオブジェクトは、同期を必要とするイベントごとに動的に生成可能である、請求項7~11のいずれか1項に記載の同期制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
この発明は、複数のプロセッサコアを搭載したコンピュータ上で実行される同期制御システムおよび同期制御方法に関する。
【背景技術】
【0002】
スレッド間の同期制御方法として、従来型のオペレーティングシステムにおいては、排他制御を伴う共有メモリ参照方式が用いられていた。例えば、特許文献1に記載の発明では、共有メモリを用いて通信を行うとともに、複数のプロセッサから共有メモリにアクセスする際の排他制御のためにセマフォ(排他制御用変数)を用いている。このような構成においては、セマフォを獲得したあとに共有メモリへアクセスし、読み出し又は書き込みを行うことにより、複数のプロセッサからの同時アクセスを禁止し、同時書き込みによるデータ破壊やデータ読み出し中にデータが書き換えられることを防止している。このため、セマフォ獲得失敗時にはポーリングやスピンロックなどでセマフォ解放を待つ必要がある。このような共有メモリ参照方式では、競合発生時のCPU負荷や排他制御時のバス負荷が大きくなる傾向があり、システム性能に与えるインパクトが大きかった。
【0003】
この点、共有メモリを参照するのではなく、メッセージングにより通信を行うようにすれば、システム全体の高い並列実行性能を実現することができる。例えば、イベント待ちを管理するサーバスレッドをオペレーティングシステムの一部として設け、このサーバスレッドに対してメッセージングを行うことで同期を行うようにすれば、ポーリングやスピンロックを使用せずに通信を行うことができる。ただし、メッセージングそのものの実行時間は、共有メモリ参照方式よりも大きくなる傾向があり、スレッド間の同期や通信が多用される環境では遅延時間の影響が大きくなる可能性があった。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
そこで、本発明は、最低限のメッセージング回数でスレッド間の同期を制御することができる同期制御システムおよび同期制御方法を提供することを課題とする。
【課題を解決するための手段】
【0006】
上記した課題を解決するため、第1の発明は、複数のプロセッサコアを搭載したコンピュータ上で実行され、前記複数のプロセッサコアごとにスレッドのスケジューリングを行うマイクロカーネルを配置した同期制御システムであって、異なるプロセッサコアまたは同一のプロセッサコアに割り当てられたスレッド間での同期処理を実行するための共有資源であり、割り当てられた前記プロセッサコアにかかわらずすべてのスレッドがアクセス可能なロックオブジェクトを備え、前記ロックオブジェクトは、前記複数のプロセッサコアごとに1つずつの、次に起床されるべきスレッドのスレッド情報を格納可能であり、任意のスレッドが前記ロックオブジェクトを解放するときに、当該ロックオブジェクトに格納されたスレッド情報から所定の待ち解除ポリシーに従って起床するスレッドを決定した後に、前記任意のスレッドを管理するマイクロカーネルから前記起床するスレッドを管理するマイクロカーネルへ待ち解除のメッセージを直接送信する。
【0007】
また、第2の発明は、複数のプロセッサコアを搭載したコンピュータ上で、前記複数のプロセッサコアごとにスレッドのスケジューリングを行うマイクロカーネルを配置して実行される同期制御方法であって、異なるプロセッサコアまたは同一のプロセッサコアに割り当てられたスレッド間での同期処理を実行するための共有資源であり、割り当てられた前記プロセッサコアにかかわらずすべてのスレッドがアクセス可能なロックオブジェクトを生成するステップと、前記ロックオブジェクトによりスレッドが待ち状態となったときに、前記ロックオブジェクトに当該スレッドのスレッド情報を登録するステップと、任意のスレッドが前記ロックオブジェクトを解放するときに、当該ロックオブジェクトに格納されたスレッド情報から所定の待ち解除ポリシーに従って起床するスレッドを決定した後に、前記任意のスレッドを管理するマイクロカーネルから前記起床するスレッドを管理するマイクロカーネルへ待ち解除のメッセージを直接送信するステップと、を備え、前記ロックオブジェクトには、前記複数のプロセッサコアごとに1つずつの、次に起床されるべきスレッドのスレッド情報を格納可能である。
【発明の効果】
【0008】
本発明は上記の通りであり、最低限のメッセージング回数でスレッド間の同期を制御することができる。
【図面の簡単な説明】
【0009】
【
図1】コンピュータシステムの概略を示すブロック図である。
【
図6】待ち要求の処理の流れを示すシーケンス図である。
【
図7】待ち解除要求の処理の流れを示すシーケンス図である。
【発明を実施するための形態】
【0010】
本発明の実施形態について、図を参照しながら説明する。
本実施形態に係るコンピュータシステムは、
図1に示すようなコンピュータを備えている。このコンピュータは、CPU10と、主記憶装置14と、補助記憶装置(図示せず)と、を備えている。
【0011】
本実施形態に係るCPU10は、1つのプロセッサパッケージ内に複数のプロセッサコア11を搭載したマルチコア・プロセッサであり、例えば、第1プロセッサコア11aおよび第2プロセッサコア11bの2つのプロセッサコア11を備えている。なお、本実施形態においては、CPU10が第1プロセッサコア11aおよび第2プロセッサコア11bの2つのプロセッサコア11を備えている例について説明するが、これに限らず、CPU10は3つ以上のプロセッサコア11を備えていてもよい。
【0012】
主記憶装置14は、CPU10が直接アクセスすることができる記憶装置であり、実行中のスレッド30のコンテキストやその他のデータが記憶されている。例えばこの主記憶装置14には、オペレーティングシステム20の一部であるマイクロカーネル21の実体としてのコンテキストデータや、オペレーティングシステム20によって実行を制御されるスレッド30の実体としてのコンテキストデータ、スレッド30によって使用可能な共有メモリ15、などが配置されている。なお、これらのオペレーティングシステム20やスレッド30のプログラムは補助記憶装置に記憶されており、必要に応じて主記憶装置14に読み込まれることで、CPU10によって使用可能となる。
【0013】
オペレーティングシステム20は、CPU10上でのスレッド30の実行を制御するソフトウェアである。本実施形態に係るオペレーティングシステム20は、上記した複数のプロセッサコア11のそれぞれに対応して、複数のマイクロカーネル21が実行されるように構成されている。マイクロカーネル21は、オペレーティングシステム20の核となるものであり、メモリ管理、割り込み要求処理、スレッド間通信などの必要最小限の機能を搭載したカーネルプログラムである。このマイクロカーネル21は、システム起動時にプロセッサコア11ごとにインスタンスが生成され、対応するプロセッサコア11上で常に実行されるようになっている。
【0014】
以下の説明においては、第1プロセッサコア11a上で実行されるマイクロカーネル21のインスタンスを第1マイクロカーネル21aと呼び、第2プロセッサコア11b上で実行されるマイクロカーネル21のインスタンスを第2マイクロカーネル21bと呼ぶこととする。また、記載を簡略化するため、マイクロカーネル21のインスタンスを単にマイクロカーネル21と記載する場合もある。なお、CPU10が3つ以上のプロセッサコア11を備えている場合には、プロセッサコア11の数と同数のマイクロカーネル21のインスタンスが生成され、それぞれのプロセッサコア11で1つのマイクロカーネル21が実行されることになる。
【0015】
これらのマイクロカーネル21は、他のマイクロカーネル21と通信を行うためのメッセージング機能を有している。マイクロカーネル21が、このメッセージング機能を使用して相互に通信を行うことで、異なるプロセッサコア11または同一のプロセッサコア11に割り当てられたスレッド30間での同期を実現する同期制御システムが実現されている。この同期制御システムについては後ほど詳述する。
【0016】
また、これらのマイクロカーネル21は、当該マイクロカーネル21が実行されるプロセッサコア11(以下、マイクロカーネル21それ自体が実行されるプロセッサコア11のことを、当該マイクロカーネル21の「自コア」という)に割り当てられたスレッド30のスケジューリングを行う。すなわち、マイクロカーネル21は、予め定められた所定のスケジューリングポリシーに従って、自コアで実行するスレッド30を選択し、スレッド30を順番に実行する。なお、スケジューリングポリシーとして何を選択するかは任意に設定可能である。例えば、スレッド30の優先度順、ラウンドロビン方式、FIFOなどの既知のスケジューリングポリシーのうちから最適なものを使用すればよい。
【0017】
マイクロカーネル21によるスケジューリングは、具体的には、スレッド30の状態を遷移させることにより行われる。このスレッド30の状態としては、少なくとも、「実行状態」「実行可能状態」「待ち状態」がある。「実行状態」は、スレッド30にプロセッサコア11が割り当てられて実行している状態である。また、「実行可能状態」は、プロセッサコア11が割り当てられれば実行できるが、他のスレッド30がプロセッサコア11を占有しているため、実行を待機している状態である。また、「待ち状態」は、何らかのイベントが完了するのを待っている状態である。
【0018】
例えば、スレッド30は以下のように状態が遷移する。まず、生成されたスレッド30は、実行可能状態になり、マイクロカーネル21が管理する実行可能状態のキューに接続される。このキューで最も高い優先順位にあるスレッド30は、マイクロカーネル21によってディスパッチされ、実行可能状態から実行状態に遷移する。なお、スレッド30の実行中に、割込みにより他のスレッド30に実行権が渡されると、実行中のスレッド30は実行可能状態に遷移する。また、同期処理などの特定のイベントが発生した場合には、マイクロカーネル21によってスレッド30が待ち状態に遷移する。待ち状態に遷移したスレッド30は、待ち状態が解除されるまで待機し、待ち状態が解除されたら実行可能状態に遷移する。
【0019】
なお、スレッド30が生成されると、当該スレッド30を制御するためにスレッド制御ブロックが生成される。このスレッド制御ブロックは、スレッド30ごとに1つ生成され、スレッド30が終了するまでマイクロカーネル21によって管理される。このスレッド制御ブロックには、上記したスレッド30の状態や、スレッド30の優先度などの情報が登録される。本実施形態においては、このスレッド制御ブロックに、後述する待ち管理キューも登録される。
【0020】
本実施形態に係るスレッド30は、基本的に生成されたプロセッサコア11上で実行される。このため、生成されたプロセッサコア11上で実行しているマイクロカーネル21によって制御されることになる。例えば、
図1に示すように、第1グループ31で実行されるスレッド30は、第1プロセッサコア11a上で第1マイクロカーネル21aによって制御されて実行される。また、第2グループ32で実行されるスレッド30は、第2プロセッサコア11b上で第2マイクロカーネル21bによって制御されて実行される。このとき、第1グループ31で実行されるスレッド30と第2グループ32で実行されるスレッド30とは、互いに直接通信を行うことはできないため、別のグループのスレッド30間で通信を行う場合には、共有メモリ15またはマイクロカーネル21を介して通信を行う必要がある。
【0021】
共有メモリ15は、すべてのプロセッサコア11で共有されるメモリ領域である。この共有メモリ15へは、どのプロセッサコア11で実行しているスレッド30であってもアクセス可能である。本実施形態においては、この共有メモリ15に、複数のロックオブジェクト35を生成可能である。
【0022】
ロックオブジェクト35は、異なるプロセッサコア11または同一のプロセッサコア11に割り当てられたスレッド30間での同期処理を実行するための共有資源である。このロックオブジェクト35は、共有メモリ15に生成されるため、割り当てられたプロセッサコア11にかかわらずすべてのスレッド30がアクセス可能となっている。また、このロックオブジェクト35はユーザ空間に生成されるため、空きメモリが存在する限りにおいて無制限に生成可能である。
【0023】
本実施形態に係るロックオブジェクト35は、
図2に示すような構造体で定義される(構造体名「lockobj」で定義される構造体を参照)。このロックオブジェクト35は、メンバとして、複数のプロセッサコア11数分の配列であるスレッド情報格納配列(percpu[CORE_COUNT];CORE_COUNTはプロセッサコア11の数を示す定数)を含んでいる。
【0024】
本実施形態に係るスレッド情報格納配列の各要素は、任意のスレッド30に係るスレッド情報である。このスレッド情報は、
図2に示すような構造体で定義される(構造体名「lockinfo」で定義される構造体を参照)。このスレッド情報は、メンバとして「tid」と「pri」とを含んでいる。また、「uint16_t」は、これらメンバのデータ型が16ビットの符号なし整数型であることを示している。なお、「tid」には、任意のスレッド30を特定するためのスレッド識別子が格納される。また、「pri」には、当該スレッド識別子で特定されるスレッド30の優先度が格納される。
【0025】
このように、本実施形態に係るスレッド情報(構造体「lockinfo」)は、メンバとしてスレッド識別子とスレッド優先度とを含んでいる。このスレッド識別子とスレッド優先度とは、アトミックに(一体不可分に)読み書きされる必要がある。このため、このスレッド識別子とスレッド優先度とは、CPU10がアトミックに操作できるサイズとなっている。具体的には、構造体「lockinfo」のサイズ(スレッド識別子とスレッド優先度とを足したサイズ)が、CPU10のビット数(CPU10が不可分操作可能な最大ビット数)を超えないように設定されている。本実施形態に係るCPU10は32bitであるため、スレッド識別子とスレッド優先度とを足したサイズ(本実施形態においては、スレッド識別子もスレッド優先度も16bitの変数であるため、これらを足したサイズは32bitである)が、32bitを超えないように設定されている。このように構成することで、スレッド情報にアクセスする際に排他制御が不要となっている。
【0026】
なお、上記した
図2においては、C言語における構造を例に説明しているが、C言語以外のプログラミング言語であっても、上記したロックオブジェクト35と同様の構造を定義することにより、プログラミング言語に依存せずに同様の効果を得ることができる。構造体の記述方法も、プログラミング言語に応じて変更可能である。
【0027】
上記したスレッド情報格納配列には、複数のプロセッサコア11ごとに、次に起床されるべきスレッド30のスレッド情報が格納される。例えば、プロセッサコア11が2つの場合には、percpu[]の要素数は「2」であり、percpu[0]には第1プロセッサコア11aにおいて次に起床されるべきスレッド30に係るスレッド情報が格納され、percpu[1]には第2プロセッサコア11bにおいて次に起床されるべきスレッド30に係るスレッド情報が格納される。なお、プロセッサコア11が3つ以上の場合も同様に、percpu[]の要素数をプロセッサコア11の数に合わせて設定し、percpu[]の各要素に1つずつプロセッサコア11を割り当てて、当該percpu[
]の要素に当該プロセッサコア11において次に起床されるべきスレッド30に係るスレッド情報を格納すればよい。
【0028】
これにより、ロックオブジェクト35には、複数のプロセッサコア11ごとに、次に起床されるべきスレッド30のスレッド識別子が格納されるようになっている。なお、本実施形態に係るスレッド情報格納配列を構造体「lockinfo」の配列としたが、これに限らず、ロックオブジェクト35は少なくとも複数のプロセッサコア11ごとにスレッド識別子を格納できるものであればよい。例えば、スレッド情報格納配列を数値型の配列として、スレッド識別子のみを格納するようにしてもよい。その他、構造体「lockinfo」のメンバを
図2で示す定義から変更してもよい。
【0029】
上記したロックオブジェクト35は、同期を必要とするイベントごとに動的に生成可能である。例えば、ロックオブジェクト35をラップする排他制御用の上位オブジェクト(ミューテックスなど)のインスタンス生成時に合わせて生成することができる。
【0030】
本実施形態に係る同期制御システムは、このロックオブジェクト35を使用して、異なるプロセッサコア11または同一のプロセッサコア11で実行されているスレッド30間で同期制御を行うことができる。
【0031】
すなわち、特定のスレッド30が、ロックオブジェクト35を使用した資源待ちとなると、当該ロックオブジェクト35のスレッド情報格納配列に、待ち状態となったスレッド30のスレッド識別子が格納される。このとき、スレッド情報格納配列のどの要素に格納されるかは、スレッド30を実行しているプロセッサコア11に依存する。すなわち、スレッド30を実行しているプロセッサコア11に割り当てられたスレッド情報格納配列の要素に、待ち状態となったスレッド30のスレッド情報が格納される。
【0032】
一方、このようにロックオブジェクト35により待ち状態となったスレッド30の待ち状態の解除を行うときには、当該ロックオブジェクト35を検索して、スレッド情報格納配列に格納されたスレッド識別子を取得し、当該スレッド識別子を使用したメッセージングによりスレッド30を実行可能状態に移行させる。
【0033】
以下、上記した同期制御に係る処理フローについて詳しく説明する。なお、本実施形態の同期制御に係る処理フローは、大きく分けて、(1)待ち要求処理、(2)待ち解除要求送信処理、(3)待ち解除要求受信処理、の3つの処理からなるため、以下それぞれについて説明する。
【0034】
(待ち要求処理)
待ち要求処理は、イベントの終了待ちを行うスレッド30からの要求を受けて、当該スレッド30を制御するマイクロカーネル21(当該スレッド30が実行されているプロセッサコア11に割り当てられたマイクロカーネル21)によって実行される処理である。この待ち要求処理について、
図3に示すフローを参照しながら説明する。
【0035】
まず、
図3に示すステップS100において、マイクロカーネル21が、任意のスレッド30(以下、「待ち要求スレッド」という)から待ち要求を受信する。具体的には、待ち要求スレッドが、ロックオブジェクト35を指定したAPI呼び出し(後述するmfutex_wait())を行ったときに、マイクロカーネル21による待ち要求処理が開始される。そして、ステップS105に進む。
【0036】
ステップS105では、ステップS100で指定されたロックオブジェクト35のスレッド情報格納配列を参照し、自コアに対応して格納されたスレッド情報に含まれるスレッド識別子(以下、「格納済ID」という)を取得する。そして、ステップS110に進む。
【0037】
ステップS110では、格納済IDが有効であるか無効であるかがチェックされる。スレッド情報格納配列にすでにスレッド情報が格納されている場合には格納済IDが有効であるが、スレッド情報格納配列にスレッド情報が格納されていない場合(自コアにおいて、当該ロックオブジェクト35を使用した待ちスレッド30が存在しない場合)には格納済IDが無効である。格納済IDが無効である場合(またはスレッド情報格納配列にスレッド情報が格納されていない場合)には、ステップS115へ進む。一方、格納済IDが有効である場合(すなわちスレッド情報格納配列にスレッド情報が格納されている場合)には、ステップS120に進む。
【0038】
ステップS115に進んだ場合、自コアにおいて当該ロックオブジェクト35により待ち状態となったスレッド30群を管理するための待ち管理キューを生成し、この待ち管理キューを、待ち要求スレッドに係るスレッド制御ブロックに登録する。また、この待ち管理キューに、待ち要求スレッドに係るスレッド制御ブロックを挿入する。これにより、待ち要求スレッドと待ち管理キューとが相互にリンクされる。そして、ステップS125に進む。
【0039】
ステップS120に進んだ場合、格納済みIDで特定されるスレッド30に係るスレッド制御ブロックを参照し、当該スレッド制御ブロックに登録された待ち管理キューを取得する。そして、この待ち管理キューを、待ち要求スレッドに係るスレッド制御ブロックに登録する。また、この待ち管理キューに、当該スレッド制御ブロックを挿入する。これにより、待ち要求スレッドと待ち管理キューとが相互にリンクされる。そして、ステップS125に進む。
【0040】
ステップS125では、待ち管理キューを検索し、次に起床されるべきスレッド30(待ち管理キューに登録されたスレッド30の中で最も先に起床されるべきスレッド30)を取得する。次に起床されるべきスレッド30は、所定の待ち解除ポリシーに従って決定される。待ち解除ポリシーとしてどのようなポリシーを使用するかは任意であるが、本実施形態においては、スレッド30の優先度順に待ち解除を行うようにしている。すなわち、待ち管理キューに登録されたすべてのスレッド制御ブロックを検索し、最も優先度の高いスレッド30を選択する。そして、ステップS130に進む。
【0041】
なお、待ち解除ポリシーとしては、スレッド30の優先度順に限らず、別のポリシーを設定することも可能である。例えば、FIFO(先入れ先出し方式)を使用してもよいし、特定の属性を有するスレッド30(例えば、書き込みロックを獲得しているライター・スレッド30)を優先的に待ち解除するようにしてもよい。
【0042】
ステップS130では、ステップS125で取得した、次に起床されるべきスレッド30のスレッド情報(スレッド識別子およびスレッド優先度)を、ロックオブジェクト35のスレッド情報格納配列(自コアに対応するスレッド情報格納配列の要素)に格納する。なお、ステップS125で取得したスレッド情報がすでにスレッド情報格納配列に格納されている場合には、スレッド情報格納配列の書き換えを行う必要はない。そして、ステップS135に進む。
【0043】
ステップS135では、待ち要求スレッドを「待ち状態」に移行させる。これにより、待ち要求スレッドは、待ち状態が解除されるまで実行されることはない。以上で、処理が終了する。
【0044】
(待ち解除要求送信処理)
待ち解除要求送信処理は、同期に係るイベントを終了したスレッド30からの要求を受けて、当該スレッド30を制御するマイクロカーネル21(当該スレッド30が実行されているプロセッサコア11に割り当てられたマイクロカーネル21)によって実行される処理である。すなわち、ロックオブジェクト35を解放して、次のスレッド30に実行権を明け渡すべく実行される処理である。この待ち解除要求送信処理について、
図4に示すフローを参照しながら説明する。
【0045】
まず、
図4に示すステップS200において、マイクロカーネル21が、任意のスレッド30(以下、「待ち解除スレッド」という)から待ち要求を受信する。この待ち要求においては、起床するスレッド30(実行権の明け渡し先のスレッド30)のスレッド識別子と、ロックオブジェクト35と、が指定されている。具体的には、待ち解除スレッドが、起床するスレッド30のスレッド識別子とロックオブジェクト35とを指定したAPI呼び出し(後述するmfutex_wake(tid,lockobj))を行ったときに、マイクロカーネル21により待ち解除要求処理が開始される。そして、ステップS205に進む。
【0046】
ステップS205では、ステップS200で取得したスレッド識別子を基に(例えば、ステップS200で取得したスレッド識別子と、ロックオブジェクト35のスレッド情報格納配列の要素とを比較し)、起床するスレッド30を実行中のプロセッサコア11を特定する。そして、当該プロセッサコア11に係るスレッド30群を管理するマイクロカーネル21に対し、待ち解除のメッセージを送信する。本実施形態に係るオペレーティングシステム20は、複数のプロセッサコア11ごとに配置されたマイクロカーネル21間でのメッセージング機能を備えており、このメッセージング機能によって、待ち解除のメッセージが送信される。
【0047】
メッセージが送信されると、メッセージ送信先のマイクロカーネル21によって、後述する待ち解除要求受信処理が実行される。メッセージが受け入れられて、待ち解除要求送信処理が開始されると、送信先から回答が来るため、この回答を受け取って処理が終了する。なお、送信先においてメッセージが受け入れられなかった場合(起床するスレッド30がロックオブジェクト35を待機していない場合)、送信先は失敗情報とともに回答を送信する。この場合は、ロックオブジェクト35を再度スキャンして、別の適切なターゲット(起床するスレッド30)を決定し、待ち解除のメッセージを送信することになる。
【0048】
(待ち解除要求受信処理)
待ち解除要求受信処理は、上記した待ち解除のメッセージを受信したマイクロカーネル21(起床するスレッド30が実行されているプロセッサコア11に割り当てられたマイクロカーネル21)によって実行される処理である。この待ち解除要求受信処理について、
図5に示すフローを参照しながら説明する。
まず、
図5に示すステップS300において、マイクロカーネル21が、上記した待ち解除のメッセージを受信する。そして、ステップS305に進む。
【0049】
ステップS305では、起床するスレッド30を待ち管理キューから除外する。すなわち、起床するスレッド30に係るスレッド制御ブロックに登録された待ち管理キューを取得し、当該待ち管理キューから、起床するスレッド30に係るスレッド制御ブロックを削除する。待ち管理キューは、共通のロックオブジェクト35に起因して待機している複数のスレッド30群(同じプロセッサコア11で実行されているスレッド30群)で共有されているため、これらのスレッド30群に係るスレッド制御ブロックに登録された待ち管理キューからも、起床するスレッド30に係るスレッド制御ブロックが削除されることになる。そして、ステップS310に進む。
【0050】
ステップS310では、ステップS305で取得した待ち管理キューを検索し、今回起床するスレッド30の次に起床されるべきスレッド30に係るスレッド制御ブロックを選択する。このとき、次に起床されるべきスレッド30は、
図3のステップS125と同様に、所定の待ち解除ポリシーに従って決定される。そして、ステップS315に進む。
【0051】
ステップS315では、ステップS310で選択した、次に起床されるべきスレッド30に係るスレッド情報(スレッド識別子およびスレッド優先度)を、ロックオブジェクト35のスレッド情報格納配列(自コアに対応するスレッド情報格納配列の要素)に格納する。なお、ステップS310において、待ち管理キューにスレッド30が存在しなかった場合には、自コアに対応するスレッド情報格納配列の要素に、無効なスレッド情報(または、無効なスレッド識別子を含むスレッド情報)を格納する。そして、ステップS320に進む。
ステップS320では、起床するスレッド30のステータスを「実行可能状態」に移行する。そして、ステップS325に進む。
ステップS325では、起床するスレッド30をディスパッチし、「実行状態」に移行させる。以上で、処理が終了する。
【0052】
(待ち要求処理のシーケンス)
次に、上記した待ち要求処理において、スレッド30およびマイクロカーネル21間でどのようなやり取りが発生するのかを、
図6に示すシーケンス図を用いて説明する。この
図6では、スレッドAが、何らかのイベント待ちとなる様子を示している。例えば、スレッドAが、ミューテックスの獲得に失敗して待ち状態となる場合などである。
【0053】
スレッドAがミューテックスの獲得に失敗すると、そのミューテックスの下位オブジェクトであるロックオブジェクト35を使用して待ち要求が発行される。本実施形態に係る待ち要求は、mfutex_wait()という、オペレーティングシステム20のAPI(システムコール)として設けられている。mfutex_wait()では、引数としてロックオブジェクト35が渡される。
【0054】
mfutex_wait()が呼び出されると、スレッドAを管理するマイクロカーネル21(ここでは第1マイクロカーネル21a)による処理が開始される。第1マイクロカーネル21aは、
図3で説明したように、ロックオブジェクト35を参照して、ロックオブジェクト35の解放を待っている自コアのスレッド30が既に存在するか否かをチェックする。そして、そのチェック結果に応じて、ロックオブジェクト35や待ち管理キューの内容を適切に書き換える。そして、スレッドAを「待ち状態」に移行させる。
【0055】
(待ち要求解除処理のシーケンス)
次に、上記した待ち解除要求送信処理および待ち解除要求受信処理において、スレッド30およびマイクロカーネル21間でどのようなやり取りが発生するのかを、
図7に示すシーケンス図を用いて説明する。この
図7では、ロックオブジェクト35に係る実行権が、第2プロセッサコア11bで実行中のスレッドBから、第1プロセッサコア11aで実行中のスレッドAへと受け渡される様子を示している。例えば、スレッドBがミューテックスを解放したことにより、スレッドAがミューテックスを獲得する場合などである。
【0056】
スレッドBがミューテックスを解放したときには、まず、実行権を受け渡す先のスレッド30を決定する。本実施形態に係る待ち解除ポリシーは、スレッド30の優先度順であるため、ミューテックスの下位オブジェクトであるロックオブジェクト35のスレッド情報格納配列を検索し、最も優先度の高いスレッド30のスレッド識別子を取得する(スレッド情報格納配列に格納されたスレッド情報のスレッド優先度をすべてチェックし、最も優先度の高いスレッド情報に係るスレッド識別子を取得する)。そして、そのスレッド識別子とロックオブジェクト35とを使用して、待ち解除要求を発行する。本実施形態に係る待ち解除要求は、mfutex_wake()という、オペレーティングシステム20のAPI(システムコール)として設けられている。このmfutex_wake()は、引数として、スレッド識別子とロックオブジェクト35とを指定するようになっている。
【0057】
mfutex_wake()が呼び出されると、スレッドBを管理するマイクロカーネル21(ここでは第2マイクロカーネル21b)による処理が開始される。第2マイクロカーネル21bは、
図4で説明したように、実行権を受け渡す先のスレッド30(ここではスレッドA)を管理するマイクロカーネル21(ここでは第1マイクロカーネル21a)に対し、待ち解除のメッセージを送信する。このメッセージングは、例えば、待ち解除のメッセージであることを示す識別子(
図7では、MFUTEX_WAKEで定義された定数)、起床するスレッド30のスレッド識別子、ロックオブジェクト35を指定して実行される。
【0058】
このメッセージを第1マイクロカーネル21aが受信すると、
図5で説明したように、ロックオブジェクト35や待ち管理キューの登録内容を適切に書き換える。そして、スレッドAを「実行可能状態」に移行させる。その後、所定のスケジューリングポリシーに従い、スレッドAをディスパッチしたときに、スレッドAが第1マイクロカーネル21aによって実行される。
【0059】
なお、上記の説明では、ロックオブジェクト35に係る実行権が、第2プロセッサコア11bで実行中のスレッドBから、第1プロセッサコア11aで実行中のスレッドAへと受け渡される例について説明した。すなわち、異なるプロセッサコア11に割り当てられたスレッド30間での同期処理について説明した。しかしながら、これに限らず、ロックオブジェクト35に係る実行権が、同じプロセッサコア11内で受け渡されるようにしてもよい。すなわち、同一のプロセッサコア11に割り当てられたスレッド30間で同期処理を行うようにしてもよい(例えば、
図7に示すスレッドAとスレッドBとが同じプロセッサコア11内で実行されていてもよい)。
【0060】
(まとめ)
本実施形態は上記の通りであり、割り当てられたプロセッサコア11にかかわらずすべてのスレッド30がアクセス可能な共有資源のロックオブジェクト35を備え、このロックオブジェクト35は、複数のプロセッサコア11ごとに、次に起床されるべきスレッド30のスレッド識別子を格納可能である。そして、ロックオブジェクト35により待ち状態となったスレッド30の待ち状態の解除を行うときには、当該ロックオブジェクト35を検索して次に起床する待ち状態のスレッド30のスレッド識別子を取得し、当該スレッド識別子を使用したメッセージングによりスレッド30を実行可能状態に移行させるようにしている。このため、最低限のメッセージング回数でスレッド30間の同期を制御することができる。
【0061】
また、このような態様によれば、共有メモリ参照方式と比較して以下の優位性がある。すなわち、共有メモリ参照方式においては、複数のプロセッサコア11から共有メモリ15にアクセスする際の排他制御においてセマフォやミューテックスの獲得失敗時にはポーリングやスピンロックなどでオブジェクトの解放を待つ必要がある。しかしながら、本発明によれば、メッセージングにより同期制御を行うため、ポーリングやスピンロックを使用せずに同期制御を行うことができる。よって、競合発生時に無駄なCPUリソースを消費することがなく、また、排他制御時のバス負荷も低下させることができる。
【0062】
また、このような態様によれば、従来のメッセージングによる同期制御と比較して以下の優位性がある。すなわち、従来のメッセージングによる同期制御においては、サーバスレッドを介して同期制御を行うため、サーバスレッドを経由する分だけメッセージング回数が増加し、また、サーバスレッドを設けることで資源が消費されていた。この点、本実施形態によれば、共有資源のロックオブジェクト35を使用することで、サーバスレッドを介さずに同期制御を実行することができる。よって、メッセージング回数を減少させ、スレッド資源を節約することができる。また、ロックオブジェクト35がユーザ空間に配置されるため、サーバスレッドの静的なコンフィギュレーションに依存せず、空きメモリが存在する限りは無制限でロックオブジェクト35を生成することができる。すなわち、ロックオブジェクト35を使用した同期制御のイベント数について、実質的に制限がない。
【0063】
また、従来の排他制御として、グローバルロックを使用してすべてのプロセッサコア11が同じクリティカルセクションに入ることができないように制御するものがある。しかしながら、本実施形態によれば、ロックを解除するスレッド30とロックを獲得しているスレッド30によって使用されるプロセッサコア11のみが排他制御にかかわるため、排他制御にかかわらないプロセッサコア11の処理能力を低下させることがない。
【0064】
なお、上記した実施形態においては、待ち解除ポリシーとしてスレッド30の優先度順を用いているため、スレッド情報格納配列にスレッド30の優先度を格納した。しかしながら、待ち解除ポリシーとしてスレッド30の優先度順を用いない場合には、スレッド情報格納配列にスレッド30の優先度を格納する必要はない。例えば、待ち解除ポリシーとしてFIFO(先入れ先出し方式)を用いる場合、スレッド情報格納配列には最低限の情報としてスレッド識別子が格納されていればよい。そして、待ち管理キューの先頭のスレッド30に係るスレッド識別子をスレッド情報格納配列に格納すればよい。また、どのプロセッサコア11に係るスレッド30の待ち解除を行うのかについても、任意のルールを設定可能である。例えば、配列を順番に参照するようにした場合、待ち解除要求を送信するプロセッサコア11に係るスレッド情報格納配列の添字がn(nは、n<CORE_COUNTを満たす非負整数)である場合、スレッド情報格納配列の添字がm(mは、n+1=CORE_COUNTのときには「0」、それ以外のときには「n+1」)のプロセッサコア11に係るスレッド30に待ち解除要求を送信するようにしてもよい。
【符号の説明】
【0065】
10 CPU
11 プロセッサコア
11a 第1プロセッサコア
11b 第2プロセッサコア
14 主記憶装置
15 共有メモリ
20 オペレーティングシステム
21 マイクロカーネル
21a 第1マイクロカーネル
21b 第2マイクロカーネル
30 スレッド
31 第1グループ
32 第2グループ
35 ロックオブジェクト