特許第6859755号(P6859755)IP Force 特許公報掲載プロジェクト 2015.5.11 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧
特許6859755情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム
<>
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000002
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000003
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000004
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000005
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000006
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000007
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000008
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000009
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000010
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000011
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000012
  • 特許6859755-情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム 図000013
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6859755
(24)【登録日】2021年3月30日
(45)【発行日】2021年4月14日
(54)【発明の名称】情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム
(51)【国際特許分類】
   G06F 9/50 20060101AFI20210405BHJP
   G06F 9/48 20060101ALI20210405BHJP
   G06F 12/02 20060101ALI20210405BHJP
【FI】
   G06F9/50 120A
   G06F9/48 350Z
   G06F12/02 540
【請求項の数】9
【全頁数】26
(21)【出願番号】特願2017-39090(P2017-39090)
(22)【出願日】2017年3月2日
(65)【公開番号】特開2018-147068(P2018-147068A)
(43)【公開日】2018年9月20日
【審査請求日】2019年11月12日
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(72)【発明者】
【氏名】前田 宗則
【審査官】 井上 宏一
(56)【参考文献】
【文献】 特表2016−503934(JP,A)
【文献】 特開2011−242896(JP,A)
【文献】 特開2002− 57712(JP,A)
【文献】 特開2010−182016(JP,A)
【文献】 特開2008− 3770(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/455−9/54
G06F 12/02
(57)【特許請求の範囲】
【請求項1】
スレッドを実行する実行部と、
前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、
前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部と、
前記実行部が実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避する退避処理部と、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する情報受け渡し部と
を有することを特徴とする情報処理装置。
【請求項2】
請求項1に記載の情報処理装置において、
前記退避処理部は、スレッドの処理が終了してから所定の時間が経過するまでに前記スレッド情報が使用されていないスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
【請求項3】
請求項1または請求項2に記載の情報処理装置において、
前記退避処理部は、スレッド内で最初に実行される関数の種類に基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
【請求項4】
請求項1ないし請求項3のいずれか1項に記載の情報処理装置において、
前記退避処理部は、スレッドの生成を指示する命令の格納先を示すアドレスに基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
【請求項5】
請求項1ないし請求項4のいずれか1項に記載の情報処理装置において、
前記退避処理部は、スレッドの属性にスレッドの処理の終了後に前記スレッド情報が退避される属性を含むスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
【請求項6】
請求項1ないし請求項5のいずれか1項に記載の情報処理装置において、
新規のスレッドの生成を指示する命令に基づいて、前記新規のスレッドの前記スレッド情報を記憶する空き領域が前記第1記憶部に有るかを判定し、前記第1記憶部に前記空き領域が有る場合、前記空き領域を前記新規のスレッドのスレッド情報に割り当てる割り当て部をさらに有する
ことを特徴とする情報処理装置。
【請求項7】
請求項6に記載の情報処理装置において、
前記割り当て部は、前記新規のスレッドが生成される度に、スレッドを識別するための識別情報を、前記第1記憶部に記憶される前記スレッド情報を識別するためのインデックスと、前記第1記憶部に記憶される前記スレッド情報と前記第2記憶部に退避される前記スレッド情報とを判別するための判別情報とを用いて生成し、生成した前記識別情報を前記実行部に通知する
ことを特徴とする情報処理装置。
【請求項8】
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部とを含む情報処理装置の制御方法において、
前記情報処理装置が、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避し、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する
ことを特徴とする情報処理装置の制御方法。
【請求項9】
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部とを含む情報処理装置の制御プログラムにおいて、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避し、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する
処理を前記情報処理装置に実行させるための制御プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラムに関する。
【背景技術】
【0002】
メモリ等の記憶装置を使用して演算等の処理を実行する情報処理装置は、アプリケーションプログラム等を実行する場合、処理の実行に必要なメモリ領域を記憶装置に確保する。そして、処理の終了等により不要になったメモリ領域は、解放される。なお、不要なメモリ領域を解放せずに確保し続けるメモリリークが発生した場合、不要なメモリ領域が記憶装置に確保され続けるため、メモリ領域の利用効率が低下する。また、メモリリークが頻繁に発生すると、使用可能なメモリ領域が減少し、処理の実行に必要なメモリ領域を確保できなくなる場合がある。この場合、アプリケーションプログラムは異常終了する。あるいは、アプリケーションプログラムを含むシステム全体が異常終了するおそれがある。
【0003】
このため、メモリリークの発生を抑止する方法が提案されている。例えば、複数のスレッドを用いて並列処理を情報処理装置に実行させるマルチスレッドプログラムを生成するプログラム生成装置において、メモリリークの発生を抑止するプログラム生成方法が提案されている(例えば、特許文献1参照)。この種のプログラム生成装置は、マルチスレッドプログラムを記述するコードのうち、メモリ領域を動的に確保するスレッドを記述するコードを解析する。そして、プログラム生成装置は、スレッドが終了する前にメモリ領域を解放していない場合、未解放のメモリ領域を強制的に解放してからスレッドを終了する動作を実行するようにプログラムを修正する。なお、確保したメモリ領域が親プロセスまたは他のスレッド等に使用される可能性があるスレッドを記述するコードは、解析の範囲から除外される。
【0004】
また、プロセスが必要とするメモリ領域を誤って解放することなく、不要なメモリ領域を解放するメモリ管理システムが提案されている(例えば、特許文献2参照)。この種のメモリ管理システムは、例えば、プロセスが確保したメモリ領域の最大生存時間を管理し、メモリ領域を確保してから最大生存時間を過ぎても解放されていないメモリ領域を解放する。
【0005】
また、プログラムを実行することにより生成されたオブジェクトに対するアクセス情報に基づいて、メモリリークの可能性の高いリークオブジェクトを抽出するメモリ管理方法が提案されている(例えば、特許文献3参照)。この種のメモリ管理方法では、アクセス情報に基づいて抽出したリークオブジェクトを主記憶部から補助記憶部に移動する。なお、プログラムを実行するプロセッサは、補助記憶部に格納されたオブジェクトがアクセスされた場合には、アクセスされたオブジェクトを主記憶部に移動させる。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2014−130401号公報
【特許文献2】特開2002−108698号公報
【特許文献3】特開2009−26081号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
先行するスレッドの返り値等のデータが後続のスレッドで使用される場合がある。先行するスレッドの返り値等のデータは、先行するスレッドの実行のために確保したメモリ領域に格納される。このため、先行するスレッドが終了しても後続のスレッドがデータを使用することに備えてメモリ領域を解放しない情報処理装置では、メモリリークが発生するおそれがある。
【0008】
1つの側面では、本発明は、メモリリークの発生を抑止することを目的とする。
【課題を解決するための手段】
【0009】
1つの実施態様では、情報処理装置は、実行部、第1記憶部、第2記憶部、退避処理部および情報受け渡し部を有する。実行部は、スレッドを実行する。第1記憶部は、スレッドの実行に使用されうるスレッド情報を記憶する。第2記憶部は、第1記憶部から退避されるスレッド情報を記憶する。退避処理部は、実行部が実行するスレッドのうち、スレッド情報を退避する退避対象のスレッドの実行の終了後に、退避対象のスレッドのスレッド情報を第1記憶部から第2記憶部に退避する。情報受け渡し部は、実行中のスレッドが第2記憶部に退避されたスレッド情報を使用する場合、実行中のスレッドにより使用されるスレッド情報を第2記憶部から実行部に転送する。
【発明の効果】
【0010】
1つの側面では、本発明は、メモリリークの発生を抑止することができる。
【図面の簡単な説明】
【0011】
図1】情報処理装置の一実施形態を示す図である。
図2図1に示した情報処理装置の動作の一例を示す図である。
図3】情報処理装置の別の実施形態を示す図である。
図4図3に示した管理構造体の配列、スタックの配列および世代番号の配列の関係の一例を示す図である。
図5】循環リストの一例を示す図である。
図6図3に示した情報処理装置の動作の概要を示す図である。
図7】新規のスレッドを生成する場合の情報処理装置の動作の一例を示す図である。
図8】スレッドが終了する場合の情報処理装置の動作の一例を示す図である。
図9】スレッドの資源を退避する場合の情報処理装置の動作の一例を示す図である。
図10図9に示した退避処理の一例を示す図である。
図11】他のスレッドの返り値を使用する場合の情報処理装置の動作の一例を示す図である。
図12】情報処理装置の制御プログラムを実行するハードウェアの一例を示す図である。
【発明を実施するための形態】
【0012】
以下、実施形態について、図面を用いて説明する。
【0013】
図1は、情報処理装置の一実施形態を示す。図1に示す情報処理装置10は、サーバ等のコンピュータ装置等であり、スレッドの生成等の機能を提供するスレッドライブラリを使用して記述されたプログラムを実行する。例えば、情報処理装置10は、実行部20と、退避処理部22と、情報受け渡し部24と、スレッド情報SINFを記憶する第1記憶部30と、第1記憶部30から退避されるスレッド情報SINFを記憶する第2記憶部40とを有する。なお、スレッド情報SINFは、スレッドの実行に使用される情報である。例えば、スレッド情報SINFは、スレッドの返り値等である。実行部20、退避処理部22および情報受け渡し部24の各機能は、例えば、情報処理装置10が制御プログラム等のソフトウェアを実行することにより実現される。すなわち、実行部20、退避処理部22および情報受け渡し部24は、ハードウェアをソフトウェアで制御することにより実現される。なお、実行部20、退避処理部22および情報受け渡し部24は、ハードウェアのみで実現されてもよい。また、例えば、第1記憶部30は、DRAM(Dynamic Random Access Memory)等の半導体記憶装置であり、第2記憶部40は、ハードディスク装置、SSD(Solid State Drive)等である。
【0014】
実行部20は、プログラムに基づいて、スレッドを実行する。そして、実行部20は、スレッドの処理が終了した場合、第1記憶部30の記憶領域のうち、スレッドに対応して割り当てられた記憶領域に、スレッドの返り値等を格納する。例えば、情報処理装置10は、実行部20が新規のスレッドの実行を開始する前に、新規のスレッドのスレッド情報SINFを記憶する記憶領域を第1記憶部30に確保する。
【0015】
また、実行部20は、実行中のスレッドが他のスレッドの返り値等のスレッド情報SINFを使用する場合、他のスレッドに割り当てられた記憶領域に格納されたスレッド情報SINFを、第1記憶部30から取得してスレッドの実行を継続する。なお、他のスレッドの処理が終了していない場合、実行部20は、他のスレッドのスレッド情報SINFの取得を他のスレッドの処理が終了するまで待機する。他のスレッドに割り当てられた記憶領域は、スレッド情報SINFが後続のスレッドに受け渡された場合、解放される。解放された記憶領域は、新規のスレッドに割り当て可能である。
【0016】
退避処理部22は、例えば、スレッドの処理が終了してから所定の時間が経過しても解放されずに第1記憶部30に確保されている記憶領域を特定し、特定した記憶領域に割り当てられたスレッドを退避対象のスレッドに決定する。すなわち、退避処理部22は、スレッドの処理が終了してから所定の時間が経過するまでにスレッド情報SINFが使用されていないスレッドを、退避対象のスレッドに決定する。
【0017】
そして、退避処理部22は、退避対象のスレッドのスレッド情報SINFを第1記憶部30から第2記憶部40に移動する。これにより、退避対象のスレッドに割り当てられた記憶領域は、解放され、新規のスレッドに割り当て可能になる。この結果、不要な記憶領域を解放せずに第1記憶部30に確保し続けるメモリリークの発生を抑止することができる。
【0018】
なお、退避処理部22は、スレッド内で最初に実行される関数の先頭の命令の格納先を示すアドレスに基づいて退避対象のスレッドを決定してもよい。例えば、退避処理部22は、予め指定された命令の格納先アドレスから始まる関数が最初に実行されるスレッドを、退避対象のスレッドに決定してもよい。あるいは、退避処理部22は、スレッドの生成を指示する命令の格納先を示すアドレスに基づいて退避対象のスレッドを決定してもよい。例えば、情報処理装置10を使用してプログラム等のソフトウェアを開発するユーザは、デバッグの対象となるスレッドの生成を指示する命令の格納先を示すアドレスを予め指定する。この場合、退避処理部22は、デバッグの対象となるスレッドを退避対象のスレッドとして選択できる。また、退避処理部22は、スレッドの属性にスレッドの処理の終了後にスレッド情報SINFが退避される属性を含むスレッドを、退避対象のスレッドに決定してもよい。
【0019】
退避処理部22は、スレッドの処理が終了する前に退避対象のスレッドを特定した場合、退避対象のスレッドが終了した後、所定の時間を待たずに、退避対象のスレッドのスレッド情報SINFを第1記憶部30から第2記憶部40に退避してもよい。このように、退避処理部22は、実行部20が実行するスレッドのうち、スレッド情報SINFを退避する退避対象のスレッドのスレッド情報SINFを、退避対象のスレッドの終了後に第1記憶部30から第2記憶部40に退避する。
【0020】
なお、実行部20は、実行中のスレッドが使用する他のスレッドのスレッド情報SINFが第2記憶部40に既に退避されている場合、情報受け渡し部24にスレッド情報SINFの取得を要求して、スレッド情報SINFを第2記憶部40から受ける。
【0021】
情報受け渡し部24は、スレッド情報SINFの取得の要求を実行部20から受け付けた場合、要求されたスレッド情報SINFを第2記憶部40から実行部20に転送する。すなわち、情報受け渡し部24は、実行中のスレッドが第2記憶部40に退避されたスレッド情報SINFを使用する場合、実行中のスレッドにより使用されるスレッド情報SINFを第2記憶部40から実行部20に転送する。このように、第1記憶部30から第2記憶部40に退避されたスレッド情報SINFが後続のスレッドで使用される場合でも、後続のスレッドにスレッド情報SINFを受け渡すことができる。この結果、後続のスレッドがスレッド情報SINFを使用できずに異常終了することを防止することができる。
【0022】
第2記憶部40は、実行部20に転送したスレッド情報SINFを格納していた記憶領域を解放する。なお、第2記憶部40は、例えば、デバッグの対象となるスレッドが退避対象のスレッドとして選択された場合等では、実行部20に転送したスレッド情報SINFを格納していた記憶領域を解放せずに確保し続けてもよい。例えば、第2記憶部40から実行部20に転送したスレッド情報SINFを格納していた記憶領域を解放しない場合、ユーザがプログラム解析等を実行する際に、スレッドの終了後に第2記憶部40に退避されたスレッド情報SINFにアクセスすることができる。
【0023】
なお、情報処理装置10の構成は、図1に示す例に限定されない。例えば、第1記憶部30および第2記憶部40は、同一の半導体記憶装置の異なる記憶領域にそれぞれ割り当てられてもよい。この場合、退避処理部22は、退避対象のスレッドのスレッド情報SINFを、圧縮等によりデータサイズを縮小してから、第2記憶部40に移動してもよい。
【0024】
図2は、図1に示した情報処理装置10の動作の一例を示す。なお、図2に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図2に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。すなわち、制御プログラムで制御される情報処理装置が図2に示す動作を実行してもよい。なお、図2に示す動作は、1つのスレッド(以下、処理対象のスレッドとも称する)に着目した場合の情報処理装置10の動作である。情報処理装置10は、複数のスレッドを並列に実行可能である。したがって、情報処理装置10は、図2に示す動作を並列に実行可能である。例えば、情報処理装置10は、スレッドを生成する関数を呼び出す度に、図2に示す動作を実行する。
【0025】
ステップS100では、情報処理装置10は、処理対象のスレッドのスレッド情報SINFを記憶するための記憶領域を、第1記憶部30に確保する。
【0026】
次に、ステップS110では、情報処理装置10の実行部20は、処理対象のスレッドの実行を開始する。
【0027】
次に、ステップS120では、実行部20は、処理対象のスレッドが他のスレッドのスレッド情報SINFを使用するか否かを判定する。処理対象のスレッドが他のスレッドのスレッド情報SINFを使用する場合、実行部20の動作は、ステップS130に移る。一方、処理対象のスレッドが他のスレッドのスレッド情報SINFを使用しない場合、実行部20の動作は、ステップS150に移る。
【0028】
ステップS130では、実行部20は、他のスレッドが終了したか否かを判定する。他のスレッドが終了した場合、実行部20の動作は、ステップS140に移る。一方、他のスレッドが終了していない場合、実行部20の動作は、ステップS130に戻る。すなわち、実行部20は、他のスレッドが終了していない場合、他のスレッドが終了するまで、処理対象のスレッドの処理を待機する。
【0029】
ステップS140では、実行部20は、他のスレッドのスレッド情報SINFを取得する。例えば、実行部20は、他のスレッドのスレッド情報SINFが第1記憶部30に格納されている場合、他のスレッドのスレッド情報SINFを第1記憶部30から取得して、他のスレッドに割り当てられた記憶領域を解放する。
【0030】
また、実行部20は、他のスレッドのスレッド情報SINFが第2記憶部40に退避されている場合、他のスレッドのスレッド情報SINFの取得を、情報処理装置10の情報受け渡し部24に要求する。そして、情報受け渡し部24は、実行部20から要求されたスレッド情報SINFを、第2記憶部40から検索して実行部20に転送する。これにより、実行部20は、他のスレッドのスレッド情報SINFを第2記憶部40から取得する。ステップS140の処理が実行された後、実行部20の動作は、ステップS150に移る。
【0031】
ステップS150では、実行部20は、処理対象のスレッドが終了したか否かを判定する。処理対象のスレッドが終了した場合、情報処理装置10の動作は、ステップS160に移る。一方、処理対象のスレッドが終了していない場合、情報処理装置10の動作は、ステップS120に戻る。
【0032】
ステップS160では、情報処理装置10の退避処理部22は、処理対象のスレッドが退避対象のスレッドか否かを判定する。例えば、退避処理部22は、処理対象のスレッドが終了してから所定の時間が経過しても、処理対象のスレッドのスレッド情報SINFが後続のスレッドに使用されない場合、処理対象のスレッドを退避対象のスレッドと判定する。この場合、退避処理部22は、処理対象のスレッドを退避対象のスレッドとして選択する。換言すれば、処理対象のスレッドは、処理が終了してから所定の時間が経過するまでにスレッド情報SINFが後続のスレッドに使用される場合、退避対象のスレッドとして選択されない。
【0033】
処理対象のスレッドが退避対象のスレッドの場合、情報処理装置10の動作は、ステップS170に移る。一方、処理対象のスレッドが退避対象のスレッドでない場合、処理対象のスレッドに対する情報処理装置10の動作は、終了する。
【0034】
ステップS170では、退避処理部22は、処理対象のスレッドのスレッド情報SINF、すなわち、退避対象のスレッドのスレッド情報SINFを、第1記憶部30から第2記憶部40に退避する。これにより、処理対象のスレッドに割り当てられた第1記憶部30内の記憶領域を解放することができ、メモリリークの発生を抑止することができる。ステップS170の処理の終了により、処理対象のスレッドに対する情報処理装置10の動作は、終了する。
【0035】
なお、情報処理装置10の動作は、図2に示す例に限定されない。例えば、退避処理部22は、処理対象のスレッドが退避対象のスレッドか否かを、処理対象のスレッド内で最初に実行される関数の種類に基づいて判定してもよいし、処理対象のスレッドの生成を指示する命令の格納先を示すアドレスに基づいて判定してもよい。あるいは、退避処理部22は、処理対象のスレッドが退避対象のスレッドか否かを、処理対象のスレッドの属性等に基づいて判定してもよい。
【0036】
以上、図1および図2に示す実施形態では、情報処理装置10は、スレッドの実行に使用するスレッド情報SINFを記憶する第1記憶部30と第1記憶部30から退避されるスレッド情報SINFを記憶する第2記憶部40とを有する。さらに、情報処理装置10は、スレッドを実行する実行部20と、退避処理部22と、情報受け渡し部24とを有する。退避処理部22は、実行部20が実行するスレッドのうち、スレッド情報SINFを退避する退避対象のスレッドのスレッド情報SINFを、退避対象のスレッドの終了後に第1記憶部30から第2記憶部40に退避する。これにより、退避対象のスレッドに割り当てられた第1記憶部30内の記憶領域を解放することができ、メモリリークの発生を抑止することができる。
【0037】
また、情報受け渡し部24は、実行中のスレッドが第2記憶部40に退避されたスレッド情報SINFを使用する場合、実行中のスレッドにより使用されるスレッド情報SINFを第2記憶部40から実行部20に転送する。これにより、第1記憶部30から第2記憶部40に退避されたスレッド情報SINFが後続のスレッドで使用される場合でも、後続のスレッドにスレッド情報SINFを受け渡すことができる。この結果、後続のスレッドがスレッド情報SINFを使用できずに異常終了することを防止することができる。
【0038】
図3は、情報処理装置の別の実施形態を示す。図1で説明した要素と同一または同様の要素については、同一または同様の符号を付し、これ等については、詳細な説明を省略する。図3に示す情報処理装置100は、サーバ等のコンピュータ装置等であり、スレッドの生成等の機能を提供するスレッドライブラリを使用して記述されたプログラムを実行する。図3以降では、POSIX(Portable Operating System Interface)スレッドを情報処理装置100が実行する場合を例にして説明するが、情報処理装置100が実行するスレッドはPOSIXスレッドに限定されない。以下、POSIXスレッドは、pthreadとも称される。例えば、情報処理装置100は、pthreadライブラリを使用して記述されたプログラムを実行する。
【0039】
情報処理装置100は、実行部200、退避処理部220、情報受け渡し部240、割り当て部260、警告部280、第1記憶部300および第2記憶部400を有する。実行部200、退避処理部220、情報受け渡し部240、割り当て部260および警告部280の各機能は、例えば、情報処理装置100が制御プログラム等のソフトウェアを実行することにより実現される。すなわち、実行部200、退避処理部220、情報受け渡し部240、割り当て部260および警告部280は、ハードウェアをソフトウェアで制御することにより実現される。なお、実行部200、退避処理部220、情報受け渡し部240、割り当て部260および警告部280は、ハードウェアのみで実現されてもよい。また、例えば、第1記憶部300は、DRAM等の半導体記憶装置であり、第2記憶部400は、ハードディスク装置、SSD等である。
【0040】
実行部200、退避処理部220および情報受け渡し部240は、図1に示した実行部20、退避処理部22および情報受け渡し部24と同一または同様である。このため、図3では、割り当て部260および警告部280の動作を中心に説明する。割り当て部260および警告部280の動作を説明する前に、第1記憶部300に記憶される情報について説明する。
【0041】
第1記憶部300は、例えば、管理構造体の配列TDA、スタックの配列TSA、世代番号の配列TGA、未割り当てキューFIDXQおよび循環リストCLSTを記憶する。管理構造体の配列TDA、スタックの配列TSAおよび世代番号の配列TGAのインデックスとして、例えば、スレッドのインデックスが使用される。なお、スレッドのインデックスは、第1記憶部に記憶されるスレッド情報SINFを識別するためのインデックスの一例である。
【0042】
管理構造体の配列TDAには、スレッドのコンテキストおよびスレッドの返り値等の情報が格納され、スタックの配列TSAには、スレッド内で使用するデータ等の情報が格納される。なお、管理構造体の配列TDAに格納される情報およびスタックの配列TSAに格納される情報は、スレッドの実行に使用するスレッド情報SINFの一例である。
【0043】
世代番号の配列TGAには、インデックスが互いに同じスレッドを判別するための世代番号が格納される。なお、世代番号は、第1記憶部300に記憶されるスレッド情報SINFと第2記憶部400に退避されるスレッド情報SINFとを判別するための判別情報の一例である。
【0044】
未割り当てキューFIDXQには、配列TDA、TSAのインデックスのうち、未割り当てのインデックスが格納される。未割り当てのインデックスは、スレッドに割り当てられていない配列TDA、TSAの要素を示すインデックス、すなわち、使用可能なスレッドのインデックスである。未割り当てキューFIDXQには、未割り当てのインデックスが重複なく、かつ、漏れなく並ぶ。循環リストCLSTは、退避対象のスレッドを決定する際に使用される。循環リストCLSTの詳細は、図5で説明する。
【0045】
情報処理装置100では、例えば、実行部200が新規のスレッドの実行を開始する前に、割り当て部260がスレッドの資源を新規のスレッドに割り当てる。スレッドの資源は、例えば、管理構造体の配列TDAおよびスタックの配列TSAを記憶する記憶領域である。
【0046】
例えば、実行部200は、新規のスレッドの生成を指示する命令に基づいて、スレッドを生成する関数であるpthread_createをpthreadライブラリから呼び出す。そして、実行部200は、スレッド情報SINFを記憶する記憶領域等の資源の割り当てを割り当て部260に要求する。
【0047】
割り当て部260は、pthread_createが呼び出される度に、新規のスレッドのスレッド情報SINFを記憶する空き領域が第1記憶部300に有るか否かを判定する。例えば、割り当て部260は、使用可能なスレッドのインデックスが未割り当てキューFIDXQに格納されている場合、第1記憶部300に空き領域が有ると判定する。このように、割り当て部260は、新規のスレッドの生成を指示する命令に基づいて、新規のスレッドのスレッド情報SINFを記憶する空き領域が第1記憶部300に有るかを判定する。そして、割り当て部260は、第1記憶部300に空き領域が有る場合、空き領域を新規のスレッドに割り当てる。
【0048】
例えば、割り当て部260は、使用可能なスレッドのインデックスが未割り当てキューFIDXQに格納されている場合、使用可能なスレッドのインデックスを未割り当てキューFIDXQから取得する。そして、割り当て部260は、配列TDA、TSAの要素のうち、未割り当てキューFIDXQから取得したインデックスで示される要素(空き領域)を、新規のスレッドに割り当てる。
【0049】
また、割り当て部260は、新規のスレッドが生成される度に、スレッドを識別するための識別情報TIDをスレッドのインデックスと世代番号とを用いて生成し、生成した識別情報TIDを実行部200に通知する。なお、識別情報TIDは、pthreadにおいて、スレッドIDと呼ばれる情報である。以下、スレッドIDは、単に、TIDとも称される。
【0050】
このように、新規のスレッドへの資源の割り当てが成功した場合、実行部200は、新規のスレッドのTIDを割り当て部260から受ける。そして、実行部200は、割り当て部260から受けた新規のスレッドのTIDをpthread_createの引数で指定される領域に格納する。なお、割り当て部260が、新規のスレッドのTIDをpthread_createの引数で指定される領域に格納してもよい。
【0051】
また、実行部200は、図示しないスケジューラおよび実行待ちキューを有し、実行待ちキューに格納されたインデックスのスレッドを順次実行する。例えば、実行部200が有するスケジューラは、割り当て部260から受ける新規のスレッドのインデックスを、実行待ちキューに格納する。なお、実行部200は、割り当て部260から受ける新規のスレッドのTIDからスレッドのインデックスを抽出し、抽出した新規のスレッドのインデックスをスケジューラに通知して実行待ちキューに格納してもよい。
【0052】
なお、使用可能なスレッドのインデックスが未割り当てキューFIDXQに格納されていない場合、新規のスレッドへの資源の割り当てが失敗するため、新規のスレッドは、実行されない。
【0053】
ここで、POSIXスレッド(pthread)では、スレッドの終了後にスレッドの返り値を他の1つのスレッドに渡すことができる合流可能状態と、スレッドの終了後にスレッドの返り値をどのスレッドにも渡さないデタッチ状態との2つの状態がある。スレッドの実行中では、合流可能状態とデタッチ状態との2つの状態は、一方から他方へ状態をいつでも変更可能である。
【0054】
例えば、合流可能状態のスレッドでは、合流待ちのスレッドが存在する場合、合流可能状態のスレッドの処理の終了に伴い、返り値が合流待ちのスレッドに渡され、スレッド情報SINFを記憶する記憶領域等のスレッドの資源が解放される。なお、合流待ちのスレッドが存在しない場合、合流可能状態で終了したスレッドの返り値等を含むスレッド情報SINFは、他のスレッドに使用されるまで、あるいは、所定の時間が経過するまで、第1記憶部300に記憶された配列TDA、TSAに格納される。また、デタッチ状態のスレッドでは、返り値等を含むスレッド情報SINFを他のスレッドに渡さないため、デタッチ状態のスレッドの処理の終了に伴い、スレッド情報SINFを記憶する記憶領域等のスレッドの資源が解放される。
【0055】
退避処理部220は、合流可能状態で終了したスレッドのうち、合流待ちのスレッドが存在しないスレッドのTIDを、循環リストCLSTに格納する。また、退避処理部220は、スレッドの処理が終了してから所定の時間が経過するまでにスレッド情報SINFが使用されていないスレッドのTIDを循環リストCLSTに格納されたTIDから選択し、選択したTIDのスレッドを退避対象のスレッドに決定する。そして、退避処理部220は、退避対象のスレッドのスレッド情報SINFを第1記憶部300から第2記憶部400に退避する。
【0056】
第1記憶部300から退避される複数のスレッド情報SINFを含むデータ(以下、スレッド情報SINFのデータリストとも称する)は、例えば、B+木等のデータ構造を有し、第2記憶部400に格納される。なお、以下では、スレッド情報SINFのデータリストのデータ構造をB+木を例にして情報処理装置100の動作を説明するが、スレッド情報SINFのデータリストのデータ構造は、B+木に限定されない。
【0057】
情報受け渡し部240は、実行中のスレッドが第2記憶部400に退避された他のスレッドのスレッド情報SINFを使用する場合、他のスレッドのTIDをキーとしてB+木を検索する。そして、情報受け渡し部240は、B+木の検索結果に基づいて、他のスレッドのスレッド情報SINFを第2記憶部400から実行部200に転送する。
【0058】
警告部280は、退避対象のスレッドのスレッド情報SINFが第1記憶部300から第2記憶部400に退避された場合、退避対象のスレッドによりメモリリークが発生する可能性があることを図示しないコンソール等に表示し、ユーザに警告する。
【0059】
なお、情報処理装置100の構成は、図3に示す例に限定されない。例えば、第1記憶部300および第2記憶部400は、同一の半導体記憶装置の異なる記憶領域にそれぞれ割り当てられてもよい。この場合、退避処理部220は、退避対象のスレッドのスレッド情報SINFを、圧縮等によりデータサイズを縮小してから、第2記憶部400に移動してもよい。また、例えば、世代番号の配列TGA、未割り当てキューFIDXQおよび循環リストCLSTは、第1記憶部300とは別の記憶部に記憶されてもよい。
【0060】
また、退避処理部220は、退避対象のスレッドを、循環リストCLSTを用いずに決定してもよい。例えば、退避処理部220は、合流可能状態で終了したスレッドのうち、合流待ちのスレッドが存在しないスレッドのTIDに終了時刻(タイムスタンプ)を付けて、時刻をキーとする赤黒木に登録してもよい。そして、退避処理部220は、現在時刻より所定の時間以上前の時刻を示すタイムスタンプを有するTIDを、予め設定された時刻の刻み幅毎に全て検出し、検出したTIDのスレッドを退避対象のスレッドに決定してもよい。
【0061】
図4は、図3に示した管理構造体の配列TDA、スタックの配列TSAおよび世代番号の配列TGAの関係の一例を示す。図4に示す例では、各配列TDA、TSA、TGAの要素数は、(N+1)個である。なお、各配列TDA、TSA、TGAの要素数は、固定されてもよいし、可変に設定されてもよい。
【0062】
管理構造体の配列TDA、スタックの配列TSAおよび世代番号の配列TGAは、第1記憶部300の記憶領域を示すアドレス上で互いに分離して配置される。このため、各配列TDA、TSA、TGAの要素は、インデックスにより、互いに対応付けされる。例えば、図4の破線に囲まれたインデックスが“2”の配列TDA[2]、TSA[2]、TGA[2]は、インデックスが“2”のスレッドに割り当てられる要素である。図4に示す例では、インデックスが“2”の現在使用中のスレッドの世代番号は、“5”である。なお、例えば、インデックスが“2”で世代番号が“4”以下のスレッドは、スレッド情報SINFが第1記憶部300から第2記憶部400に退避されたスレッドである。
【0063】
図5は、循環リストCLSTの一例を示す。猶予時間Δは、スレッドの処理が終了してからスレッド情報SINFを第2記憶部400に退避するまでの猶予時間であり、所定の時間の一例である。時刻幅εは、循環リストCLSTの格納先ポインタiを更新する際の時刻の刻み幅である。この場合、循環リストCLSTのバッファサイズは、“Δ/ε”で表される。すなわち、循環リストCLSTは、“Δ/ε”個の要素を有する。格納先ポインタiは、例えば、図9に示す動作で更新される大域変数である。例えば、循環リストCLSTでは、格納先ポインタiで指定される要素にTIDが新規に格納される。循環リストCLSTの各要素に格納される複数のTID(以下、TIDのリストとも称する)は、双方向リンクリストで繋がる。例えば、格納先ポインタiを1つ進めたインデックス(=i+1)で指定される要素に格納されたTIDのリストで指定される全てのスレッドのスレッド情報SINFは、時刻幅ε毎に、第1記憶部300から第2記憶部400に退避される。
【0064】
図6は、図3に示した情報処理装置100の動作の概要を示す。図6に示す例では、情報処理装置100は、TIDが“tid1”のスレッド1とTIDが“tid3”のスレッド3とを並列に実行する。そして、情報処理装置100は、実行中のスレッド1において、pthread_create(&tid2)を実行し、新規のスレッド2を生成する(図6(a))。これにより、新規のスレッド2のTIDとして、“tid2”が割り当てられ、第1記憶部300に記憶される配列TDA[tid2]、TSA[tid2]等の資源がスレッド2に割り当てられる。そして、情報処理装置100は、スレッド1、スレッド2およびスレッド3を並列に実行する。また、情報処理装置100は、新規のスレッド2を生成した際、新規のスレッド2のTID(=tid2)をスレッド3に通知する(図6(b))。
【0065】
スレッド2は、スレッド1およびスレッド3より先に、合流可能状態で終了する(図6(c))。図6に示す例では、スレッド2のスレッド情報SINFは、スレッド2が終了してから猶予時間Δが経過してもスレッド3等の他のスレッドに使用されない。このため、情報処理装置100は、スレッド2が終了してから猶予時間Δが経過した場合に、スレッド2のスレッド情報SINFを第1記憶部300から第2記憶部400に退避する(図6(d))。これにより、第1記憶部300内の記憶領域のうち、スレッド2に割り当てられた記憶領域(配列TDA[tid2]および配列TSA[tid2]が記憶される領域)が解放される(図6(d))。また、情報処理装置100は、スレッド2のスレッド情報SINFが第2記憶部400に退避されたことをユーザに警告する(図6(d))。
【0066】
また、情報処理装置100は、実行中のスレッド3において、スレッド2のスレッド情報SINFを使用するために、pthread_join(tid2、ret)を実行する(図6(e))。なお、pthread_joinは、引数で指定されたスレッド(例えば、TIDが“tid2”のスレッド2)が終了するまで待機する関数である。また、例えば、pthread_joinの引数で指定されるスレッドの返り値は、引数retで指定される領域に格納される。
【0067】
図6に示す例では、pthread_join(tid2、ret)が実行される前に、スレッド2は終了する。このため、情報処理装置100は、pthread_join(tid2、ret)を実行した際にスレッド3の処理を待機することなく、スレッド2の返り値を引数retで指定される領域に格納する。すなわち、情報処理装置100は、第2記憶部400に退避したスレッド2のスレッド情報SINFからスレッド2の返り値を取得する(図6(f))。これにより、スレッド2の資源が回収される(図6(g))。
【0068】
図7は、新規のスレッドを生成する場合の情報処理装置100の動作の一例を示す。なお、図7に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図7に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。図7に示す動作は、例えば、pthread_createが呼び出される度に実行される。
【0069】
ステップS200では、割り当て部260は、使用可能なスレッドのインデックスIDXを未割り当てキューFIDXQから取得する。図7に示す例では、使用可能なスレッドのインデックスIDXの取得に失敗した場合、例えば、使用可能なスレッドのインデックスIDXが未割り当てキューFIDXQに格納されていない場合、負の値を有するインデックスIDXが割り当て部260に返される。
【0070】
次に、ステップS210では、割り当て部260は、未割り当てキューFIDXQから取得したインデックスIDXの値が“0”以上か否かを判定する。インデックスIDXの値が“0”以上の場合、情報処理装置100の動作は、ステップS220に移る。一方、インデックスIDXの値が負の場合、すなわち、使用可能なスレッドのインデックスIDXの取得に失敗した場合、情報処理装置100の動作は、ステップS250に移る。
【0071】
ステップS220では、割り当て部260は、未割り当てキューFIDXQから取得したインデックスIDXが示す管理構造体の配列TDA[IDX]とスタックの配列TSA[IDX]とを初期化する。
【0072】
次に、ステップS230では、情報処理装置100は、未割り当てキューFIDXQから取得したインデックスIDXを、スケジューラに通知して実行待ちキューに格納する。例えば、割り当て部260は、実行部200が有するスケジューラに、未割り当てキューFIDXQから取得したインデックスIDXを通知する。そして、実行部200が有するスケジューラは、実行部200が有する実行待ちキューに、割り当て部260から通知されたインデックスIDXを格納する。
【0073】
次に、ステップS240では、情報処理装置100は、未割り当てキューFIDXQから取得したインデックスIDXが示す世代番号の配列TGA[IDX]とインデックスIDXとを用いて、TIDを生成する。そして、情報処理装置100は、世代番号の配列TGA[IDX]とインデックスIDXとを用いて生成したTIDを、新規のスレッドのTIDとして、pthread_createを呼び出したプログラム等の呼び出し元に返す。例えば、情報処理装置100は、世代番号の配列TGA[IDX]とインデックスIDXとを用いて生成したTIDを、pthread_createの引数で指定される領域に格納する。これにより、新規のスレッドを生成する処理は終了する。なお、上述したように、ステップS200において、使用可能なスレッドのインデックスIDXの取得に失敗した場合、ステップS250の処理が実行される。
【0074】
ステップS250では、情報処理装置100は、資源の割り当てに失敗したことをユーザに通知して、新規のスレッドを生成する処理を異常終了する。例えば、情報処理装置100は、資源の割り当てに失敗したことを示す表示画面をコンソール等に出力してユーザに警告し、新規のスレッドを生成する処理を異常終了する。
【0075】
なお、新規のスレッドを生成する場合の情報処理装置100の動作は、図7に示す例に限定されない。例えば、情報処理装置100は、スレッドのインデックスの代わりにスレッドのTIDを、実行部200が有する実行待ちキューに格納してもよい。
【0076】
図8は、スレッドが終了する場合の情報処理装置100の動作の一例を示す。なお、図8に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図8に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。図8に示す動作は、例えば、スレッドが終了する度に実行される。なお、スレッドの終了の契機は、例えば、pthread_createで指定したサブルーチンの終了、pthread_exitの呼び出し、異常終了、他のスレッドからのpthread_cancelの実行のいずれかである。なお、pthread_exitは、スレッドを終了する関数であり、pthread_cancelは、スレッドにキャンセル要求を送る関数である。
【0077】
ステップS300では、実行部200は、終了したスレッドがデタッチ状態か否かを判定する。終了したスレッドがデタッチ状態の場合、情報処理装置100の動作は、ステップS330に移る。一方、終了したスレッドがデタッチ状態でない場合、すなわち、終了したスレッドが合流可能状態の場合、情報処理装置100の動作は、ステップS320に移る。
【0078】
ステップS320では、実行部200は、終了したスレッドの返り値を使用するために待機している合流待ちのスレッドが存在するか否かを判定する。合流待ちのスレッドが存在する場合、情報処理装置100の動作は、ステップS322に移る。一方、合流待ちのスレッドが存在しない場合、情報処理装置100の動作は、ステップS340に移る。
【0079】
ステップS322では、情報処理装置100は、合流待ちのスレッドのインデックスIDXをスケジューラに通知して実行待ちキューに格納する。ステップS322の処理が実行された後、情報処理装置100の動作は、ステップS330に移る。
【0080】
ステップS330では、情報処理装置100は、終了したスレッドのインデックスIDXを未割り当てキューに戻し、終了したスレッドに関する処理を終了する。なお、上述したように、終了したスレッドが合流可能状態で、かつ、合流待ちのスレッドが存在しない場合、ステップS340の処理が実行される。
【0081】
ステップS340では、退避処理部220は、終了したスレッドのTIDを、図9に示す動作で更新される格納先ポインタi(大域変数)で指定される循環リストCLST[i]に格納されたTIDのリストの末尾に追加する。これにより、終了したスレッドに関する処理が終了する。
【0082】
このように、退避処理部220は、合流可能状態で終了したスレッドのうち、合流待ちのスレッドが存在するスレッドと、スレッドの返り値を他のスレッドに渡さないデタッチ状態に設定されたスレッドとを、退避対象のスレッドから除外する。なお、スレッドが終了する場合の情報処理装置100の動作は、図8に示す例に限定されない。
【0083】
図9は、スレッドの資源を退避する場合の情報処理装置100の動作の一例を示す。なお、図9に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図9に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。ステップS400の処理は、例えば、pthreadライブラリを使用して記述されたユーザプログラム等の実行を契機に実行される。
【0084】
ステップS400では、情報処理装置100は、循環リストCLSTを初期化する。これにより、循環リストCLSTの全ての要素はクリアされる。次に、ステップS402では、情報処理装置100は、格納先ポインタiを“0”に初期化する。次に、ステップS404では、情報処理装置100は、時刻情報tpに現在時刻を設定する。ステップS400からステップS404までの一連の初期化処理が終了した後に、ステップS420の処理が実行される。
【0085】
ステップS420では、情報処理装置100は、時刻情報tに現在時刻を設定する。次に、ステップS422では、情報処理装置100は、時刻情報tと時刻情報tpとの差分(=t−tp)が時刻幅ε以上か否かを判定する。すなわち、情報処理装置100は、時刻情報tpが示す時刻から時刻幅ε以上経過したか否かを判定する。時刻情報tと時刻情報tpとの差分(=t−tp)が時刻幅ε以上の場合、すなわち、時刻情報tpが示す時刻から時刻幅ε以上経過した場合、情報処理装置100の動作は、ステップS440に移る。一方、時刻情報tと時刻情報tpとの差分(=t−tp)が時刻幅εより小さい場合、情報処理装置100の動作は、ステップS420に戻る。すなわち、ステップS440の処理は、時刻幅εと同じ時間またはほぼ同じ時間が経過する度に実行される。
【0086】
ステップS440では、退避処理部220は、格納先ポインタiを1つ進めた値に変数i1を更新する。変数i1は、例えば、剰余演算子modを用いて、“i1=(i+1)mod(Δ/ε)”で表される。
【0087】
次に、ステップS460では、情報処理装置100は、図10に示す退避処理を実行する。退避処理により、変数i1で指定される循環リストCLST[i1]に格納されたTIDのスレッドのスレッド情報SINFが第1記憶部300から第2記憶部400に退避され、変数i1で指定される循環リストCLST[i1]がクリアされる。
【0088】
次に、ステップS480では、情報処理装置100は、格納先ポインタiを変数i1の値に更新する(i=i1)。これにより、例えば、図8に示したステップS340において、ステップS460の退避処理によりクリアされた循環リストCLSTの要素にTIDが格納される。
【0089】
次に、ステップS482では、情報処理装置100は、時刻情報tpに、時刻情報tが示す時刻を設定する(tp=t)。これにより、時刻情報tpが更新される。格納先ポインタiおよび時刻情報tpが更新された後(ステップS480およびステップS482の一連の更新処理が終了した後)、情報処理装置100の動作は、ステップS420に戻る。
【0090】
このように、ステップS460の退避処理は、時刻幅εと同じ時間またはほぼ同じ時間が経過する度に実行される。したがって、退避処理でクリアされる循環リストCLST[i1]に格納されたTIDは、スレッドの処理が終了してから猶予時間Δ(=時刻幅ε×循環リストCLSTの要素数(Δ/ε))または猶予時間Δとほぼ同じ時間だけ経過したスレッドのTIDである。すなわち、図9に示す動作では、スレッド情報SINFの退避が猶予時間Δだけ猶予される。
【0091】
これにより、例えば、スレッドの終了から猶予時間Δ以内に、終了したスレッドに対して、pthread_joinを実行するスレッドは、第1記憶部300に格納されたスレッド情報SINFから返り値を読み出すことができる。第1記憶部300に対するアクセス時間が第2記憶部400に対するアクセス時間より短い場合、第1記憶部300から返り値を読み出すことにより、第2記憶部400から返り値を読み出す場合に比べて、返り値の取得に掛かる時間を短くすることができる。換言すれば、第2記憶部400に格納されたスレッド情報SINFから返り値を読み出す場合、第1記憶部300から返り値を読み出す場合に比べて、返り値の取得に掛かる時間が増加し、実行時間のペナルティが増加する。したがって、図9に示す動作では、スレッド情報SINFの退避を猶予時間Δだけ猶予することにより、pthread_joinを実行するスレッドに対する実行時間のペナルティの増加を抑制することができる。
【0092】
また、図9に示す動作は、スレッドの終了直後にスレッド情報SINFの退避が実行される場合に比べて、他のスレッドに使用される可能性があるスレッドのスレッド情報SINFが第2記憶部400に退避されることを低減することができる。他のスレッドに使用される可能性があるスレッドのスレッド情報SINFは、例えば、プログラムのバグまたは意図的にメモリ上に未解放のまま残るスレッド情報SINF以外のスレッド情報SINFである。
【0093】
図10は、図9に示した退避処理の一例を示す。すなわち、ステップS462の処理は、図9に示したステップS440により変数i1が更新された後、実行される。したがって、図10に示す変数i1の値は、図9に示したステップS440により更新された値である。
【0094】
ステップS462では、退避処理部220は、変数i1で指定される循環リストCLST[i1]が空か否かを判定する。循環リストCLST[i1]が空の場合、すなわち、循環リストCLST[i1]にTIDが格納されていない場合、退避処理は終了し、情報処理装置100の動作は、図9に示したステップS480に移る。一方、循環リストCLST[i1]が空でない場合、すなわち、循環リストCLST[i1]にTIDが格納されている場合、情報処理装置100の動作は、ステップS464に移る。
【0095】
ステップS464では、退避処理部220は、循環リストCLST[i1]に格納されたTIDのリストの先頭のTIDtを読み出してTIDのリストから削除する。なお、図10では、ステップS466からステップS472の一連の処理の対象となるスレッドのTIDと他のスレッドのTIDとを区別するために、ステップS464で読み出されるTIDは、TIDの末尾に“t”を付してTIDtと称される。また、以下では、TIDtが示すスレッドのインデックスIDXは、TIDt.IDXとも称され、TIDtが示すスレッドの世代番号は、TIDt.GENとも称される。
【0096】
次に、ステップS466では、退避処理部220は、TIDt.IDXで指定される世代番号の配列TGA[TIDt.IDX]の値を“1”増加する(TGA[TIDt.IDX]++)。これにより、世代番号の配列TGA[TIDt.IDX]の値は、TIDt.GENより1つ大きい世代番号に更新される。この結果、例えば、第2記憶部400にスレッド情報SINFが退避されたスレッドのインデックスIDXが再利用される場合でも、TIDの一意性を保証することができる。
【0097】
次に、ステップS468では、退避処理部220は、TIDt.IDXを未割り当てキューFIDXQに戻す。これにより、TIDtのスレッドに割り当てられた資源(配列TDA[TIDt.IDX]、配列TSA[TIDt.IDX]等)が解放される。
【0098】
次に、ステップS470では、警告部280は、退避対象のスレッド(TIDtのスレッド)でメモリリークの発生の可能性があることを警告する。例えば、退避処理部220は、TIDtを警告部280に通知する。そして、警告部280は、退避対象のスレッド(TIDtのスレッド)でメモリリークの発生の可能性があることを示す表示画面を、コンソール等に出力する。
【0099】
次に、ステップS472では、退避処理部220は、管理構造体の配列TDA[TIDt.IDX]とスタックの配列TSA[TIDt.IDX]と現在時刻とを含むデータを、TIDtをキーとしてB+木に登録する。これにより、管理構造体の配列TDA[TIDt.IDX]とスタックの配列TSA[TIDt.IDX]とを含むスレッド情報SINFが第1記憶部300から第2記憶部400に退避される。なお、B+木に登録されるデータに含まれる現在時刻は、スレッド情報SINFが第1記憶部300から第2記憶部400に退避される退避時刻を示す。退避時刻を示す現在時刻は、B+木に登録されるデータから省かれてもよい。また、TIDtのスレッドの実行が再開されることがないため、B+木に登録されるデータは、管理構造体の配列TDA[TIDt.IDX]とスタックの配列TSA[TIDt.IDX]とを含むスレッド情報SINFから間引いた情報でもよい。ステップS472の処理が実行された後、情報処理装置100の動作は、ステップS462に戻る。
【0100】
このように、退避処理部220は、図9に示したステップS440により更新された変数i1で指定される循環リストCLST[i1]に格納されたTIDのスレッドを退避対象のスレッドに決定する。なお、スレッドの資源を退避する場合の情報処理装置100の動作は、図9および図10に示す例に限定されない。
【0101】
図11は、他のスレッドの返り値を使用する場合の情報処理装置100の動作の一例を示す。なお、図11に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図11に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。図11に示す動作は、例えば、pthread_joinが呼び出される度に実行される。図11に示す例では、情報処理装置100は、TIDoのスレッドの返り値(他のスレッドの返り値)をpthread_joinの引数retで指定される領域に格納する。また、図11では、TIDoが示すスレッドのインデックスIDXは、TIDo.IDXとも称され、TIDoが示すスレッドの世代番号は、TIDo.GENとも称される。
【0102】
ステップS500では、実行部200は、TIDo.GENが世代番号の配列TGA[TIDo.IDX]より小さいか否かを判定する。すなわち、実行部200は、TIDo.GENが現在使用中の世代番号より小さいか否かを判定する。世代番号の配列TGA[TIDo.IDX]より小さいTIDo.GENは、TIDoのスレッドのスレッド情報SINFが第2記憶部400に退避されたことを示す。また、世代番号の配列TGA[TIDo.IDX]と同じ値のTIDo.GENは、TIDoのスレッドのスレッド情報SINFが第2記憶部400に退避されていないことを示す。TIDo.GENが世代番号の配列TGA[TIDo.IDX]より小さい場合、情報処理装置100の動作は、ステップS510に移る。一方、TIDo.GENが世代番号の配列TGA[TIDo.IDX]以上の場合、情報処理装置100の動作は、ステップS540に移る。
【0103】
ステップS510では、情報受け渡し部240は、TIDoをキーとしてB+木を検索する。例えば、実行部200は、TIDoを情報受け渡し部24に通知することにより、TIDoのスレッドの返り値の取得を情報受け渡し部24に要求する。そして、情報受け渡し部240は、実行部200から通知されたTIDoをキーとしてB+木を検索する。
【0104】
次に、ステップS520では、情報受け渡し部240は、TIDoをキーとするデータ(ステップS510で検索したデータ)に含まれる返り値RNVoを、呼び出し元のスレッド(pthread_joinを呼び出したスレッド)に受け渡す。例えば、情報受け渡し部240は、TIDoをキーとするデータに含まれる返り値RNVoを、pthread_joinの引数retで指定される領域に格納する(ret=RNVo)。これにより、実行部200は、TIDoのスレッドの返り値RNVoを、pthread_joinの引数retで指定される領域から取得できる。なお、情報受け渡し部240は、返り値RNVoを実行部200に通知してもよい。この場合、実行部200は、情報受け渡し部240から通知された返り値RNVoを、pthread_joinの引数retで指定される領域に格納してもよい。
【0105】
次に、ステップS530では、情報受け渡し部240は、キーTIDoをB+木から削除する。これにより、TIDoのスレッドの資源が第2記憶部400から解放され、TIDoのスレッドのスレッド情報SINFが第2記憶部400に退避されている場合の処理は終了する。なお、上述したように、TIDoのスレッドのスレッド情報SINFが第2記憶部400に退避されていない場合、ステップS540の処理が実行される。
【0106】
ステップS540では、実行部200は、TIDoのスレッド(他のスレッド)が実行中か否かを判定する。TIDoのスレッドが実行中の場合、情報処理装置100の動作は、ステップS550に移る。一方、TIDoのスレッドが実行中でない場合、情報処理装置100の動作は、ステップS560に移る。すなわち、TIDoのスレッドが終了し、かつ、TIDoのスレッドのスレッド情報SINFが第1記憶部300に格納されている場合、情報処理装置100の動作は、ステップS560に移る。
【0107】
ステップS550では、実行部200は、呼び出し元のスレッド(pthread_joinを呼び出したスレッド)の処理を、TIDoのスレッドが終了するまで待機する。TIDoのスレッドの処理が終了した場合、情報処理装置100の動作は、ステップS570に移る。
【0108】
ステップS560では、退避処理部220は、TIDoを循環リストCLSTから削除する。これにより、TIDoのスレッドは、退避対象のスレッドから除外される。このように、プログラムのバグまたは意図的にメモリ上に未解放のまま残るスレッド情報SINF以外のスレッド情報SINF(他のスレッドに使用されるスレッド情報SINF)が退避されることを低減することができる。ステップS560の処理が実行された後、情報処理装置100の動作は、ステップS570に移る。
【0109】
ステップS570では、情報処理装置100は、管理構造体の配列TDA[TIDo.IDX]に含まれる返り値RNVoを、呼び出し元のスレッド(pthread_joinを呼び出したスレッド)に受け渡す。例えば、情報処理装置100は、管理構造体の配列TDA[TIDo.IDX]に含まれる返り値RNVoを、pthread_joinの引数retで指定される領域に格納する(ret=RNVo)。これにより、TIDoのスレッドの資源が第1記憶部300から解放され、TIDoのスレッドのスレッド情報SINFが第2記憶部400に退避されていない場合の処理は終了する。
【0110】
なお、他のスレッドの返り値を使用する場合の情報処理装置100の動作は、図11に示す例に限定されない。例えば、ステップS530は、省かれてもよい。この場合、例えば、ユーザがプログラム解析等を実行する際に、スレッドの終了後に第2記憶部400に退避されたスレッド情報SINFにアクセスすることができる。
【0111】
以上、図3から図11に示す実施形態では、情報処理装置100は、スレッドの実行に使用するスレッド情報SINFを記憶する第1記憶部300と第1記憶部300から退避されるスレッド情報SINFを記憶する第2記憶部400とを有する。さらに、情報処理装置100は、スレッドを実行する実行部200と、退避処理部220と、情報受け渡し部240と、割り当て部260と、警告部280とを有する。退避処理部220は、実行部200が実行するスレッドのうち、スレッド情報SINFを退避する退避対象のスレッドのスレッド情報SINFを、退避対象のスレッドの終了後に第1記憶部300から第2記憶部400に退避する。これにより、退避対象のスレッドに割り当てられた第1記憶部300内の記憶領域を解放することができ、メモリリークの発生を抑止することができる。
【0112】
また、例えば、退避処理部220は、スレッド情報SINFの退避を猶予時間Δだけ猶予する。この場合、スレッドの終了直後にスレッド情報SINFの退避が実行される場合に比べて、他のスレッドのスレッド情報SINFを使用するスレッドに対する実行時間のペナルティの増加を抑制することができる。また、スレッドの終了直後にスレッド情報SINFの退避が実行される場合に比べて、プログラムのバグまたは意図的にメモリ上に未解放のまま残るスレッド情報SINF以外のスレッド情報SINFが退避されることを低減できる。
【0113】
また、情報受け渡し部240は、実行中のスレッドが第2記憶部400に退避されたスレッド情報SINFを使用する場合、実行中のスレッドにより使用されるスレッド情報SINFを第2記憶部400から実行部20に転送する。これにより、第1記憶部300から第2記憶部400に退避されたスレッド情報SINFが後続のスレッドで使用される場合でも、後続のスレッドにスレッド情報SINFを受け渡すことができる。この結果、後続のスレッドがスレッド情報SINFを使用できずに異常終了することを防止することができる。
【0114】
また、割り当て部260は、新規のスレッドに資源を割り当てる場合に、スレッドを識別するための識別情報TIDをスレッドのインデックスと世代番号とを用いて生成し、生成した識別情報TIDを実行部200に通知する。これにより、情報処理装置100は、第2記憶部400にスレッド情報SINFが退避されたスレッドのインデックスIDXを再利用する場合でも、TIDの一意性を保証できる。
【0115】
図12は、情報処理装置の制御プログラムを実行するハードウェアの一例を示す。なお、図1から図11で説明した要素と同一または同様の要素については、同一または同様の符号を付し、これ等については、詳細な説明を省略する。例えば、コンピュータ装置1000は、情報処理装置の制御プログラムを実行することにより、図1および図3に示した情報処理装置10、100等の機能を実現する。
【0116】
コンピュータ装置1000は、例えば、プロセッサ1100、メモリ1200、ハードディスク装置1300、入力インタフェース1400、出力インタフェース1500およびドライブ装置1600を有する。プロセッサ1100、メモリ1200、ハードディスク装置1300、入力インタフェース1400、出力インタフェース1500およびドライブ装置1600は、バス1700に接続される。情報処理装置10、100等の機能は、例えば、プロセッサ1100と、メモリ1200と、ハードディスク装置1300と、入力インタフェース1400と、出力インタフェース1500とにより実現される。
【0117】
ドライブ装置1600は、リムーバブルメディア1620を装着可能であり、装着したリムーバブルメディア1620に記録された情報の読み出しおよび記録を実行する。リムーバブルメディア1620は、例えば、CD−ROM(Compact Disc Read only memory)、DVD(Digital Versatile Disc)、USB(Universal Serial Bus)メモリ等である。
【0118】
また、コンピュータ装置1000は、入力インタフェース1400および出力インタフェース1500を介してコンピュータ装置1000の外部と通信する。例えば、入力インタフェース1400は、キーボードやマウス等の図示しない入力装置に接続される。出力インタフェース1500は、例えば、表示装置1800に接続され、メモリリークの発生の可能性があることを示す警告等の表示画面を表示装置1800に出力する。
【0119】
メモリ1200は、例えば、コンピュータ装置1000のオペレーティングシステム、情報処理装置の制御プログラム等を格納する。また、メモリ1200は、例えば、管理構造体の配列TDA、スタックの配列TSA等のスレッド情報SINFを記憶してもよい。そして、ハードディスク装置1300は、メモリ1200から退避されるスレッド情報SINFを記憶してもよい。
【0120】
情報処理装置の制御プログラム等のソフトウェアは、リムーバブルメディア1620に記録して頒布することができる。例えば、コンピュータ装置1000は、情報処理装置の制御プログラム等のソフトウェアを、リムーバブルメディア1620からドライブ装置1600を介して読み出し、メモリ1200やハードディスク装置1300に格納してもよい。すなわち、リムーバブルメディア1620は、情報処理装置の制御プログラムを記録し、コンピュータが読み取り可能な記録媒体の一例である。
【0121】
また、コンピュータ装置1000は、情報処理装置の制御プログラム等のソフトウェアを、インターネット等のネットワークに接続する通信装置(図示せず)を介してダウンロードし、メモリ1200やハードディスク装置1300に格納してもよい。
【0122】
なお、情報処理装置の制御プログラムを実行するハードウェアは、図12に示す例に限定されない。例えば、コンピュータ装置1000は、ドライブ装置1600が省かれてもよい。また、例えば、コンピュータ装置1000は、ハードディスク装置1300の代わりにSSD(Solid State Drive)等を有してもよい。
【0123】
以上の実施形態において説明した発明を整理して、付記として以下の通り開示する。
(付記1)
スレッドを実行する実行部と、
前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、
前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部と、
前記実行部が実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避する退避処理部と、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する情報受け渡し部と
を有することを特徴とする情報処理装置。
(付記2)
付記1に記載の情報処理装置において、
前記退避処理部は、スレッドの処理が終了してから所定の時間が経過するまでに前記スレッド情報が使用されていないスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
(付記3)
付記2に記載の情報処理装置において、
前記退避処理部は、スレッドの返り値を他のスレッドに渡さないスレッドを、前記退避対象のスレッドから除外する
ことを特徴とする情報処理装置。
(付記4)
付記1ないし付記3のいずれか1項に記載の情報処理装置において、
前記退避処理部は、スレッド内で最初に実行される関数の種類に基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
(付記5)
付記1ないし付記4のいずれか1項に記載の情報処理装置において、
前記退避処理部は、スレッドの生成を指示する命令の格納先を示すアドレスに基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
(付記6)
付記1ないし付記5のいずれか1項に記載の情報処理装置において、
前記退避処理部は、スレッドの属性にスレッドの処理の終了後に前記スレッド情報が退避される属性を含むスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
(付記7)
付記1ないし付記6のいずれか1項に記載の情報処理装置において、
新規のスレッドの生成を指示する命令に基づいて、前記新規のスレッドの前記スレッド情報を記憶する空き領域が前記第1記憶部に有るかを判定し、前記第1記憶部に前記空き領域が有る場合、前記空き領域を前記新規のスレッドのスレッド情報に割り当てる割り当て部をさらに有する
ことを特徴とする情報処理装置。
(付記8)
付記7に記載の情報処理装置において、
前記割り当て部は、前記新規のスレッドが生成される度に、スレッドを識別するための識別情報を、前記第1記憶部に記憶される前記スレッド情報を識別するためのインデックスと、前記第1記憶部に記憶される前記スレッド情報と前記第2記憶部に退避される前記スレッド情報とを判別するための判別情報とを用いて生成し、生成した前記識別情報を前記実行部に通知する
ことを特徴とする情報処理装置。
(付記9)
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部とを含む情報処理装置の制御方法において、
前記情報処理装置が、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避し、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する
ことを特徴とする情報処理装置の制御方法。
(付記10)
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部とを含む情報処理装置の制御プログラムにおいて、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避し、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する
処理を前記情報処理装置に実行させるための制御プログラム。
(付記11)
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第1記憶部と、前記第1記憶部から退避される前記スレッド情報を記憶する第2記憶部とを含む情報処理装置の制御プログラムを記録した記録媒体であって、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第1記憶部から前記第2記憶部に退避し、
実行中のスレッドが前記第2記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第2記憶部から前記実行部に転送する
処理を前記情報処理装置に実行させるための制御プログラムを記録したことを特徴とする記録媒体。
【0124】
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。
【符号の説明】
【0125】
10、100‥情報処理装置;20、200‥実行部;22、220‥退避処理部;24、240‥情報受け渡し部;30、300‥第1記憶部;40、400‥第2記憶部;260‥割り当て部;280‥警告部;1000‥コンピュータ装置;1100‥プロセッサ;1200‥メモリ;1300‥ハードディスク装置;1400‥入力インタフェース;1500‥出力インタフェース;1600‥ドライブ装置;1620‥リムーバブルメディア;1700‥バス;1800‥表示装置
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12