JP2011248468A - 情報処理装置および情報処理方法 - Google Patents

情報処理装置および情報処理方法 Download PDF

Info

Publication number
JP2011248468A
JP2011248468A JP2010118718A JP2010118718A JP2011248468A JP 2011248468 A JP2011248468 A JP 2011248468A JP 2010118718 A JP2010118718 A JP 2010118718A JP 2010118718 A JP2010118718 A JP 2010118718A JP 2011248468 A JP2011248468 A JP 2011248468A
Authority
JP
Japan
Prior art keywords
data
thread
queue
processing
information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2010118718A
Other languages
English (en)
Other versions
JP5553685B2 (ja
Inventor
Akito Nagata
章人 永田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sony Interactive Entertainment Inc
Original Assignee
Sony Computer Entertainment Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sony Computer Entertainment Inc filed Critical Sony Computer Entertainment Inc
Priority to JP2010118718A priority Critical patent/JP5553685B2/ja
Priority to CN2011800254549A priority patent/CN102906706A/zh
Priority to PCT/JP2011/001715 priority patent/WO2011148553A1/ja
Publication of JP2011248468A publication Critical patent/JP2011248468A/ja
Priority to US13/611,561 priority patent/US9658905B2/en
Application granted granted Critical
Publication of JP5553685B2 publication Critical patent/JP5553685B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Multi Processors (AREA)

Abstract

【課題】キューへのアクセスや操作に係る処理効率を向上させる。
【解決手段】キューへデータをポップしたいスレッドはまず、アクセスしたキューにポップできるデータあるか否かを確認し、データがあればそれをポップする(S22のY、S24)。一方、データがなかった場合、スレッドは、自らのスレッドの識別情報を含むスレッド情報を同じキューにプッシュしたうえ、プロセッサを開放し待機状態へ移行する(S22のN、S28、S30)。後にデータをプッシュしたいスレッドは、キューにスレッド情報があれば、データを待っているスレッドがあると判断し、当該スレッド情報をポップしたうえデータを渡し、処理を再開させる。
【選択図】図8

Description

本発明は情報処理技術に関し、具体的には複数のスレッドを処理する情報処理装置および情報処理方法に関する。
近年の情報処理装置は、複数のプロセスを同時に実行することができるマルチタスク環境を実現するとともに、これらのプロセスがプロセス内部で複数のスレッドを生成して並行処理を行うことができるマルチスレッド技術を搭載している。プロセスは実行時に固有のリソースやアドレス空間が割り当てられ、他のプロセスの領域にアクセスすることができない。これに対してスレッドは、プロセス内部で生成される実行単位であり、各スレッドはプロセス内の領域に互いに自由にアクセスすることができる。スレッドは、オペレーティングシステムがCPU(Central Processing Unit)の実行時間を割り当てる基本的な実行単位となる。
このように複数のスレッドを並列に処理する環境においては、共有メモリ内にキューを設け、消費されるデータやリソースを要求するスレッドの待ち行列を生成できるようにすることで、プロセッサやスレッドの独立性を保持しつつ排他制御を実現することができる。
一般的に、あるスレッドがキューからデータを取り出そうとした際、キューにデータが存在しなければ、当該スレッドは、別のスレッドによって新たなデータが格納されるまでビジーループ状態となる。この間、CPUリソースは無駄に消費されることになるため、このような状態が発生するほど全体的な処理の効率が低下するという問題があった。
本発明はこのような課題に鑑みてなされたものであり、その目的は、スレッドによるキューへのアクセスに起因する処理効率の低下を防止することのできる情報処理技術を提供することにある。
本発明のある態様は情報処理装置に関する。この情報処理装置は、個々のデータの行列からなるデータ用キューを格納するメモリと、生成したデータをデータ用キューに入れるデータ生成スレッドと、データをデータ用キューから取り出すデータ消費スレッドと、の少なくともいずれかを処理する1つ以上のプロセッサと、を備え、プロセッサは、データ消費スレッドの処理において、データ用キューに取り出すべきデータが存在しない場合、当該データ用キューに、データ消費スレッドの識別情報を入れ、データ生成スレッドの処理において、データをデータ用キューに入れる際、当該データ用キューにデータ消費スレッドの識別情報が入っていたら、当該データ消費スレッドが取得できるようにデータの格納先を変更することを特徴とする。
本発明の別の態様は情報処理方法に関する。この情報処理方法は、プロセッサによる第1のスレッドの処理において、メモリに格納されたキューからのデータ取り出しを試みた際、取り出すべきデータが存在しない場合、第1のスレッドの識別情報を当該キューに入れるステップと、プロセッサによる第2のスレッドの処理において、前記キューへデータを入れる際、当該キューに第1のスレッドの識別情報が入っていたら、当該第1のスレッドにデータを渡すステップと、を含むことを特徴とする。
なお、以上の構成要素の任意の組合せ、本発明の表現を方法、装置、システム、コンピュータプログラム、コンピュータプログラムを記録した記録媒体などの間で変換したものもまた、本発明の態様として有効である。
本発明によると、排他制御に係る処理効率の低下が少ない情報処理を実現できる。
本実施の形態における情報処理装置の構成を示す図である。 本実施の形態におけるキューに格納する待ち行列のデータ構造例を模式的に示す図である。 本実施の形態において要素が入っていない状態のキューに要素をプッシュする操作の様子を示す図である。 本実施の形態において要素が格納されている状態のキューに新たな要素をプッシュする操作の様子を示す図である。 本実施の形態において複数の要素が格納されている状態のキューから要素をポップする操作の様子を示す図である。 本実施の形態においてひとつの要素のみが格納されている状態のキューから当該要素をポップする操作の様子を示す図である。 本実施の形態においてスレッドがキューを操作する手順を示すフローチャートである。 本実施の形態においてキューにポップするデータがない場合を考慮したときの基本的な処理手順を示すフローチャートである。 本実施の形態においてキューにポップするデータがない場合を考慮したときの基本的な処理手順を示すフローチャートである。 本実施の形態においてデータのキューとパケットのキューの双方にスレッドの待ち行列を組み入れる場合の処理手順を示すフローチャートである。 本実施の形態においてデータのキューとパケットのキューの双方にスレッドの待ち行列を組み入れる場合の処理手順を示すフローチャートである。 本実施の形態においてセマフォの機能を実現するためにキューに格納するリンクリストの構造とその操作の様子を模式的に示す図である。 本実施の形態において要求数に対して資源が足りない場合のリンクリストの操作の様子を示す図である。 本実施の形態において資源獲得待ちをしているスレッドが存在する場合に資源を開放するときの、リンクリストの操作の様子を示す図である。 本実施の形態において資源を要求する際の処理手順を示すフローチャートである。 本実施の形態において資源を開放する際の処理手順を示すフローチャートである。 本実施の形態において別のスレッドによってWロックが獲得されている期間においてRロックを要求するスレッドが発生した場合の、リンクリストの操作の様子を示す図である。 本実施の形態においてWロックを獲得していたスレッドがそれを解除するときのリンクリストの操作の様子を示す図である。
図1は本実施の形態における情報処理装置の構成を示している。情報処理装置10は処理ユニット12a、・・・、12nと共有メモリ14とを含み、それらはメインバス20に接続されている。処理ユニット12a、・・・、12nはそれぞれ、プロセッサ16a、・・・、16n、およびローカルメモリ18a、・・・、18nを含む。処理ユニット12a、・・・、12nはそれぞれプロセッサ16a、・・・、16n、およびローカルメモリ18a、・・・、18n以外の構成を含んでよいが、ここでは図示を省略している。
情報処理装置10において各種機能を実現するために生成された複数のスレッドは、処理ユニット12a、・・・、12nにおいて並列に処理される。共有メモリ14にはスレッドを処理するためのプログラムや各種データが格納され、プロセッサ16a、・・・、16nは、必要なデータを共有メモリ14から自らの処理ユニットに属するローカルメモリ18a、・・・、18nに読み出したうえ、スレッド処理を開始する。
開始したスレッドに割り当てられたタイムスライスが満了した場合や、処理内容に応じて待機状態となった場合などに、プロセッサ16a、・・・、16nは処理対象を別のスレッドへ切り替える。なお以後の説明では、理解を容易にするため処理の主体を「スレッド」と表現する場合があるが、ハードウェア的には「スレッドを処理しているプロセッサ」を意味する。
スレッド処理の順序やCPU時間の割り当てを定めるスケジューリングは、OSが提供するスケジューラによって行われてもよいし、ユーザレベルスケジューラによって行われてもよい。このようなスケジューリング処理も、一つのスレッドとしてプロセッサ16a、・・・、16nのいずれかが実行する。
本実施の形態では後述するように、キューの状態に応じて、処理中のスレッドがプロセッサを開放し待機状態になる場合と、別のスレッドの処理により待機状態となったスレッドの処理開始が可能となる場合がある。したがって、そのような場合にスレッドの状態移行を実現するプロセスをあらかじめ準備しておき、スレッドからの要求に従い実行されるようにしておく。このようなプロセスは、OSによって提供されるものを利用してもよいし、ユーザレベルで準備してもよい。
共有メモリ14はキュー22を含む。キュー22はデータやスレッドなどの待ち行列を格納する記憶領域である。後に詳述するように待ち行列の目的に対応させてキューを複数設けてよいが、ここではそれらを総括してキュー22としている。図2は、本実施の形態におけるキュー22に格納する待ち行列のデータ構造例を模式的に示している。
同図に示す待ち行列の目的は特に限定されず、スレッド処理の進行において必要な待ち行列であれば、待つ主体がスレッド自体であってもスレッド処理に必要なデータであってもよい。例えばあるスレッドが、イベントを発生させて当該イベントの識別情報をキュー22に格納していき、別のスレッドが当該識別情報をキュー22に格納された順に読み出し、それに基づきイベントを処理する場合が考えられる。この場合キュー22には、処理を待つイベントの識別情報の待ち行列が形成される。
図2に示すように、本実施の形態の待ち行列はリンクリストの形態を有する。リンクリストは、複数のデータを、次のデータのアドレスへのポインタによって連結させた構造を有する。本実施の形態におけるリンクリスト28は待ち行列を表すため、リンクする順番は、キュー22に格納された順となる。上述したように目的によって待ち行列の主体は様々考えられるが、ここではそれらを総括して「要素」と呼ぶ。図2においてEa、Eb、Ecはこの順で格納された要素を、Ph、Pa、Pb、Ptはポインタを表しており、各ポインタから出る矢印の先がポインタの示すアドレスに格納された要素となる。
まずポインタPhはヘッドポインタであり、最初に格納された要素Eaの格納先アドレスを示す。要素Eaと対応づけられたポインタPaは、次に格納された要素Ebの格納先アドレスを示す。要素Ebと対応づけられたポインタPbは、その次に格納された要素Ecの格納先アドレスを示す。ポインタPtはテイルポインタであり、図のように最後に格納された要素が要素Ecであれば当該要素Ecの格納先アドレスを示す。
このようなデータ構造によって、要素がいくつ格納されても、要素とその格納順を表すことができる。FIFO(First In, First Out)のポリシーで要素を待ち行列からはずす際は(以下、「ポップする」という)、まずヘッドポインタPhを参照し、待ち行列のうち最初に格納された要素Eaのアドレスを取得する。そして要素Eaを当該アドレスから読み出したあと、ヘッドポインタPhを次の要素Ebの格納先アドレスに更新する。具体的には要素Eaに対応づけられていたポインタPaの値をヘッドポインタPhにコピーする。
要素を待ち行列に追加する際は(以下、「プッシュする」という)、キュー22の空き領域に当該要素を格納した後、テイルポインタPtを参照して、待ち行列の最後の要素Ecのアドレスを取得する。そして当該要素Ecに、追加する要素のアドレスを示す新たなポインタを対応づけるとともに、テイルポインタPtも当該アドレスに更新する。
リンクリストを用いるか否かに関わらず、キューなど複数のスレッドで共有する情報を操作する場合は一般的に、情報の整合性を保つためアクセスの排他制御が必要となる。この場合、ロックを獲得する、キューを操作する、ロックを解除する、という一連の処理を一つのスレッドが完了するまで、他のスレッドは、例え優先度が高くてもキューの操作を待たなければならない。
このように発生するキューへのアクセス待ち時間を削減するため、本実施の形態では、ロックせずに操作を行うノンブロッキングキューを実現する。具体的には、キューに対する一連の操作を複数のアトミック操作(不可分操作)で段階的に行い、アトミック操作の間では別のスレッドによるキュー操作の割り込みを許す。アトミック操作は他のスレッドによる干渉なしに実行されることが保証される操作である。そして割り込みにより中断された操作のうち残りの部分は、割り込んだスレッドが引き継ぐことにより完了させる。
図3〜6は、本実施の形態のノンブロッキングキューの操作手法をより詳細に説明するための図である。図3は要素が入っていない状態のキューに要素Eaをプッシュする操作の様子を示している。図の上から、状態50、52、54、56の順でキューの状態が変遷するとする。基本的な表示の仕方は図2のリンクリスト28と同様であるが、ヘッドポインタPh、テイルポインタPt以外のポインタは矢印のみで表している。すなわち矢印の始点が各ポインタに対応づけられている要素、終点がポインタが示すアドレスに格納されている要素である。図4〜6も同様である。
まず状態50はキューに要素が格納されていない初期状態を表している。このときリンクリストにはダミーの要素E_dummyを入れておく。ダミーの要素E_dummyは有効な要素でなく、あらかじめ所定のアドレスに準備しておく。このようにキューにダミーの要素E_dummyを入れる場合、要素がダミーの要素E_dummyであることを示す情報を、当該要素を示すポインタ、同図の例ではヘッドポインタPhに付加する。ポインタに別の情報を付加する手法は、後に図12などを参照して詳述するのと同様である。あるいは、ポインタが示す先のアドレスにダミーであることを示す識別情報を格納することによってダミーの要素E_dummyを識別してもよい。状態50ではヘッドポインタPhおよびテイルポインタPtはどちらも、ダミーの要素E_dummyのアドレスを示している。この状態からあるスレッドが要素Eaをプッシュする場合、まず要素Eaを空いている記憶領域に格納しておく。そして当該記憶領域のアドレスを示すポインタを、ダミーの要素E_dummyに対応づけることにより状態52とする(第1操作)。
次にテイルポインタPtを、要素Eaを格納した記憶領域のアドレスを示すように更新して状態54とする(第2操作)。次にヘッドポインタPhを、第1操作においてダミーの要素E_dummyに対応づけたポインタの値に更新することにより、ヘッドポインタPhが要素Eaのアドレスを示す状態56とする(第3操作)。以上の手順により、キューに最初の要素をプッシュ処理が完了する。本実施の形態では、このように段階を追ってポインタの更新を行う。そして第1操作、第2操作、第3操作をそれぞれアトミック操作とする。
図4は要素Ea、Ebが格納されている状態のキューに新たな要素Ecをプッシュする操作の様子を示している。まず状態60では、ヘッドポインタPhが最初に格納された要素Eaのアドレスを、要素Eaに対応づけられたポインタおよびテイルポインタが、要素Eaの次に格納され、かつ最後に格納された要素Ebのアドレスを示している。
この状態60からあるスレッドが要素Ecをプッシュする場合、まず要素Ecを空いている記憶領域に格納しておく。そして当該記憶領域のアドレスを示すポインタを、要素Ebに対応づけることにより状態62とする(第1操作)。次にテイルポインタPtを、要素Ecを格納した記憶領域のアドレスを示すように更新して状態64とする(第2操作)。以上の手順により、元から要素が入っているキューに新たな要素をプッシュ処理が完了する。このときもポインタの更新は段階的に実施し、第1操作、第2操作をアトミック操作とする。
図5は複数の要素Ea、Ebが格納されている状態のキューから要素Eaをポップする操作の様子を示している。状態70は図4の状態60と同様である。この状態70からあるスレッドが最初に格納された要素Eaをポップする場合は、まずヘッドポインタPhを参照して要素Eaのアドレスを取得し、当該アドレスに格納された要素Eaをローカルメモリ18aなどに読み出しておく。そしてヘッドポインタPhを、読み出した要素Eaに対応付けられていたポインタの値に更新することにより状態72とする(第1操作)。以上の手順により、要素が複数入っているキューから最初に格納された要素をポップする処理が完了する。このときのキューに対する操作、すなわち第1操作をアトミック操作とする。
図6は要素Eaのみが格納されている状態のキューから当該要素Eaをポップする操作の様子を示している。まず状態80では、ヘッドポインタPhおよびテイルポインタPtが唯一の要素である要素Eaのアドレスを示している。この状態からあるスレッドが要素Eaをポップする場合、ヘッドポインタPhとテイルポインタPtが同じアドレスを示していることから要素Eaがキューにおける最後の要素であること、ダミーの要素E_dummyがキューに含まれていないこと、を判断すると、まずダミーの要素E_dummyを所定の記憶領域に格納するなどダミーの要素E_dummyに対して必要な初期化を行い状態82とする(第1操作)。
そしてダミーの要素E_dummyのアドレスを示すポインタを、要素Eaに対応づけることにより状態84とする(第2操作)。次にテイルポインタPtを、ダミーの要素E_dummyのアドレスを示すように更新して状態86とする(第3操作)。次にヘッドポインタPhを参照して要素Eaのアドレスを取得し、ヘッドポインタPhを要素Eaに対応付けられていたポインタの値、すなわち要素E_dummyのアドレスに更新することにより状態88とする(第4操作)。
このとき要素Eaをローカルメモリ18aなどに読み出しておく。以上の手順により、キューから最後の要素をポップする処理が完了する。これまで同様、第1操作、第2操作、第3操作、第4操作はそれぞれアトミック操作とする。
図3〜6にそれぞれ示した一連の操作のいずれかによって、キューに対する操作を全て実現することができる。ここでキューはロックされていないため、アトミック操作の間の期間、すなわち図3の状態52、54、図4の状態60、図6の状態82、84、86で別のスレッドによるキュー操作の割り込みが発生する可能性がある。このときは、ある条件において、割り込んだスレッドが、自らが目的とする操作を開始する前に、割り込みによって中断された操作のうち残りの操作を引き継ぐ。
次にキュー操作の引継ぎを実現するためのスレッドの動作を説明する。図7はスレッドがキューを操作する手順を示すフローチャートである。図7〜11、図15、16に示すフローチャートにおいては、各部の処理手順を、ステップを意味するS(Stepの頭文字)と数字との組み合わせによって表示する。また、Sと数字との組み合わせによって表示した処理で何らかの判断処理が実行され、その判断結果が肯定的であった場合は、Y(Yesの頭文字)を付加して、例えば、(S10のY)と表示し、逆にその判断結果が否定的であった場合は、N(Noの頭文字)を付加して、(S10のN)と表示する。
図7のフローチャートにおける処理は、あるスレッドがキューへアクセスしたときに開始する。まずスレッドが要素のポップまたはプッシュを目的にキューへアクセスする(S10)。そして図3〜6のいずれかの操作を試みる。例えば、プッシュの場合は図3の状態50あるいは図4の状態60の状態にあれば、ポップの場合は図5の状態70あるいは図6の状態80の状態にあれば、操作が可能である。この場合は(S12のY)、同スレッドの本来の目的である操作を実行する(S16)。状態50、60、70、80になくても、可能であれば操作を実行する。
例えば図6の状態84のようにテイルポインタPtが最後の要素のアドレスを示していない場合を考える。このような状態でも要素のポップは可能である。なぜなら要素のポップはヘッドポインタPhが示すアドレスのみ参照することによって実行可能なためである。一方、要素のプッシュは、図4で説明したとおり、テイルポインタPtが示す最後尾の要素に、プッシュする要素のアドレスを示す新たなポインタを対応づける第1操作が必要である。そのため状態84のように、テイルポインタPtが最後尾の要素以外のアドレスを示している場合、当該要素にはすでに別の要素へのポインタが対応づけられているため、第1操作ができない。
このように、本来の目的である操作ができない場合は(S12のN)、その前にキューを操作していた別のスレッドの操作が完了していないと判断し、残された操作を実行する(S14)。例えば上述のようにテイルポインタPtが最後尾の要素のアドレスを示していない場合は、テイルポインタPtが示している要素からリンクを辿り最後尾の要素を特定し、そのアドレスをもってテイルポインタPtを更新する。本来の操作を妨げる不正な状態のバリエーションと、各状態に対してS14で実行すべき操作とは、あらかじめ対応づけて共有メモリ14に格納しておき、必要に応じて参照する。
そして再度、本来の目的である操作を試みる(S12)。操作ができなければ、さらに、そのときの不正な状態に対応する操作を実行する(S12のN、S14)。これらの処理を、本来の目的である操作が可能になるまで繰り返すことにより、実質的に、前のスレッドが残した操作を引き継いだことになる。そのうえで本来の操作を実行する(S12のY、S16)。
なお図6の第3操作が終わった状態86において別のスレッドが要素のポップを目的に割り込みを行った場合は、前のスレッドの残りの操作、すなわち要素Eaのポップが、割り込みを行ったスレッドが目的とする操作と一致するため、現スレッドの本来の操作として実行する。この場合、割り込まれたスレッドは次にキューへアクセスした際、要素をポップするための最初の操作、すなわち図6の第1操作から実施する。このときキューにダミーの要素E_dummyしかなければ、エラーとして操作を終了する。
以上述べたように本実施の形態では、キューに対するロックはせずに、一連の操作を複数のアトミック操作で多段階に実施する。これにより、スレッドがキューへのアクセスを待機する状態が発生しなくなり情報処理装置全体として処理効率が向上する。また、キューへのアクセスを割り込んだスレッドは、前のスレッドが行っていた操作のうち残りの操作を引き継ぐことにより、割り込みによってキューに一時的に不正な状態が生じてもその都度修正することができ、キューの整合性が保たれる。
次に、これまで述べたノンブロッキングキューを利用して、さらに処理効率を上げる様々な態様を説明する。
(1)データ待ちのスレッドを考慮したキュー
キューに格納された全てのデータが読み出し済みの場合など、あるスレッドがデータのポップを目的にキューにアクセスしてもデータが格納されていない場合がある。このような場合、一般的にはデータがキューに格納されるまでビジーループの状態となり、CPUリソースを無駄に消費する。本実施の形態では上述したノンブロッキングキューの説明における「要素」として、スレッドの処理に用いる「データ」と、スレッドの識別情報などの「スレッド情報」を一つのキューに混在させることにより、データの不在とスレッドの待ち状態とを直結させて処理を効率化する。
この場合も情報処理装置の構成は図1で説明したのと同様でよい。またノンブロッキングキューを利用するため、キューに対する操作は、図3〜7で説明したのと同様でよい。図8および図9は、キューにポップするデータがない場合を考慮したときの基本的な処理手順を示すフローチャートである。図8はデータをポップしたい場合のフローチャートであり、この処理は、スレッドがデータをポップするためにキューにアクセスしたときに開始される。
スレッドはまず、アクセスしたキューにポップできるデータあるか否かを確認し、データがあればそれをポップする(S22のY、S24)。一方、データがなかった場合、スレッドは、自らのスレッドの識別情報を含むスレッド情報を同じキューにプッシュしたうえ、プロセッサを開放し待機状態へ移行する(S22のN、S28、S30)。すなわちポップするデータがない場合にスレッドは、キューに対する操作をスレッド情報のプッシュに切り替えたうえ、待機状態へ移行する。このときキューにはスレッド情報が格納されることになる。このときさらに、プッシュしたスレッド情報を示すヘッドポインタに、スレッド情報が格納されていることを示す情報を付加しておいてもよい。なおS22においては、キューにダミーの要素またはスレッド情報のみが格納されている場合に、当該キューにはデータがない、と判断する(S22のN)。
図9はデータをプッシュしたい場合のフローチャートであり、この処理は、スレッドがデータをプッシュするためにキューにアクセスしたときに開始される。この場合、スレッドはまず、アクセスしたキューにスレッド情報があるか否かを確認し、スレッド情報がなければそのままデータをプッシュすることにより目的を遂げる(S32のY、S34)。一方、スレッド情報があれば、データを待っているスレッドがあると判断し、当該スレッド情報をポップしたうえ、それに基づき特定したスレッドに直接データを渡す(S32のN、S36、S38)。スレッド情報をプッシュした際、スレッド情報が格納されていることを示す情報をヘッドポインタに付加する態様においては、ヘッドポインタを参照することによりS32の判定を行う。
S38の処理は実際には、データをプッシュしようとしたスレッドが、データを渡すべきスレッドに割り当てられた共有メモリ14内の領域へ当該データを格納したうえ、スレッド処理を開始させるプロセスに、ポップしたスレッド情報を渡すことにより、当該スレッドの処理を再開させる。このようにデータのプッシュにおいても、キューにスレッド情報が格納されている場合は当該スレッド情報のポップに操作を切り替える。
このような処理によって、一つのキューにおいて、データの待ち行列とスレッドの待ち行列を同時に管理することができる。データの不在とスレッドの待機状態とを直結させて、アトミックに双方を操作できるため、管理のための処理に要する時間を短縮できる。またデータがない場合にスレッドがビジーループにならずにプロセッサを即座に開放できるため、情報処理装置全体として処理効率が向上する。
図8、9はスレッド処理に必要なデータのキューにスレッドの待ち行列を組み入れる処理手順であったが、本手法はデータのキュー以外にも適用できる。例えばデータをキューにプッシュする際に必要となる空きパケットのキューに対して同様の操作を行うようにしてもよい。ここでパケットは、データを格納する所定単位の記憶領域をデータの入れ物として実体化したものであり、使用可能なパケット数をあらかじめ定めておくことにより、共有メモリのうちキューのために使用可能な領域を制限できる。パケットの概念は、ネットワークを介した通信などにおいて広く導入されている。
図10、11は、データのキューと空きパケットのキューの双方にスレッドの待ち行列を組み入れる場合の処理手順を示すフローチャートである。この場合、空きパケットのキューとして、データを格納するためのデータ用空きパケットのキュー、スレッド情報を格納するためのスレッド情報用空きパケットのキューを設ける。それらのキューのいずれも、ノンブロッキングキューで構成する。
データ用空きパケットのキュー、スレッド情報用空きパケットのキューは、パケットとして区切られた共有メモリの各領域のうち、読み出し前のデータまたはスレッド情報が格納されていない領域、すなわち空きパケットのアドレスを示すキューである。それに対しデータのキューは、読み出し前のデータまたはスレッド情報が格納されている領域のアドレスを示すキューである。
例えばデータ用空きパケットのキューからデータ用空きパケットをポップし、それにデータを入れてデータのキューにプッシュする、という一連の処理は、実際には、データ用空きパケットのキューから空いている記憶領域へのポインタを取得して新たなデータを書き込み、当該領域へのポインタをデータのキューに加える処理となる。逆に、データのキューからデータをポップして不要になった空きパケットをデータ用空きパケットのキューへプッシュする、という一連の処理は、実際には、データのキューのポインタが示す領域のデータを読み出し、当該領域へのポインタをデータ用空きパケットのキューに加える処理となる。スレッド情報についても同様である。
図10はキューからデータをポップしたい場合の処理手順を示すフローチャートであり、その処理は、スレッド処理においてデータをポップする必要が生じたときに開始される。まずスレッドは、スレッド情報用空きパケットのキューからスレッド情報用空きパケットを確保する(S40)。次にデータのキューにアクセスし、ポップ処理を行う(S42)。このとき図8で説明したように、ポップできるデータがあればポップし、なければスレッド情報をプッシュする。スレッド情報をプッシュする場合は、S40で確保したスレッド情報用空きパケットにスレッド情報を格納したうえでデータのキューに格納する。
S42でデータをポップできずにスレッド情報をプッシュした場合は、当該スレッドは待機状態となるためデータのポップ処理を一旦終える(S44のN)。一方、データをポップできた場合は(S44のY)、不要となったスレッド情報用空きパケットをスレッド情報用空きパケットのキューに返却する(S46)。この処理は実際にはスレッド情報用空きパケットのキューへのプッシュとなる。
さらにポップしてローカルメモリなどに読み出し終わったデータが入っていたデータ用空きパケットを返却するため、データ用空きパケットキューへアクセスし、プッシュ処理を行う(S48)。この処理は、図9のフローチャートにおける「データ」を「データ用空きパケット」に置き換えることにより同じ処理手順で実現できる。すなわちデータ用空きパケットキューにスレッド情報があればそれをポップして当該スレッドにデータ用空きパケットを直接渡し、なければデータ用空きパケットをプッシュする。
図11はキューにデータをプッシュしたい場合の処理手順を示すフローチャートであり、その処理は、スレッド処理においてデータをプッシュする必要が生じたときに開始される。まずスレッドは、スレッド情報用空きパケットのキューからスレッド情報用空きパケットを確保する(S50)。次にデータ用空きパケットのキューにアクセスし、データ用空きパケットのポップ処理を行う(S52)。
この処理は、図8のフローチャートにおける「データ」を「データ用空きパケット」に置き換えることにより同じ処理手順で実現できる。すなわちデータ用空きパケットがあればポップし、なければスレッド情報をプッシュする。スレッド情報をプッシュする場合は、S50で確保したスレッド情報用空きパケットにスレッド情報を格納したうえでデータ用空きパケットのキューに格納する。
S52でデータ用空きパケットをポップできずにスレッド情報をプッシュした場合は、当該スレッドは待機状態となるためデータのプッシュ処理を一旦終える(S54のN)。一方、データ用空きパケットをポップできた場合は(S54のY)、不要となったスレッド情報用空きパケットをスレッド情報用空きパケットのキューに返却する(S56)。この処理は実際にはスレッド情報用空きパケットのキューへのプッシュとなる。
さらにデータのキューにアクセスし、S52でポップしたデータ用空きパケットを用いて、データのプッシュ処理を行う(S58)。このとき図9で説明したように、データ用空きパケットキューにスレッド情報があればそれをポップして当該スレッドにデータを直接渡し、なければデータをプッシュする。
このような構成とすることで、スレッド処理に必要なデータのポップ、プッシュのみならず、その前後の処理として必要な空きパケットの確保、返却の処理においても、キューのアクセス待ちによってスレッドがビジーループの状態とならずにプロセッサを開放することができる。各キューはノンブロッキングであることから、空きパケット獲得処理、データ読み出し処理の双方で、キューへのアクセス待ちによるスレッドの待ち時間を減らすことができる。
(2)セマフォ
セマフォは、複数のスレッドで共通して利用する資源について、資源使用の同期をとる手法として広く用いられている。具体的には、利用可能な資源数を表すカウンタを共有メモリに用意し、資源を利用する場合は利用する数だけカウンタの値を減らし、資源を利用し終えて開放する場合はその数だけカウンタ値を増やす。例えばデバイスやメモリなどへのアクセス権を資源とした場合、同時にアクセスすることのできるスレッド数の上限をカウンタの初期値とし、カウンタの値を整数に限れば、アクセス数が上限に達したときにカウンタが0になり、それ以上のアクセスはできなくなる。
ここでは、ノンブロッキングキューの構成を利用して、セマフォの機能を効率的に実現する手法を説明する。図12はセマフォの機能を実現するためにキュー22に格納するリンクリストの構造とその操作の様子を模式的に示している。リンクリストの構造やキューに対する基本的な操作はこれまで説明したのと同様であるが、セマフォを実現する場合は、リンクリストのポインタに資源数に係る情報を付加する。同図において、状態90のヘッドポインタPhには現在利用可能な資源数を表すカウンタ値Nrが付加されている。
どのスレッドも当該資源を利用していない場合、カウンタ値Nrはあらかじめ設定した上限値となる。本実施の形態では以下に述べるように、セマフォの機構に、資源を獲得するためのスレッドの待ち行列を組み入れる。そのため、カウンタ値Nrは整数に限定せず、資源の数が足りない場合を負の値で表現する。要求される資源数も負の値で表現する。
状態90からあるスレッドが資源を要求する場合は、まずヘッドポインタPhを参照し、それに付加されているカウンタ値Nrを取得する。そして資源の要求数がカウンタ値Nr以下であれば要求した数の資源を獲得できるため、元のカウンタ値Nrから要求数を減算してカウンタ値を更新する(同図では「Nr’」としている)。この第1操作により状態92となり、要求数に対して資源数が足りているときの資源の獲得が完了する。
ここでの第1操作もアトミック操作とする。そのためカウンタ値Nrは、ポインタと合わせてアトミック操作が可能なデータサイズとする。例えばアトミック操作を実施できるデータサイズが4バイト単位であったら、3バイトをポインタに、1バイトをカウンタ値Nrに割り当てる。サイズが足りない場合は、例えばポインタをインデックス構造としてリンクリストの操作時はポインタのインデックスのみを操作し、データアクセスが必要なときのみ実際のアドレスを引くようにしてもよい。なお状態90からあるスレッドが資源を開放する場合は、カウンタ値Nrに開放する資源数を加算して更新すればよい。
図13は要求数に対して資源が足りない場合のリンクリストの操作の様子を示している。ここでは理解を容易にするため、カウンタ値や要求数を具体的な数値例で示している。まず状態100において、ヘッドポインタPhに付加されたカウンタ値Nrは「5」となっており、5個の資源が利用可能であることを表している。この状態100からあるスレッドが、資源数10を要求するとする。この場合、当該スレッドはヘッドポインタPhに付加されているカウンタ値「5」を参照し、要求数より小さいと判断すると、キューに対し自らのスレッド情報をプッシュする操作を開始する。
このとき、まずスレッド情報を空いている記憶領域に格納する。そして当該記憶領域のアドレスを示すポインタに、資源の要求数を負の値として付加し、ダミーの要素E_dummyに対応づけることにより、状態102とする(第1操作)。状態102などにおいて、ヘッドポインタPh、テイルポインタPt以外のポインタを表す矢印上に示した数値が、当該ポインタに付加された資源要求数である。この例では資源数10を要求しているため「−10」がポインタに付加される。このように、ヘッドポインタPh以外のポインタに付加する情報は、当該ポインタが示す、次のスレッドが要求する資源の数とする。
次にテイルポインタPtを、プッシュしたスレッド情報のアドレスを示すように更新して状態104とする(第2操作)。次にヘッドポインタPhを、ダミーの要素E_dummyに対応づけられたポインタの値に更新することにより、ヘッドポインタPhがスレッド情報のアドレスを示す状態とする。このとき同時に、ヘッドポインタPhに付加されていたカウンタ値に、ダミーの要素E_dummyに対応づけられたポインタに付加されていた資源の要求数を加算し、更新後のヘッドポインタPhに付加する。同図においては5−10=−5がヘッドポインタPhに付加されている。
これらの第3操作により状態106となる。このようにヘッドポインタPhに付加されているカウンタ値Nrは、負の値のときは資源の不足数を表す。この場合、資源獲得待ちをしているスレッドの待ち行列が形成される。状態106からさらに別のスレッドが資源を要求する場合は、そのスレッド情報をプッシュし、追加したスレッド情報を示すポインタには当該スレッドの資源要求数を付加する。なおこれまで同様、第1操作、第2操作、第3操作はそれぞれアトミックに実施する。
図14は資源獲得待ちをしているスレッドが存在する場合に資源を開放するときの、リンクリストの操作の様子を示している。同図において状態108では、2つのスレッドが資源獲得待ちをしており、それぞれのスレッド情報、すなわちスレッド情報a、スレッド情報bがこの順でキューに格納されている。待ち行列の最初のスレッドが要求している資源数に対する不足分は、ヘッドポインタPhに付加されいるカウンタ値で表され、この場合は「−5」である。スレッド情報bに対応する、待ち行列の次のスレッドの資源要求数は、スレッド情報aに対応づけたポインタに付加されている。同図では「−2」が付加されている。
この状態108に対し、あるスレッドが資源数6を開放するとする。この場合、当該スレッドはまずヘッドポインタPhに付加されているカウンタ値を参照し、それが負の値であることから、資源獲得待ちのスレッドがあると判断する。そして当該カウンタ値に、開放する資源数を加算して新たなカウンタ値とする。この値が0以上であれば、待ち行列の最初のスレッドは要求した資源数を獲得できるため、対応するスレッド情報aをポップすることにより待ち行列からはずす。この例では開放する資源数が「6」、カウンタ値が「−5」で、新たなカウンタ値は「1」となることから、スレッド情報aをポップする。
その際、ヘッドポインタPhを、ポップしたスレッド情報aに対応付けられていたポインタの値に更新するとともに、当該ポインタに付加されていた、次のスレッドの資源要求数を、先に算出した新たなカウンタ値にさらに加算し、ヘッドポインタPhに付加する。同図の例では最初のスレッドが資源を獲得した直後のカウンタ値が上記のとおり「1」であり、次のスレッドの要求数が「−2」であるため、1−2=−1のカウンタ値をヘッドポインタPhに付加する。これらの第1操作によってスレッド情報aがポップされた状態110となる。
この例のようにカウンタ値が負であれば、ヘッドポインタPhが示すスレッドの資源要求数に対して利用できる資源が不足しているため、次に資源が開放されるまでそれ以上のスレッド情報はポップしない。一方、状態110においてカウンタ値が正であった場合は、次に資源獲得待ちをしていたスレッドも要求した資源を獲得できるため、スレッド情報を続けてポップする。ポップしたスレッド情報を、スレッド処理を開始させるプロセスに与えることにより、獲得した資源を用いてスレッドの処理が再開される。待ち行列にあった最後のスレッド情報をポップする際は、図6と同様にダミーの要素をプッシュする。
図15は資源を要求する際の処理手順を示すフローチャートである。このフローチャートにおける処理は、資源を要求するスレッドがキューにアクセスしたときに開始される。まずスレッドは、ヘッドポインタPhに付加されたカウンタ値を参照し、要求数に対して利用できる資源数が足りているかを判断する(S60)。足りている場合は(S60のY)、要求数だけ減算することによりカウンタ値を更新し、要求した資源を獲得する(S62)。
利用可能な資源数が足りない場合は(S60のN)、自らのスレッド情報をキューにプッシュする(S64)。そして要求数だけ減算することによりカウンタ値を更新する(S66)。このときのカウンタ値は負の値となる。その後、当該スレッドはプロセッサを開放し待機状態へ移行する(S68)。
図16は資源を開放する際の処理手順を示すフローチャートである。このフローチャートにおける処理は、資源を開放するスレッドがキューにアクセスしたときに開始される。まずスレッドは、ヘッドポインタPhに付加されたカウンタ値が負であるかを確認することにより、資源獲得待ちのスレッドがあるか否かを判断する(S70)。資源獲得待ちのスレッドがない場合は(S70のN)、開放する資源数を加算することによりカウンタ値を更新して開放処理を終える(S72)。
資源獲得待ちのスレッドがある場合は(S70のY)、待ち行列の最初のスレッドが要求する資源の不足分が、開放する資源数で足りるか否かを判定する(S74)。上述したように、元のカウンタ値に開放する資源数を加算した新たなカウンタ値が0以上であれば資源数が足りていると判定できる。開放する資源数で足りる場合は(S74のY)、当該スレッドのスレッド情報をポップして待ち行列からはずし(S76)、獲得した資源を用いて当該スレッドの処理を再開させる(S78)。
待ち行列に後続のスレッドがある場合で(S70のY)、その資源要求数に対し開放する資源の残りで足りる場合は(S74のY)、順次スレッド情報のポップとスレッド処理の再開を実施する(S76、S78)。資源獲得待ちスレッドがなくなったり(S70のN)、開放する資源数では足りなくなった場合は(S74のN)、その時のカウンタ値をその時点における最終的なカウンタ値としてヘッドポインタPhに付加し、開放処理を終了する(S72)。
このような構成とすることで、セマフォの機能と資源獲得待ちスレッドのキューの機能を同時に実現することができる。これらの機能は同じキューに対するアトミック操作で可能になることから、資源が足りない場合に資源要求元のスレッドを即座に待機状態としてプロセッサを開放することができる。また資源を獲得できる状態となったら待機状態となっていたスレッドの処理を即座に再開させることができる。これらの処理はノンブロッキングで行われることから、キューへのアクセス、資源の要求および開放、スレッドの待機および処理の再開といった各ステップにおいてスレッドの待ち時間を減らすことができる。
(3)RWロック
共有メモリに格納されたデータに対する、複数のスレッドによるアクセス制御の手法として、R(Reader)ロックおよびW(Writer)ロックがある。一般に、あるスレッドがデータを読み出すためにRロックを獲得している期間は、他のスレッドもRロックを獲得でき、複数のスレッドが同時に読み出しを行えるようにする。一方、あるスレッドがデータを書き込むためにWロックを獲得している期間は、他のスレッドは当該データへアクセスできないようにする。このようにすることでデータの整合性を保障する。
RロックとWロックは同時には発生せず、例えば書き込みを行いたいスレッドは、別のスレッドが獲得したRロックが解除されるまで待ち、Wロックを獲得してから書き込みを行う。読み出しを行いたいスレッドは、すでに別のスレッドがRロックを獲得していれば、自らもRロックを獲得し読み出しを開始する。一方、別のスレッドがWロックを獲得している場合はそれが解除されるまで待ち、Rロックを獲得してから読み出しを行う。
ここでは、ノンブロッキングキューの構成を利用してRWロックの管理を効率的に実現する手法を説明する。この場合もセマフォについて上述したのと同様、RWロックの管理機構に、ロックを獲得するためのスレッドの待ち行列を組み入れる。そのためリンクリストのポインタには、RWロックの情報を付加する。ここでRWロックの情報は、現在のロックの状態およびロック獲得待ちをしているスレッドが要求しているロックの種別の情報を含む。
現在のロックの状態とは、Rロックを獲得しているスレッド数とWロックを獲得しているスレッド数である。以後の説明では前者を変数R、後者を変数Wで表す。上述のとおり変数Wの最大値は1であり、変数Rは特に上限を設けない。また変数Rが0以外の値をとるとき変数Wは0、変数Wが1のとき変数Rは0である。リンクリストの構造とその操作の様子は基本的にはセマフォに関して説明したのと同様である。
例えばロック獲得待ちのスレッドがない状態では、図12におけるカウンタ値Nrの代わりに、現在のロックの状態がヘッドポインタPhに付加される。一方、ロック獲得待ちのスレッドがある場合は、ヘッドポインタPhにはさらに、リンクリストの最初のスレッドが要求するロックの種別、すなわちRロックかWロックかを示す情報が付加される。
R=0、W=0、すなわちどのスレッドもロックを獲得していない状態では、スレッドはどちらのロックであってもすぐに獲得できる。具体的には、スレッドはまずヘッドポインタPhを参照し、それに付加されている現在のロックの状態を取得する。上記のようにR=0、W=0である場合、スレッドは自らが要求するロックの種別に応じて変数Rまたは変数WをインクリメントすることによりRロックまたはWロックを獲得する。Rが0以外の値であった場合でも、スレッドがRロックを要求する場合は変数RをインクリメントすることによりRロックを獲得できる。
図17は、別のスレッドによってWロックが獲得されている期間においてRロックを要求するスレッドが発生した場合の、リンクリストの操作の様子を示している。同図では理解を容易にするため、RWロックの情報を具体例で示している。まず状態120において、ヘッドポインタPhに付加されたRWロックの情報は、「R=0,W=1」となっており、別のスレッドがWロックを獲得していることを表している。Rロックを要求するスレッドはまず、ヘッドポインタPhに付加されているRWロックの情報を参照してWロックが獲得されていることを確認すると、キューに対し自らのスレッド情報をプッシュする。
このとき、まずスレッド情報を空いている記憶領域に格納し、当該記憶領域のアドレスを示すポインタに、要求するロックの種別を表す識別情報、同図では「Rロック」を付加し、ダミーの要素E_dummyに対応づけることにより状態122とする(第1操作)。次にテイルポインタPtを、当該スレッド情報のアドレスを示すように更新して状態124とする(第2操作)。次にヘッドポインタPhを、ダミーの要素E_dummyに対応づけられたポインタの値に更新することにより、ヘッドポインタPhがスレッド情報のアドレスを示す状態とする。
このとき同時に、ダミーの要素E_dummyに対応づけられたポインタに付加されていた、待ちスレッドが要求するロックの種別を表す識別情報「Rロック」をヘッドポインタPhの付加情報に追加する。これらの第3操作により状態126となる。結果的にヘッドポインタPhには、現在のロックの状態を示す情報と、ヘッドポインタPhが示すスレッドが要求するロックの種別とが付加されることになる。
状態126からさらに別のスレッドがRロックまたはWロックを要求した場合、そのスレッド情報をプッシュし、追加したスレッド情報を示すポインタには、当該スレッドが要求するロックの種別を付加する。なおこれまで同様、第1操作、第2操作、第3操作はそれぞれアトミックに実施する。そのためセマフォに関して説明したように、ポインタに付加するRWロックの情報は、ポインタと合わせてアトミック操作が可能なデータサイズとする。同図は最初にWロックが獲得されている場合を示したが、最初にRロックが獲得されている状態でWロックを要求する場合も同様の操作となる。
図18は、Wロックを獲得していたスレッドがそれを解除するときのリンクリストの操作の様子を示している。同図において状態130では、Rロックを要求しているスレッドとWロックを要求しているスレッドがこの順で待ち行列を形成しており、それぞれのスレッド情報、すなわちスレッド情報a、スレッド情報bがこの順でキューに格納されている。ここでWロックを解除するスレッドはまず、ヘッドポインタPhに付加されているRWロックの情報を参照し、要求されるロックの種別を表す識別情報が含まれていることから、ロック獲得待ちのスレッドがあると判断する。
そしてリンクリストの待ち行列のうち最初のスレッド情報aをポップする。このときヘッドポインタPhを、ポップしたスレッド情報aに対応付けられていたポインタの値に更新するとともに、ヘッドポインタPhに付加したRWロックの情報を更新する。同図の場合、Wロックを解除するので変数Wをデクリメントし、ポップしたスレッド情報aに対応するスレッドにRロックを獲得させるため変数Rをインクリメントする。さらに後続のスレッド情報bに対応するスレッドがWロックを要求しているため、ヘッドポインタPhに付加するRWロックの情報において「Rロック」を「Wロック」に書き換える。これにより状態132となる。
ここで後続のスレッド情報bに対応するスレッドがRロックを要求していた場合は、続けてRロックを獲得させることができるため、スレッド情報bもポップする。このように自らのロックを解除するスレッドは、他にロック獲得待ちのスレッドがある場合、待ち行列の最初のスレッド情報をポップして、対応するスレッドにロックを獲得させる。獲得させたロックがRロックであった場合、さらに待ち行列を確認し、連続してRロックを要求するスレッドがあればそれらのスレッド情報を順次ポップしてRロックを獲得させる。ポップしたスレッド情報を、スレッド処理を開始させるプロセスに与えることにより、ロックを獲得したスレッドの処理が再開される。待ち行列にあった最後のスレッド情報をポップする際は、図6と同様にダミーの要素をプッシュする。
なおWロックを解除するスレッドは、先頭のスレッド情報aのみをポップし、後続のスレッド情報は確認しないようにしてもよい。この場合、処理を開始したスレッド情報aのスレッドが、後続のスレッド、すなわち次に待ち行列の先頭に来たスレッド情報bを確認し、Rロックであった場合は当該スレッド情報bをポップして対応するスレッド処理を開始させる、というように、連鎖的にロック獲得の可否を確認するようにしてもよい。
ロックを要求する際の処理手順は図15のフローチャートで示したのと同様である。ただしS60の判定は、要求するロックを獲得できるか否かの判定となり、S62およびS66で更新する情報はRWロックの情報となる。ロックを解除する際の処理手順は図16のフローチャートで示したのと同様である。ただしS74の判定は、要求するロックを獲得できるか否かの判定となり、S72で更新する情報はRWロックの情報となる。
このような構成とすることで、RWロックの管理機能とロック獲得待ちスレッドのキューの機能を同時に実現することができる。これらの機能は同じキューに対するアトミック操作で実現できることから、ロックを獲得することのできないスレッドを即座に待機状態としてプロセッサを開放することができる。またロックを獲得できる状態となったら待機状態となっていたスレッドの処理を即座に再開させることができる。これらの処理はノンブロッキングで行われることから、キューへのアクセス、ロックの獲得及び解除、スレッドの待機および処理の再開といった各ステップにおいてスレッドの待ち時間を減らすことができる。
以上、本発明を実施の形態をもとに説明した。上記実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
10 情報処理装置、 12a 処理ユニット、 14 共有メモリ、 16a プロセッサ、 18a ローカルメモリ、 22 キュー、 28 リンクリスト。

Claims (11)

  1. 個々のデータの行列からなるデータ用キューを格納するメモリと、
    生成したデータを前記データ用キューに入れるデータ生成スレッドと、データを前記データ用キューから取り出すデータ消費スレッドと、の少なくともいずれかを処理する1つ以上のプロセッサと、を備え、
    前記プロセッサは、
    前記データ消費スレッドの処理において、前記データ用キューに取り出すべきデータが存在しない場合、当該データ用キューに、前記データ消費スレッドの識別情報を入れ、
    前記データ生成スレッドの処理において、データを前記データ用キューに入れる際、当該データ用キューに前記データ消費スレッドの識別情報が入っていたら、当該データ消費スレッドが取得できるようにデータの格納先を変更することを特徴とする情報処理装置。
  2. 前記プロセッサは、前記データ消費スレッドの処理において前記データ用キューに当該データ消費スレッドの識別情報を入れた後、当該データ消費スレッドの処理を休止することを特徴とする請求項1に記載の情報処理装置。
  3. 前記プロセッサは、前記データ生成スレッドの処理において、前記データ用キューに前記データ消費スレッドの識別情報が入っていたら、休止していた当該データ消費スレッドの処理を再開する状態へと移行させることを特徴とする請求項2に記載の情報処理装置。
  4. 前記プロセッサは、
    前記データ生成スレッドの処理における、データをデータ用キューに入れる操作および、前記データ消費スレッドの処理における、データをデータ用キューから取り出す操作を、あらかじめ定めたアトミック操作の単位で段階的に実施し、当該アトミック操作期間外では、前記データをデータ用キューに入れる操作または前記データをデータ用キューから取り出す操作の途中であっても、別のスレッド処理のためのデータ用キューに対する操作を妨げないことを特徴とする請求項1から3のいずれかに記載の情報処理装置。
  5. 前記プロセッサは、前記別のスレッドの処理において、
    前記アトミック操作期間外であっても当該別のスレッド処理のためのデータ用キューに対する操作を行えない場合、前記データをデータ用キューに入れる操作または前記データをデータ用キューから取り出す操作の途中の状態であると判断し、当該途中の状態に応じて定められた操作を行うことにより、前記データをデータ用キューに入れる操作または前記データをデータ用キューから取り出す操作の少なくとも一部を進捗させることを特徴とする請求項4に記載の情報処理装置。
  6. 前記データ用キューは、各データを、行列における次のデータへのポインタで連結したリンクリストの構造を有し、各ポインタの更新をそれぞれアトミック操作とすることで、前記データをデータ用キューに入れる操作および前記データをデータ用キューから取り出す操作を段階的に実施することを特徴とする請求項4または5に記載の情報処理装置。
  7. 前記メモリは、前記データ用キューに入れるべき所定単位のデータを格納できる、空きの記憶領域の情報を表す空きパケットの行列からなるパケット用キューをさらに格納し、
    前記プロセッサは、
    前記データ生成スレッドの処理において、生成した所定単位のデータを前記データ用キューに入れる前に、前記パケット用キューから空きパケットの取り出しを試み、取り出すべき空きパケットが存在しない場合、当該パケット用キューに、前記データ生成スレッドの識別情報を入れ、
    前記データ消費スレッドの処理において、所定単位のデータを前記データ用キューから取り出した後、不要になった空きパケットを前記パケット用キューに戻す際、当該パケット用キューに前記データ生成スレッドの識別情報が入っていたら、当該データ生成スレッドが取得できるように空きパケットの格納先を変更することを特徴とする請求項1から6のいずれかに記載の情報処理装置。
  8. 前記データ用キューは、各データを、行列における次のデータへのポインタで連結したリンクリストの構造を有し、
    前記データ用キューには、前記取り出すべきデータおよび前記データ消費スレッドの識別情報のいずれも入っていない状態においてダミーのデータが格納され、
    前記リンクリストにおける前記ダミーのデータへのポインタには、ダミーのデータを識別する情報が付加されていることを特徴とする請求項1から5のいずれかに記載の情報処理装置。
  9. 前記データ用キューは、各データを、行列における次のデータへのポインタで連結したリンクリストの構造を有し、
    前記プロセッサは、
    前記データ消費スレッドの処理において、前記データ用キューに前記データ消費スレッドの識別情報を入れた際、前記リンクリストにおける当該識別情報へのポインタに、識別情報が入っていることを示す情報を付加し、
    前記データ生成スレッドの処理において、前記リンクリストのポインタを参照することにより、前記データ用キューに前記データ消費スレッドの識別情報が入っているか否かを判断することを特徴とする請求項1から5のいずれかに記載の情報処理装置。
  10. プロセッサによる第1のスレッドの処理において、メモリに格納されたキューからのデータ取り出しを試みた際、取り出すべきデータが存在しない場合、前記第1のスレッドの識別情報を当該キューに入れるステップと、
    プロセッサによる第2のスレッドの処理において、前記キューへデータを入れる際、当該キューに前記第1のスレッドの識別情報が入っていたら、当該第1のスレッドにデータを渡すステップと、
    を含むことを特徴とする情報処理方法。
  11. 第1のスレッドの処理において、メモリに格納されたキューからのデータ取り出しを試みた際、取り出すべきデータが存在しない場合、前記第1のスレッドの識別情報を当該キューに入れる機能と、
    第2のスレッドの処理において、前記キューへデータを入れる際、当該キューに前記第1のスレッドの識別情報が入っていたら、当該第1のスレッドにデータを渡す機能と、
    をコンピュータに実現させることを特徴とするコンピュータプログラム。
JP2010118718A 2010-05-24 2010-05-24 情報処理装置および情報処理方法 Active JP5553685B2 (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2010118718A JP5553685B2 (ja) 2010-05-24 2010-05-24 情報処理装置および情報処理方法
CN2011800254549A CN102906706A (zh) 2010-05-24 2011-03-23 信息处理装置及信息处理方法
PCT/JP2011/001715 WO2011148553A1 (ja) 2010-05-24 2011-03-23 情報処理装置および情報処理方法
US13/611,561 US9658905B2 (en) 2010-05-24 2012-09-12 Information processing apparatus and method for carrying out multi-thread processing

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010118718A JP5553685B2 (ja) 2010-05-24 2010-05-24 情報処理装置および情報処理方法

Publications (2)

Publication Number Publication Date
JP2011248468A true JP2011248468A (ja) 2011-12-08
JP5553685B2 JP5553685B2 (ja) 2014-07-16

Family

ID=45413682

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010118718A Active JP5553685B2 (ja) 2010-05-24 2010-05-24 情報処理装置および情報処理方法

Country Status (1)

Country Link
JP (1) JP5553685B2 (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2016511904A (ja) * 2013-02-28 2016-04-21 オラクル・インターナショナル・コーポレイション ミドルウェアマシン環境において協働的同時並行性をサポートするためのシステムおよび方法
JP2017504887A (ja) * 2013-12-18 2017-02-09 オラクル・インターナショナル・コーポレイション コンピューティング環境においてアダプティブビジーウェイトをサポートするためのシステムおよび方法
JP2021531553A (ja) * 2018-07-02 2021-11-18 ドライブネッツ リミテッド マルチスレッドアプリケーションを実装するシステム

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS60128537A (ja) * 1983-12-14 1985-07-09 インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション 多重プログラミング・システム
JPH02125339A (ja) * 1988-11-04 1990-05-14 Fujitsu Ltd オペレーティングシステムにおけるプロセス消滅方式
JPH0365732A (ja) * 1989-08-03 1991-03-20 Matsushita Electric Ind Co Ltd 資源管理方法
JPH07191944A (ja) * 1991-09-11 1995-07-28 Internatl Business Mach Corp <Ibm> 多重プロセッサによる多数の資源への命令におけるデッドロックを防止するためのシステムおよび方法
JP2000022724A (ja) * 1998-07-01 2000-01-21 Nec Corp パケットスイッチシステム、これを含む集積回路、パケットスイッチ制御方法、パケットスイッチ制御プログラム記録媒体
JP2001084235A (ja) * 1999-09-10 2001-03-30 Nec Corp ロック粒度統計情報を利用した排他制御方法及びプログラムを記録した機械読み取り可能な記録媒体
JP2001346181A (ja) * 2000-06-01 2001-12-14 Matsushita Electric Ind Co Ltd データ記憶部共有装置およびプログラム記録媒体
JP2008123516A (ja) * 2006-11-13 2008-05-29 Internatl Business Mach Corp <Ibm> ロックフリー同時fifoキュー、キューを実装する方法、装置およびコンピュータ・プログラム

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS60128537A (ja) * 1983-12-14 1985-07-09 インタ−ナショナル ビジネス マシ−ンズ コ−ポレ−ション 多重プログラミング・システム
JPH02125339A (ja) * 1988-11-04 1990-05-14 Fujitsu Ltd オペレーティングシステムにおけるプロセス消滅方式
JPH0365732A (ja) * 1989-08-03 1991-03-20 Matsushita Electric Ind Co Ltd 資源管理方法
JPH07191944A (ja) * 1991-09-11 1995-07-28 Internatl Business Mach Corp <Ibm> 多重プロセッサによる多数の資源への命令におけるデッドロックを防止するためのシステムおよび方法
JP2000022724A (ja) * 1998-07-01 2000-01-21 Nec Corp パケットスイッチシステム、これを含む集積回路、パケットスイッチ制御方法、パケットスイッチ制御プログラム記録媒体
JP2001084235A (ja) * 1999-09-10 2001-03-30 Nec Corp ロック粒度統計情報を利用した排他制御方法及びプログラムを記録した機械読み取り可能な記録媒体
JP2001346181A (ja) * 2000-06-01 2001-12-14 Matsushita Electric Ind Co Ltd データ記憶部共有装置およびプログラム記録媒体
JP2008123516A (ja) * 2006-11-13 2008-05-29 Internatl Business Mach Corp <Ibm> ロックフリー同時fifoキュー、キューを実装する方法、装置およびコンピュータ・プログラム

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
CSND200301328012; 服部隆志: 'Javaの歩き方 第5回 スレッドプログラミングに挑戦する' JAVA PRESS 第21巻, 20011210, pp.126-135, (株)技術評論社 *
CSNG199901741003; 三栄武、高橋直久: '適応型ロックを用いた並行プロセスのコスケジューリング機構の実現法' 情報処理学会研究報告 第91巻,第107号, 19911206, pp.1-8, 社団法人情報処理学会 *
JPN6011020287; 服部隆志: 'Javaの歩き方 第5回 スレッドプログラミングに挑戦する' JAVA PRESS 第21巻, 20011210, pp.126-135, (株)技術評論社 *
JPN6011020288; 三栄武、高橋直久: '適応型ロックを用いた並行プロセスのコスケジューリング機構の実現法' 情報処理学会研究報告 第91巻,第107号, 19911206, pp.1-8, 社団法人情報処理学会 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2016511904A (ja) * 2013-02-28 2016-04-21 オラクル・インターナショナル・コーポレイション ミドルウェアマシン環境において協働的同時並行性をサポートするためのシステムおよび方法
JP2017504887A (ja) * 2013-12-18 2017-02-09 オラクル・インターナショナル・コーポレイション コンピューティング環境においてアダプティブビジーウェイトをサポートするためのシステムおよび方法
JP2021531553A (ja) * 2018-07-02 2021-11-18 ドライブネッツ リミテッド マルチスレッドアプリケーションを実装するシステム
JP7301892B2 (ja) 2018-07-02 2023-07-03 ドライブネッツ リミテッド マルチスレッドアプリケーションを実装するシステム

Also Published As

Publication number Publication date
JP5553685B2 (ja) 2014-07-16

Similar Documents

Publication Publication Date Title
WO2011148553A1 (ja) 情報処理装置および情報処理方法
US4604694A (en) Shared and exclusive access control
US9430388B2 (en) Scheduler, multi-core processor system, and scheduling method
US8949549B2 (en) Management of ownership control and data movement in shared-memory systems
US6668291B1 (en) Non-blocking concurrent queues with direct node access by threads
US9268698B1 (en) Method and system for maintaining context event logs without locking in virtual machine
CA2706737C (en) A multi-reader, multi-writer lock-free ring buffer
US10380058B2 (en) Processor core to coprocessor interface with FIFO semantics
KR101150661B1 (ko) 정보 처리 장치 및 메모리 영역 관리 방법
CN101208671A (zh) 管理消息队列
US10331500B2 (en) Managing fairness for lock and unlock operations using operation prioritization
US8930596B2 (en) Concurrent array-based queue
US10445096B2 (en) Managing lock and unlock operations using traffic prioritization
CN113157467A (zh) 一种多进程数据输出方法
JP5553685B2 (ja) 情報処理装置および情報処理方法
JP5818824B2 (ja) デュアル・モード・リーダ・ライタ・ロック
CN108958903B (zh) 嵌入式多核中央处理器任务调度方法与装置
JP2011248469A (ja) 情報処理装置および情報処理方法
JP7346649B2 (ja) 同期制御システムおよび同期制御方法
CN115951844A (zh) 分布式文件系统的文件锁管理方法、设备及介质
US6915516B1 (en) Apparatus and method for process dispatching between individual processors of a multi-processor system
US11860785B2 (en) Method and system for efficient communication and command system for deferred operation
WO2024217332A1 (zh) 任务窃取方法、装置、芯片及计算机设备
CN118260051A (zh) 线程访问控制设备、方法与计算设备
JPH0346033A (ja) ジヨブ間データ転送制御方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130522

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20131112

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140114

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20140513

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140527

R150 Certificate of patent or registration of utility model

Ref document number: 5553685

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250