(57)【要約】【課題】  メモリリークの発生を抑止する。【解決手段】  情報処理装置は、実行部、第１記憶部、第２記憶部、退避処理部および情報受け渡し部を有する。実行部は、スレッドを実行する。第１記憶部は、スレッドの実行に使用されうるスレッド情報を記憶する。第２記憶部は、第１記憶部から退避されるスレッド情報を記憶する。退避処理部は、実行部が実行するスレッドのうち、スレッド情報を退避する退避対象のスレッドの実行の終了後に、退避対象のスレッドのスレッド情報を第１記憶部から第２記憶部に退避する。情報受け渡し部は、実行中のスレッドが第２記憶部に退避されたスレッド情報を使用する場合、実行中のスレッドにより使用されるスレッド情報を第２記憶部から実行部に転送する。【選択図】  図１
2018147068.tif 000002
【特許請求の範囲】
【請求項１】
スレッドを実行する実行部と、
前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、
前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部と、
前記実行部が実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避する退避処理部と、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する情報受け渡し部と
を有することを特徴とする情報処理装置。
【請求項２】
請求項１に記載の情報処理装置において、
前記退避処理部は、スレッドの処理が終了してから所定の時間が経過するまでに前記スレッド情報が使用されていないスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
【請求項３】
請求項１または請求項２に記載の情報処理装置において、
前記退避処理部は、スレッド内で最初に実行される関数の種類に基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
【請求項４】
請求項１ないし請求項３のいずれか１項に記載の情報処理装置において、
前記退避処理部は、スレッドの生成を指示する命令の格納先を示すアドレスに基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
【請求項５】
請求項１ないし請求項４のいずれか１項に記載の情報処理装置において、
前記退避処理部は、スレッドの属性にスレッドの処理の終了後に前記スレッド情報が退避される属性を含むスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
【請求項６】
請求項１ないし請求項５のいずれか１項に記載の情報処理装置において、
新規のスレッドの生成を指示する命令に基づいて、前記新規のスレッドの前記スレッド情報を記憶する空き領域が前記第１記憶部に有るかを判定し、前記第１記憶部に前記空き領域が有る場合、前記空き領域を前記新規のスレッドのスレッド情報に割り当てる割り当て部をさらに有する
ことを特徴とする情報処理装置。
【請求項７】
請求項６に記載の情報処理装置において、
前記割り当て部は、前記新規のスレッドが生成される度に、スレッドを識別するための識別情報を、前記第１記憶部に記憶される前記スレッド情報を識別するためのインデックスと、前記第１記憶部に記憶される前記スレッド情報と前記第２記憶部に退避される前記スレッド情報とを判別するための判別情報とを用いて生成し、生成した前記識別情報を前記実行部に通知する
ことを特徴とする情報処理装置。
【請求項８】
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部とを含む情報処理装置の制御方法において、
前記情報処理装置が、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避し、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する
ことを特徴とする情報処理装置の制御方法。
【請求項９】
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部とを含む情報処理装置の制御プログラムにおいて、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避し、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する
処理を前記情報処理装置に実行させるための制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラムに関する。
【背景技術】
【０００２】
メモリ等の記憶装置を使用して演算等の処理を実行する情報処理装置は、アプリケーションプログラム等を実行する場合、処理の実行に必要なメモリ領域を記憶装置に確保する。そして、処理の終了等により不要になったメモリ領域は、解放される。なお、不要なメモリ領域を解放せずに確保し続けるメモリリークが発生した場合、不要なメモリ領域が記憶装置に確保され続けるため、メモリ領域の利用効率が低下する。また、メモリリークが頻繁に発生すると、使用可能なメモリ領域が減少し、処理の実行に必要なメモリ領域を確保できなくなる場合がある。この場合、アプリケーションプログラムは異常終了する。あるいは、アプリケーションプログラムを含むシステム全体が異常終了するおそれがある。
【０００３】
このため、メモリリークの発生を抑止する方法が提案されている。例えば、複数のスレッドを用いて並列処理を情報処理装置に実行させるマルチスレッドプログラムを生成するプログラム生成装置において、メモリリークの発生を抑止するプログラム生成方法が提案されている（例えば、特許文献１参照）。この種のプログラム生成装置は、マルチスレッドプログラムを記述するコードのうち、メモリ領域を動的に確保するスレッドを記述するコードを解析する。そして、プログラム生成装置は、スレッドが終了する前にメモリ領域を解放していない場合、未解放のメモリ領域を強制的に解放してからスレッドを終了する動作を実行するようにプログラムを修正する。なお、確保したメモリ領域が親プロセスまたは他のスレッド等に使用される可能性があるスレッドを記述するコードは、解析の範囲から除外される。
【０００４】
また、プロセスが必要とするメモリ領域を誤って解放することなく、不要なメモリ領域を解放するメモリ管理システムが提案されている（例えば、特許文献２参照）。この種のメモリ管理システムは、例えば、プロセスが確保したメモリ領域の最大生存時間を管理し、メモリ領域を確保してから最大生存時間を過ぎても解放されていないメモリ領域を解放する。
【０００５】
また、プログラムを実行することにより生成されたオブジェクトに対するアクセス情報に基づいて、メモリリークの可能性の高いリークオブジェクトを抽出するメモリ管理方法が提案されている（例えば、特許文献３参照）。この種のメモリ管理方法では、アクセス情報に基づいて抽出したリークオブジェクトを主記憶部から補助記憶部に移動する。なお、プログラムを実行するプロセッサは、補助記憶部に格納されたオブジェクトがアクセスされた場合には、アクセスされたオブジェクトを主記憶部に移動させる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１４−１３０４０１号公報
【特許文献２】特開２００２−１０８６９８号公報
【特許文献３】特開２００９−２６０８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
先行するスレッドの返り値等のデータが後続のスレッドで使用される場合がある。先行するスレッドの返り値等のデータは、先行するスレッドの実行のために確保したメモリ領域に格納される。このため、先行するスレッドが終了しても後続のスレッドがデータを使用することに備えてメモリ領域を解放しない情報処理装置では、メモリリークが発生するおそれがある。
【０００８】
１つの側面では、本発明は、メモリリークの発生を抑止することを目的とする。
【課題を解決するための手段】
【０００９】
１つの実施態様では、情報処理装置は、実行部、第１記憶部、第２記憶部、退避処理部および情報受け渡し部を有する。実行部は、スレッドを実行する。第１記憶部は、スレッドの実行に使用されうるスレッド情報を記憶する。第２記憶部は、第１記憶部から退避されるスレッド情報を記憶する。退避処理部は、実行部が実行するスレッドのうち、スレッド情報を退避する退避対象のスレッドの実行の終了後に、退避対象のスレッドのスレッド情報を第１記憶部から第２記憶部に退避する。情報受け渡し部は、実行中のスレッドが第２記憶部に退避されたスレッド情報を使用する場合、実行中のスレッドにより使用されるスレッド情報を第２記憶部から実行部に転送する。
【発明の効果】
【００１０】
１つの側面では、本発明は、メモリリークの発生を抑止することができる。
【図面の簡単な説明】
【００１１】
【図１】情報処理装置の一実施形態を示す図である。
【図２】図１に示した情報処理装置の動作の一例を示す図である。
【図３】情報処理装置の別の実施形態を示す図である。
【図４】図３に示した管理構造体の配列、スタックの配列および世代番号の配列の関係の一例を示す図である。
【図５】循環リストの一例を示す図である。
【図６】図３に示した情報処理装置の動作の概要を示す図である。
【図７】新規のスレッドを生成する場合の情報処理装置の動作の一例を示す図である。
【図８】スレッドが終了する場合の情報処理装置の動作の一例を示す図である。
【図９】スレッドの資源を退避する場合の情報処理装置の動作の一例を示す図である。
【図１０】図９に示した退避処理の一例を示す図である。
【図１１】他のスレッドの返り値を使用する場合の情報処理装置の動作の一例を示す図である。
【図１２】情報処理装置の制御プログラムを実行するハードウェアの一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、実施形態について、図面を用いて説明する。
【００１３】
図１は、情報処理装置の一実施形態を示す。図１に示す情報処理装置１０は、サーバ等のコンピュータ装置等であり、スレッドの生成等の機能を提供するスレッドライブラリを使用して記述されたプログラムを実行する。例えば、情報処理装置１０は、実行部２０と、退避処理部２２と、情報受け渡し部２４と、スレッド情報ＳＩＮＦを記憶する第１記憶部３０と、第１記憶部３０から退避されるスレッド情報ＳＩＮＦを記憶する第２記憶部４０とを有する。なお、スレッド情報ＳＩＮＦは、スレッドの実行に使用される情報である。例えば、スレッド情報ＳＩＮＦは、スレッドの返り値等である。実行部２０、退避処理部２２および情報受け渡し部２４の各機能は、例えば、情報処理装置１０が制御プログラム等のソフトウェアを実行することにより実現される。すなわち、実行部２０、退避処理部２２および情報受け渡し部２４は、ハードウェアをソフトウェアで制御することにより実現される。なお、実行部２０、退避処理部２２および情報受け渡し部２４は、ハードウェアのみで実現されてもよい。また、例えば、第１記憶部３０は、ＤＲＡＭ（Dynamic Random Access Memory）等の半導体記憶装置であり、第２記憶部４０は、ハードディスク装置、ＳＳＤ（Solid State Drive）等である。
【００１４】
実行部２０は、プログラムに基づいて、スレッドを実行する。そして、実行部２０は、スレッドの処理が終了した場合、第１記憶部３０の記憶領域のうち、スレッドに対応して割り当てられた記憶領域に、スレッドの返り値等を格納する。例えば、情報処理装置１０は、実行部２０が新規のスレッドの実行を開始する前に、新規のスレッドのスレッド情報ＳＩＮＦを記憶する記憶領域を第１記憶部３０に確保する。
【００１５】
また、実行部２０は、実行中のスレッドが他のスレッドの返り値等のスレッド情報ＳＩＮＦを使用する場合、他のスレッドに割り当てられた記憶領域に格納されたスレッド情報ＳＩＮＦを、第１記憶部３０から取得してスレッドの実行を継続する。なお、他のスレッドの処理が終了していない場合、実行部２０は、他のスレッドのスレッド情報ＳＩＮＦの取得を他のスレッドの処理が終了するまで待機する。他のスレッドに割り当てられた記憶領域は、スレッド情報ＳＩＮＦが後続のスレッドに受け渡された場合、解放される。解放された記憶領域は、新規のスレッドに割り当て可能である。
【００１６】
退避処理部２２は、例えば、スレッドの処理が終了してから所定の時間が経過しても解放されずに第１記憶部３０に確保されている記憶領域を特定し、特定した記憶領域に割り当てられたスレッドを退避対象のスレッドに決定する。すなわち、退避処理部２２は、スレッドの処理が終了してから所定の時間が経過するまでにスレッド情報ＳＩＮＦが使用されていないスレッドを、退避対象のスレッドに決定する。
【００１７】
そして、退避処理部２２は、退避対象のスレッドのスレッド情報ＳＩＮＦを第１記憶部３０から第２記憶部４０に移動する。これにより、退避対象のスレッドに割り当てられた記憶領域は、解放され、新規のスレッドに割り当て可能になる。この結果、不要な記憶領域を解放せずに第１記憶部３０に確保し続けるメモリリークの発生を抑止することができる。
【００１８】
なお、退避処理部２２は、スレッド内で最初に実行される関数の先頭の命令の格納先を示すアドレスに基づいて退避対象のスレッドを決定してもよい。例えば、退避処理部２２は、予め指定された命令の格納先アドレスから始まる関数が最初に実行されるスレッドを、退避対象のスレッドに決定してもよい。あるいは、退避処理部２２は、スレッドの生成を指示する命令の格納先を示すアドレスに基づいて退避対象のスレッドを決定してもよい。例えば、情報処理装置１０を使用してプログラム等のソフトウェアを開発するユーザは、デバッグの対象となるスレッドの生成を指示する命令の格納先を示すアドレスを予め指定する。この場合、退避処理部２２は、デバッグの対象となるスレッドを退避対象のスレッドとして選択できる。また、退避処理部２２は、スレッドの属性にスレッドの処理の終了後にスレッド情報ＳＩＮＦが退避される属性を含むスレッドを、退避対象のスレッドに決定してもよい。
【００１９】
退避処理部２２は、スレッドの処理が終了する前に退避対象のスレッドを特定した場合、退避対象のスレッドが終了した後、所定の時間を待たずに、退避対象のスレッドのスレッド情報ＳＩＮＦを第１記憶部３０から第２記憶部４０に退避してもよい。このように、退避処理部２２は、実行部２０が実行するスレッドのうち、スレッド情報ＳＩＮＦを退避する退避対象のスレッドのスレッド情報ＳＩＮＦを、退避対象のスレッドの終了後に第１記憶部３０から第２記憶部４０に退避する。
【００２０】
なお、実行部２０は、実行中のスレッドが使用する他のスレッドのスレッド情報ＳＩＮＦが第２記憶部４０に既に退避されている場合、情報受け渡し部２４にスレッド情報ＳＩＮＦの取得を要求して、スレッド情報ＳＩＮＦを第２記憶部４０から受ける。
【００２１】
情報受け渡し部２４は、スレッド情報ＳＩＮＦの取得の要求を実行部２０から受け付けた場合、要求されたスレッド情報ＳＩＮＦを第２記憶部４０から実行部２０に転送する。すなわち、情報受け渡し部２４は、実行中のスレッドが第２記憶部４０に退避されたスレッド情報ＳＩＮＦを使用する場合、実行中のスレッドにより使用されるスレッド情報ＳＩＮＦを第２記憶部４０から実行部２０に転送する。このように、第１記憶部３０から第２記憶部４０に退避されたスレッド情報ＳＩＮＦが後続のスレッドで使用される場合でも、後続のスレッドにスレッド情報ＳＩＮＦを受け渡すことができる。この結果、後続のスレッドがスレッド情報ＳＩＮＦを使用できずに異常終了することを防止することができる。
【００２２】
第２記憶部４０は、実行部２０に転送したスレッド情報ＳＩＮＦを格納していた記憶領域を解放する。なお、第２記憶部４０は、例えば、デバッグの対象となるスレッドが退避対象のスレッドとして選択された場合等では、実行部２０に転送したスレッド情報ＳＩＮＦを格納していた記憶領域を解放せずに確保し続けてもよい。例えば、第２記憶部４０から実行部２０に転送したスレッド情報ＳＩＮＦを格納していた記憶領域を解放しない場合、ユーザがプログラム解析等を実行する際に、スレッドの終了後に第２記憶部４０に退避されたスレッド情報ＳＩＮＦにアクセスすることができる。
【００２３】
なお、情報処理装置１０の構成は、図１に示す例に限定されない。例えば、第１記憶部３０および第２記憶部４０は、同一の半導体記憶装置の異なる記憶領域にそれぞれ割り当てられてもよい。この場合、退避処理部２２は、退避対象のスレッドのスレッド情報ＳＩＮＦを、圧縮等によりデータサイズを縮小してから、第２記憶部４０に移動してもよい。
【００２４】
図２は、図１に示した情報処理装置１０の動作の一例を示す。なお、図２に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図２に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。すなわち、制御プログラムで制御される情報処理装置が図２に示す動作を実行してもよい。なお、図２に示す動作は、１つのスレッド（以下、処理対象のスレッドとも称する）に着目した場合の情報処理装置１０の動作である。情報処理装置１０は、複数のスレッドを並列に実行可能である。したがって、情報処理装置１０は、図２に示す動作を並列に実行可能である。例えば、情報処理装置１０は、スレッドを生成する関数を呼び出す度に、図２に示す動作を実行する。
【００２５】
ステップＳ１００では、情報処理装置１０は、処理対象のスレッドのスレッド情報ＳＩＮＦを記憶するための記憶領域を、第１記憶部３０に確保する。
【００２６】
次に、ステップＳ１１０では、情報処理装置１０の実行部２０は、処理対象のスレッドの実行を開始する。
【００２７】
次に、ステップＳ１２０では、実行部２０は、処理対象のスレッドが他のスレッドのスレッド情報ＳＩＮＦを使用するか否かを判定する。処理対象のスレッドが他のスレッドのスレッド情報ＳＩＮＦを使用する場合、実行部２０の動作は、ステップＳ１３０に移る。一方、処理対象のスレッドが他のスレッドのスレッド情報ＳＩＮＦを使用しない場合、実行部２０の動作は、ステップＳ１５０に移る。
【００２８】
ステップＳ１３０では、実行部２０は、他のスレッドが終了したか否かを判定する。他のスレッドが終了した場合、実行部２０の動作は、ステップＳ１４０に移る。一方、他のスレッドが終了していない場合、実行部２０の動作は、ステップＳ１３０に戻る。すなわち、実行部２０は、他のスレッドが終了していない場合、他のスレッドが終了するまで、処理対象のスレッドの処理を待機する。
【００２９】
ステップＳ１４０では、実行部２０は、他のスレッドのスレッド情報ＳＩＮＦを取得する。例えば、実行部２０は、他のスレッドのスレッド情報ＳＩＮＦが第１記憶部３０に格納されている場合、他のスレッドのスレッド情報ＳＩＮＦを第１記憶部３０から取得して、他のスレッドに割り当てられた記憶領域を解放する。
【００３０】
また、実行部２０は、他のスレッドのスレッド情報ＳＩＮＦが第２記憶部４０に退避されている場合、他のスレッドのスレッド情報ＳＩＮＦの取得を、情報処理装置１０の情報受け渡し部２４に要求する。そして、情報受け渡し部２４は、実行部２０から要求されたスレッド情報ＳＩＮＦを、第２記憶部４０から検索して実行部２０に転送する。これにより、実行部２０は、他のスレッドのスレッド情報ＳＩＮＦを第２記憶部４０から取得する。ステップＳ１４０の処理が実行された後、実行部２０の動作は、ステップＳ１５０に移る。
【００３１】
ステップＳ１５０では、実行部２０は、処理対象のスレッドが終了したか否かを判定する。処理対象のスレッドが終了した場合、情報処理装置１０の動作は、ステップＳ１６０に移る。一方、処理対象のスレッドが終了していない場合、情報処理装置１０の動作は、ステップＳ１２０に戻る。
【００３２】
ステップＳ１６０では、情報処理装置１０の退避処理部２２は、処理対象のスレッドが退避対象のスレッドか否かを判定する。例えば、退避処理部２２は、処理対象のスレッドが終了してから所定の時間が経過しても、処理対象のスレッドのスレッド情報ＳＩＮＦが後続のスレッドに使用されない場合、処理対象のスレッドを退避対象のスレッドと判定する。この場合、退避処理部２２は、処理対象のスレッドを退避対象のスレッドとして選択する。換言すれば、処理対象のスレッドは、処理が終了してから所定の時間が経過するまでにスレッド情報ＳＩＮＦが後続のスレッドに使用される場合、退避対象のスレッドとして選択されない。
【００３３】
処理対象のスレッドが退避対象のスレッドの場合、情報処理装置１０の動作は、ステップＳ１７０に移る。一方、処理対象のスレッドが退避対象のスレッドでない場合、処理対象のスレッドに対する情報処理装置１０の動作は、終了する。
【００３４】
ステップＳ１７０では、退避処理部２２は、処理対象のスレッドのスレッド情報ＳＩＮＦ、すなわち、退避対象のスレッドのスレッド情報ＳＩＮＦを、第１記憶部３０から第２記憶部４０に退避する。これにより、処理対象のスレッドに割り当てられた第１記憶部３０内の記憶領域を解放することができ、メモリリークの発生を抑止することができる。ステップＳ１７０の処理の終了により、処理対象のスレッドに対する情報処理装置１０の動作は、終了する。
【００３５】
なお、情報処理装置１０の動作は、図２に示す例に限定されない。例えば、退避処理部２２は、処理対象のスレッドが退避対象のスレッドか否かを、処理対象のスレッド内で最初に実行される関数の種類に基づいて判定してもよいし、処理対象のスレッドの生成を指示する命令の格納先を示すアドレスに基づいて判定してもよい。あるいは、退避処理部２２は、処理対象のスレッドが退避対象のスレッドか否かを、処理対象のスレッドの属性等に基づいて判定してもよい。
【００３６】
以上、図１および図２に示す実施形態では、情報処理装置１０は、スレッドの実行に使用するスレッド情報ＳＩＮＦを記憶する第１記憶部３０と第１記憶部３０から退避されるスレッド情報ＳＩＮＦを記憶する第２記憶部４０とを有する。さらに、情報処理装置１０は、スレッドを実行する実行部２０と、退避処理部２２と、情報受け渡し部２４とを有する。退避処理部２２は、実行部２０が実行するスレッドのうち、スレッド情報ＳＩＮＦを退避する退避対象のスレッドのスレッド情報ＳＩＮＦを、退避対象のスレッドの終了後に第１記憶部３０から第２記憶部４０に退避する。これにより、退避対象のスレッドに割り当てられた第１記憶部３０内の記憶領域を解放することができ、メモリリークの発生を抑止することができる。
【００３７】
また、情報受け渡し部２４は、実行中のスレッドが第２記憶部４０に退避されたスレッド情報ＳＩＮＦを使用する場合、実行中のスレッドにより使用されるスレッド情報ＳＩＮＦを第２記憶部４０から実行部２０に転送する。これにより、第１記憶部３０から第２記憶部４０に退避されたスレッド情報ＳＩＮＦが後続のスレッドで使用される場合でも、後続のスレッドにスレッド情報ＳＩＮＦを受け渡すことができる。この結果、後続のスレッドがスレッド情報ＳＩＮＦを使用できずに異常終了することを防止することができる。
【００３８】
図３は、情報処理装置の別の実施形態を示す。図１で説明した要素と同一または同様の要素については、同一または同様の符号を付し、これ等については、詳細な説明を省略する。図３に示す情報処理装置１００は、サーバ等のコンピュータ装置等であり、スレッドの生成等の機能を提供するスレッドライブラリを使用して記述されたプログラムを実行する。図３以降では、ＰＯＳＩＸ（Portable Operating System Interface）スレッドを情報処理装置１００が実行する場合を例にして説明するが、情報処理装置１００が実行するスレッドはＰＯＳＩＸスレッドに限定されない。以下、ＰＯＳＩＸスレッドは、ｐｔｈｒｅａｄとも称される。例えば、情報処理装置１００は、ｐｔｈｒｅａｄライブラリを使用して記述されたプログラムを実行する。
【００３９】
情報処理装置１００は、実行部２００、退避処理部２２０、情報受け渡し部２４０、割り当て部２６０、警告部２８０、第１記憶部３００および第２記憶部４００を有する。実行部２００、退避処理部２２０、情報受け渡し部２４０、割り当て部２６０および警告部２８０の各機能は、例えば、情報処理装置１００が制御プログラム等のソフトウェアを実行することにより実現される。すなわち、実行部２００、退避処理部２２０、情報受け渡し部２４０、割り当て部２６０および警告部２８０は、ハードウェアをソフトウェアで制御することにより実現される。なお、実行部２００、退避処理部２２０、情報受け渡し部２４０、割り当て部２６０および警告部２８０は、ハードウェアのみで実現されてもよい。また、例えば、第１記憶部３００は、ＤＲＡＭ等の半導体記憶装置であり、第２記憶部４００は、ハードディスク装置、ＳＳＤ等である。
【００４０】
実行部２００、退避処理部２２０および情報受け渡し部２４０は、図１に示した実行部２０、退避処理部２２および情報受け渡し部２４と同一または同様である。このため、図３では、割り当て部２６０および警告部２８０の動作を中心に説明する。割り当て部２６０および警告部２８０の動作を説明する前に、第１記憶部３００に記憶される情報について説明する。
【００４１】
第１記憶部３００は、例えば、管理構造体の配列ＴＤＡ、スタックの配列ＴＳＡ、世代番号の配列ＴＧＡ、未割り当てキューＦＩＤＸＱおよび循環リストＣＬＳＴを記憶する。管理構造体の配列ＴＤＡ、スタックの配列ＴＳＡおよび世代番号の配列ＴＧＡのインデックスとして、例えば、スレッドのインデックスが使用される。なお、スレッドのインデックスは、第１記憶部に記憶されるスレッド情報ＳＩＮＦを識別するためのインデックスの一例である。
【００４２】
管理構造体の配列ＴＤＡには、スレッドのコンテキストおよびスレッドの返り値等の情報が格納され、スタックの配列ＴＳＡには、スレッド内で使用するデータ等の情報が格納される。なお、管理構造体の配列ＴＤＡに格納される情報およびスタックの配列ＴＳＡに格納される情報は、スレッドの実行に使用するスレッド情報ＳＩＮＦの一例である。
【００４３】
世代番号の配列ＴＧＡには、インデックスが互いに同じスレッドを判別するための世代番号が格納される。なお、世代番号は、第１記憶部３００に記憶されるスレッド情報ＳＩＮＦと第２記憶部４００に退避されるスレッド情報ＳＩＮＦとを判別するための判別情報の一例である。
【００４４】
未割り当てキューＦＩＤＸＱには、配列ＴＤＡ、ＴＳＡのインデックスのうち、未割り当てのインデックスが格納される。未割り当てのインデックスは、スレッドに割り当てられていない配列ＴＤＡ、ＴＳＡの要素を示すインデックス、すなわち、使用可能なスレッドのインデックスである。未割り当てキューＦＩＤＸＱには、未割り当てのインデックスが重複なく、かつ、漏れなく並ぶ。循環リストＣＬＳＴは、退避対象のスレッドを決定する際に使用される。循環リストＣＬＳＴの詳細は、図５で説明する。
【００４５】
情報処理装置１００では、例えば、実行部２００が新規のスレッドの実行を開始する前に、割り当て部２６０がスレッドの資源を新規のスレッドに割り当てる。スレッドの資源は、例えば、管理構造体の配列ＴＤＡおよびスタックの配列ＴＳＡを記憶する記憶領域である。
【００４６】
例えば、実行部２００は、新規のスレッドの生成を指示する命令に基づいて、スレッドを生成する関数であるｐｔｈｒｅａｄ＿ｃｒｅａｔｅをｐｔｈｒｅａｄライブラリから呼び出す。そして、実行部２００は、スレッド情報ＳＩＮＦを記憶する記憶領域等の資源の割り当てを割り当て部２６０に要求する。
【００４７】
割り当て部２６０は、ｐｔｈｒｅａｄ＿ｃｒｅａｔｅが呼び出される度に、新規のスレッドのスレッド情報ＳＩＮＦを記憶する空き領域が第１記憶部３００に有るか否かを判定する。例えば、割り当て部２６０は、使用可能なスレッドのインデックスが未割り当てキューＦＩＤＸＱに格納されている場合、第１記憶部３００に空き領域が有ると判定する。このように、割り当て部２６０は、新規のスレッドの生成を指示する命令に基づいて、新規のスレッドのスレッド情報ＳＩＮＦを記憶する空き領域が第１記憶部３００に有るかを判定する。そして、割り当て部２６０は、第１記憶部３００に空き領域が有る場合、空き領域を新規のスレッドに割り当てる。
【００４８】
例えば、割り当て部２６０は、使用可能なスレッドのインデックスが未割り当てキューＦＩＤＸＱに格納されている場合、使用可能なスレッドのインデックスを未割り当てキューＦＩＤＸＱから取得する。そして、割り当て部２６０は、配列ＴＤＡ、ＴＳＡの要素のうち、未割り当てキューＦＩＤＸＱから取得したインデックスで示される要素（空き領域）を、新規のスレッドに割り当てる。
【００４９】
また、割り当て部２６０は、新規のスレッドが生成される度に、スレッドを識別するための識別情報ＴＩＤをスレッドのインデックスと世代番号とを用いて生成し、生成した識別情報ＴＩＤを実行部２００に通知する。なお、識別情報ＴＩＤは、ｐｔｈｒｅａｄにおいて、スレッドＩＤと呼ばれる情報である。以下、スレッドＩＤは、単に、ＴＩＤとも称される。
【００５０】
このように、新規のスレッドへの資源の割り当てが成功した場合、実行部２００は、新規のスレッドのＴＩＤを割り当て部２６０から受ける。そして、実行部２００は、割り当て部２６０から受けた新規のスレッドのＴＩＤをｐｔｈｒｅａｄ＿ｃｒｅａｔｅの引数で指定される領域に格納する。なお、割り当て部２６０が、新規のスレッドのＴＩＤをｐｔｈｒｅａｄ＿ｃｒｅａｔｅの引数で指定される領域に格納してもよい。
【００５１】
また、実行部２００は、図示しないスケジューラおよび実行待ちキューを有し、実行待ちキューに格納されたインデックスのスレッドを順次実行する。例えば、実行部２００が有するスケジューラは、割り当て部２６０から受ける新規のスレッドのインデックスを、実行待ちキューに格納する。なお、実行部２００は、割り当て部２６０から受ける新規のスレッドのＴＩＤからスレッドのインデックスを抽出し、抽出した新規のスレッドのインデックスをスケジューラに通知して実行待ちキューに格納してもよい。
【００５２】
なお、使用可能なスレッドのインデックスが未割り当てキューＦＩＤＸＱに格納されていない場合、新規のスレッドへの資源の割り当てが失敗するため、新規のスレッドは、実行されない。
【００５３】
ここで、ＰＯＳＩＸスレッド（ｐｔｈｒｅａｄ）では、スレッドの終了後にスレッドの返り値を他の１つのスレッドに渡すことができる合流可能状態と、スレッドの終了後にスレッドの返り値をどのスレッドにも渡さないデタッチ状態との２つの状態がある。スレッドの実行中では、合流可能状態とデタッチ状態との２つの状態は、一方から他方へ状態をいつでも変更可能である。
【００５４】
例えば、合流可能状態のスレッドでは、合流待ちのスレッドが存在する場合、合流可能状態のスレッドの処理の終了に伴い、返り値が合流待ちのスレッドに渡され、スレッド情報ＳＩＮＦを記憶する記憶領域等のスレッドの資源が解放される。なお、合流待ちのスレッドが存在しない場合、合流可能状態で終了したスレッドの返り値等を含むスレッド情報ＳＩＮＦは、他のスレッドに使用されるまで、あるいは、所定の時間が経過するまで、第１記憶部３００に記憶された配列ＴＤＡ、ＴＳＡに格納される。また、デタッチ状態のスレッドでは、返り値等を含むスレッド情報ＳＩＮＦを他のスレッドに渡さないため、デタッチ状態のスレッドの処理の終了に伴い、スレッド情報ＳＩＮＦを記憶する記憶領域等のスレッドの資源が解放される。
【００５５】
退避処理部２２０は、合流可能状態で終了したスレッドのうち、合流待ちのスレッドが存在しないスレッドのＴＩＤを、循環リストＣＬＳＴに格納する。また、退避処理部２２０は、スレッドの処理が終了してから所定の時間が経過するまでにスレッド情報ＳＩＮＦが使用されていないスレッドのＴＩＤを循環リストＣＬＳＴに格納されたＴＩＤから選択し、選択したＴＩＤのスレッドを退避対象のスレッドに決定する。そして、退避処理部２２０は、退避対象のスレッドのスレッド情報ＳＩＮＦを第１記憶部３００から第２記憶部４００に退避する。
【００５６】
第１記憶部３００から退避される複数のスレッド情報ＳＩＮＦを含むデータ（以下、スレッド情報ＳＩＮＦのデータリストとも称する）は、例えば、Ｂ＋木等のデータ構造を有し、第２記憶部４００に格納される。なお、以下では、スレッド情報ＳＩＮＦのデータリストのデータ構造をＢ＋木を例にして情報処理装置１００の動作を説明するが、スレッド情報ＳＩＮＦのデータリストのデータ構造は、Ｂ＋木に限定されない。
【００５７】
情報受け渡し部２４０は、実行中のスレッドが第２記憶部４００に退避された他のスレッドのスレッド情報ＳＩＮＦを使用する場合、他のスレッドのＴＩＤをキーとしてＢ＋木を検索する。そして、情報受け渡し部２４０は、Ｂ＋木の検索結果に基づいて、他のスレッドのスレッド情報ＳＩＮＦを第２記憶部４００から実行部２００に転送する。
【００５８】
警告部２８０は、退避対象のスレッドのスレッド情報ＳＩＮＦが第１記憶部３００から第２記憶部４００に退避された場合、退避対象のスレッドによりメモリリークが発生する可能性があることを図示しないコンソール等に表示し、ユーザに警告する。
【００５９】
なお、情報処理装置１００の構成は、図３に示す例に限定されない。例えば、第１記憶部３００および第２記憶部４００は、同一の半導体記憶装置の異なる記憶領域にそれぞれ割り当てられてもよい。この場合、退避処理部２２０は、退避対象のスレッドのスレッド情報ＳＩＮＦを、圧縮等によりデータサイズを縮小してから、第２記憶部４００に移動してもよい。また、例えば、世代番号の配列ＴＧＡ、未割り当てキューＦＩＤＸＱおよび循環リストＣＬＳＴは、第１記憶部３００とは別の記憶部に記憶されてもよい。
【００６０】
また、退避処理部２２０は、退避対象のスレッドを、循環リストＣＬＳＴを用いずに決定してもよい。例えば、退避処理部２２０は、合流可能状態で終了したスレッドのうち、合流待ちのスレッドが存在しないスレッドのＴＩＤに終了時刻（タイムスタンプ）を付けて、時刻をキーとする赤黒木に登録してもよい。そして、退避処理部２２０は、現在時刻より所定の時間以上前の時刻を示すタイムスタンプを有するＴＩＤを、予め設定された時刻の刻み幅毎に全て検出し、検出したＴＩＤのスレッドを退避対象のスレッドに決定してもよい。
【００６１】
図４は、図３に示した管理構造体の配列ＴＤＡ、スタックの配列ＴＳＡおよび世代番号の配列ＴＧＡの関係の一例を示す。図４に示す例では、各配列ＴＤＡ、ＴＳＡ、ＴＧＡの要素数は、（Ｎ＋１）個である。なお、各配列ＴＤＡ、ＴＳＡ、ＴＧＡの要素数は、固定されてもよいし、可変に設定されてもよい。
【００６２】
管理構造体の配列ＴＤＡ、スタックの配列ＴＳＡおよび世代番号の配列ＴＧＡは、第１記憶部３００の記憶領域を示すアドレス上で互いに分離して配置される。このため、各配列ＴＤＡ、ＴＳＡ、ＴＧＡの要素は、インデックスにより、互いに対応付けされる。例えば、図４の破線に囲まれたインデックスが“２”の配列ＴＤＡ［２］、ＴＳＡ［２］、ＴＧＡ［２］は、インデックスが“２”のスレッドに割り当てられる要素である。図４に示す例では、インデックスが“２”の現在使用中のスレッドの世代番号は、“５”である。なお、例えば、インデックスが“２”で世代番号が“４”以下のスレッドは、スレッド情報ＳＩＮＦが第１記憶部３００から第２記憶部４００に退避されたスレッドである。
【００６３】
図５は、循環リストＣＬＳＴの一例を示す。猶予時間Δは、スレッドの処理が終了してからスレッド情報ＳＩＮＦを第２記憶部４００に退避するまでの猶予時間であり、所定の時間の一例である。時刻幅εは、循環リストＣＬＳＴの格納先ポインタｉを更新する際の時刻の刻み幅である。この場合、循環リストＣＬＳＴのバッファサイズは、“Δ／ε”で表される。すなわち、循環リストＣＬＳＴは、“Δ／ε”個の要素を有する。格納先ポインタｉは、例えば、図９に示す動作で更新される大域変数である。例えば、循環リストＣＬＳＴでは、格納先ポインタｉで指定される要素にＴＩＤが新規に格納される。循環リストＣＬＳＴの各要素に格納される複数のＴＩＤ（以下、ＴＩＤのリストとも称する）は、双方向リンクリストで繋がる。例えば、格納先ポインタｉを１つ進めたインデックス（＝ｉ＋１）で指定される要素に格納されたＴＩＤのリストで指定される全てのスレッドのスレッド情報ＳＩＮＦは、時刻幅ε毎に、第１記憶部３００から第２記憶部４００に退避される。
【００６４】
図６は、図３に示した情報処理装置１００の動作の概要を示す。図６に示す例では、情報処理装置１００は、ＴＩＤが“ｔｉｄ１”のスレッド１とＴＩＤが“ｔｉｄ３”のスレッド３とを並列に実行する。そして、情報処理装置１００は、実行中のスレッド１において、ｐｔｈｒｅａｄ＿ｃｒｅａｔｅ（＆ｔｉｄ２）を実行し、新規のスレッド２を生成する（図６（ａ））。これにより、新規のスレッド２のＴＩＤとして、“ｔｉｄ２”が割り当てられ、第１記憶部３００に記憶される配列ＴＤＡ［ｔｉｄ２］、ＴＳＡ［ｔｉｄ２］等の資源がスレッド２に割り当てられる。そして、情報処理装置１００は、スレッド１、スレッド２およびスレッド３を並列に実行する。また、情報処理装置１００は、新規のスレッド２を生成した際、新規のスレッド２のＴＩＤ（＝ｔｉｄ２）をスレッド３に通知する（図６（ｂ））。
【００６５】
スレッド２は、スレッド１およびスレッド３より先に、合流可能状態で終了する（図６（ｃ））。図６に示す例では、スレッド２のスレッド情報ＳＩＮＦは、スレッド２が終了してから猶予時間Δが経過してもスレッド３等の他のスレッドに使用されない。このため、情報処理装置１００は、スレッド２が終了してから猶予時間Δが経過した場合に、スレッド２のスレッド情報ＳＩＮＦを第１記憶部３００から第２記憶部４００に退避する（図６（ｄ））。これにより、第１記憶部３００内の記憶領域のうち、スレッド２に割り当てられた記憶領域（配列ＴＤＡ［ｔｉｄ２］および配列ＴＳＡ［ｔｉｄ２］が記憶される領域）が解放される（図６（ｄ））。また、情報処理装置１００は、スレッド２のスレッド情報ＳＩＮＦが第２記憶部４００に退避されたことをユーザに警告する（図６（ｄ））。
【００６６】
また、情報処理装置１００は、実行中のスレッド３において、スレッド２のスレッド情報ＳＩＮＦを使用するために、ｐｔｈｒｅａｄ＿ｊｏｉｎ（ｔｉｄ２、ｒｅｔ）を実行する（図６（ｅ））。なお、ｐｔｈｒｅａｄ＿ｊｏｉｎは、引数で指定されたスレッド（例えば、ＴＩＤが“ｔｉｄ２”のスレッド２）が終了するまで待機する関数である。また、例えば、ｐｔｈｒｅａｄ＿ｊｏｉｎの引数で指定されるスレッドの返り値は、引数ｒｅｔで指定される領域に格納される。
【００６７】
図６に示す例では、ｐｔｈｒｅａｄ＿ｊｏｉｎ（ｔｉｄ２、ｒｅｔ）が実行される前に、スレッド２は終了する。このため、情報処理装置１００は、ｐｔｈｒｅａｄ＿ｊｏｉｎ（ｔｉｄ２、ｒｅｔ）を実行した際にスレッド３の処理を待機することなく、スレッド２の返り値を引数ｒｅｔで指定される領域に格納する。すなわち、情報処理装置１００は、第２記憶部４００に退避したスレッド２のスレッド情報ＳＩＮＦからスレッド２の返り値を取得する（図６（ｆ））。これにより、スレッド２の資源が回収される（図６（ｇ））。
【００６８】
図７は、新規のスレッドを生成する場合の情報処理装置１００の動作の一例を示す。なお、図７に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図７に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。図７に示す動作は、例えば、ｐｔｈｒｅａｄ＿ｃｒｅａｔｅが呼び出される度に実行される。
【００６９】
ステップＳ２００では、割り当て部２６０は、使用可能なスレッドのインデックスＩＤＸを未割り当てキューＦＩＤＸＱから取得する。図７に示す例では、使用可能なスレッドのインデックスＩＤＸの取得に失敗した場合、例えば、使用可能なスレッドのインデックスＩＤＸが未割り当てキューＦＩＤＸＱに格納されていない場合、負の値を有するインデックスＩＤＸが割り当て部２６０に返される。
【００７０】
次に、ステップＳ２１０では、割り当て部２６０は、未割り当てキューＦＩＤＸＱから取得したインデックスＩＤＸの値が“０”以上か否かを判定する。インデックスＩＤＸの値が“０”以上の場合、情報処理装置１００の動作は、ステップＳ２２０に移る。一方、インデックスＩＤＸの値が負の場合、すなわち、使用可能なスレッドのインデックスＩＤＸの取得に失敗した場合、情報処理装置１００の動作は、ステップＳ２５０に移る。
【００７１】
ステップＳ２２０では、割り当て部２６０は、未割り当てキューＦＩＤＸＱから取得したインデックスＩＤＸが示す管理構造体の配列ＴＤＡ［ＩＤＸ］とスタックの配列ＴＳＡ［ＩＤＸ］とを初期化する。
【００７２】
次に、ステップＳ２３０では、情報処理装置１００は、未割り当てキューＦＩＤＸＱから取得したインデックスＩＤＸを、スケジューラに通知して実行待ちキューに格納する。例えば、割り当て部２６０は、実行部２００が有するスケジューラに、未割り当てキューＦＩＤＸＱから取得したインデックスＩＤＸを通知する。そして、実行部２００が有するスケジューラは、実行部２００が有する実行待ちキューに、割り当て部２６０から通知されたインデックスＩＤＸを格納する。
【００７３】
次に、ステップＳ２４０では、情報処理装置１００は、未割り当てキューＦＩＤＸＱから取得したインデックスＩＤＸが示す世代番号の配列ＴＧＡ［ＩＤＸ］とインデックスＩＤＸとを用いて、ＴＩＤを生成する。そして、情報処理装置１００は、世代番号の配列ＴＧＡ［ＩＤＸ］とインデックスＩＤＸとを用いて生成したＴＩＤを、新規のスレッドのＴＩＤとして、ｐｔｈｒｅａｄ＿ｃｒｅａｔｅを呼び出したプログラム等の呼び出し元に返す。例えば、情報処理装置１００は、世代番号の配列ＴＧＡ［ＩＤＸ］とインデックスＩＤＸとを用いて生成したＴＩＤを、ｐｔｈｒｅａｄ＿ｃｒｅａｔｅの引数で指定される領域に格納する。これにより、新規のスレッドを生成する処理は終了する。なお、上述したように、ステップＳ２００において、使用可能なスレッドのインデックスＩＤＸの取得に失敗した場合、ステップＳ２５０の処理が実行される。
【００７４】
ステップＳ２５０では、情報処理装置１００は、資源の割り当てに失敗したことをユーザに通知して、新規のスレッドを生成する処理を異常終了する。例えば、情報処理装置１００は、資源の割り当てに失敗したことを示す表示画面をコンソール等に出力してユーザに警告し、新規のスレッドを生成する処理を異常終了する。
【００７５】
なお、新規のスレッドを生成する場合の情報処理装置１００の動作は、図７に示す例に限定されない。例えば、情報処理装置１００は、スレッドのインデックスの代わりにスレッドのＴＩＤを、実行部２００が有する実行待ちキューに格納してもよい。
【００７６】
図８は、スレッドが終了する場合の情報処理装置１００の動作の一例を示す。なお、図８に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図８に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。図８に示す動作は、例えば、スレッドが終了する度に実行される。なお、スレッドの終了の契機は、例えば、ｐｔｈｒｅａｄ＿ｃｒｅａｔｅで指定したサブルーチンの終了、ｐｔｈｒｅａｄ＿ｅｘｉｔの呼び出し、異常終了、他のスレッドからのｐｔｈｒｅａｄ＿ｃａｎｃｅｌの実行のいずれかである。なお、ｐｔｈｒｅａｄ＿ｅｘｉｔは、スレッドを終了する関数であり、ｐｔｈｒｅａｄ＿ｃａｎｃｅｌは、スレッドにキャンセル要求を送る関数である。
【００７７】
ステップＳ３００では、実行部２００は、終了したスレッドがデタッチ状態か否かを判定する。終了したスレッドがデタッチ状態の場合、情報処理装置１００の動作は、ステップＳ３３０に移る。一方、終了したスレッドがデタッチ状態でない場合、すなわち、終了したスレッドが合流可能状態の場合、情報処理装置１００の動作は、ステップＳ３２０に移る。
【００７８】
ステップＳ３２０では、実行部２００は、終了したスレッドの返り値を使用するために待機している合流待ちのスレッドが存在するか否かを判定する。合流待ちのスレッドが存在する場合、情報処理装置１００の動作は、ステップＳ３２２に移る。一方、合流待ちのスレッドが存在しない場合、情報処理装置１００の動作は、ステップＳ３４０に移る。
【００７９】
ステップＳ３２２では、情報処理装置１００は、合流待ちのスレッドのインデックスＩＤＸをスケジューラに通知して実行待ちキューに格納する。ステップＳ３２２の処理が実行された後、情報処理装置１００の動作は、ステップＳ３３０に移る。
【００８０】
ステップＳ３３０では、情報処理装置１００は、終了したスレッドのインデックスＩＤＸを未割り当てキューに戻し、終了したスレッドに関する処理を終了する。なお、上述したように、終了したスレッドが合流可能状態で、かつ、合流待ちのスレッドが存在しない場合、ステップＳ３４０の処理が実行される。
【００８１】
ステップＳ３４０では、退避処理部２２０は、終了したスレッドのＴＩＤを、図９に示す動作で更新される格納先ポインタｉ（大域変数）で指定される循環リストＣＬＳＴ［ｉ］に格納されたＴＩＤのリストの末尾に追加する。これにより、終了したスレッドに関する処理が終了する。
【００８２】
このように、退避処理部２２０は、合流可能状態で終了したスレッドのうち、合流待ちのスレッドが存在するスレッドと、スレッドの返り値を他のスレッドに渡さないデタッチ状態に設定されたスレッドとを、退避対象のスレッドから除外する。なお、スレッドが終了する場合の情報処理装置１００の動作は、図８に示す例に限定されない。
【００８３】
図９は、スレッドの資源を退避する場合の情報処理装置１００の動作の一例を示す。なお、図９に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図９に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。ステップＳ４００の処理は、例えば、ｐｔｈｒｅａｄライブラリを使用して記述されたユーザプログラム等の実行を契機に実行される。
【００８４】
ステップＳ４００では、情報処理装置１００は、循環リストＣＬＳＴを初期化する。これにより、循環リストＣＬＳＴの全ての要素はクリアされる。次に、ステップＳ４０２では、情報処理装置１００は、格納先ポインタｉを“０”に初期化する。次に、ステップＳ４０４では、情報処理装置１００は、時刻情報ｔｐに現在時刻を設定する。ステップＳ４００からステップＳ４０４までの一連の初期化処理が終了した後に、ステップＳ４２０の処理が実行される。
【００８５】
ステップＳ４２０では、情報処理装置１００は、時刻情報ｔに現在時刻を設定する。次に、ステップＳ４２２では、情報処理装置１００は、時刻情報ｔと時刻情報ｔｐとの差分（＝ｔ−ｔｐ）が時刻幅ε以上か否かを判定する。すなわち、情報処理装置１００は、時刻情報ｔｐが示す時刻から時刻幅ε以上経過したか否かを判定する。時刻情報ｔと時刻情報ｔｐとの差分（＝ｔ−ｔｐ）が時刻幅ε以上の場合、すなわち、時刻情報ｔｐが示す時刻から時刻幅ε以上経過した場合、情報処理装置１００の動作は、ステップＳ４４０に移る。一方、時刻情報ｔと時刻情報ｔｐとの差分（＝ｔ−ｔｐ）が時刻幅εより小さい場合、情報処理装置１００の動作は、ステップＳ４２０に戻る。すなわち、ステップＳ４４０の処理は、時刻幅εと同じ時間またはほぼ同じ時間が経過する度に実行される。
【００８６】
ステップＳ４４０では、退避処理部２２０は、格納先ポインタｉを１つ進めた値に変数ｉ１を更新する。変数ｉ１は、例えば、剰余演算子ｍｏｄを用いて、“ｉ１＝（ｉ＋１）ｍｏｄ（Δ／ε）”で表される。
【００８７】
次に、ステップＳ４６０では、情報処理装置１００は、図１０に示す退避処理を実行する。退避処理により、変数ｉ１で指定される循環リストＣＬＳＴ［ｉ１］に格納されたＴＩＤのスレッドのスレッド情報ＳＩＮＦが第１記憶部３００から第２記憶部４００に退避され、変数ｉ１で指定される循環リストＣＬＳＴ［ｉ１］がクリアされる。
【００８８】
次に、ステップＳ４８０では、情報処理装置１００は、格納先ポインタｉを変数ｉ１の値に更新する（ｉ＝ｉ１）。これにより、例えば、図８に示したステップＳ３４０において、ステップＳ４６０の退避処理によりクリアされた循環リストＣＬＳＴの要素にＴＩＤが格納される。
【００８９】
次に、ステップＳ４８２では、情報処理装置１００は、時刻情報ｔｐに、時刻情報ｔが示す時刻を設定する（ｔｐ＝ｔ）。これにより、時刻情報ｔｐが更新される。格納先ポインタｉおよび時刻情報ｔｐが更新された後（ステップＳ４８０およびステップＳ４８２の一連の更新処理が終了した後）、情報処理装置１００の動作は、ステップＳ４２０に戻る。
【００９０】
このように、ステップＳ４６０の退避処理は、時刻幅εと同じ時間またはほぼ同じ時間が経過する度に実行される。したがって、退避処理でクリアされる循環リストＣＬＳＴ［ｉ１］に格納されたＴＩＤは、スレッドの処理が終了してから猶予時間Δ（＝時刻幅ε×循環リストＣＬＳＴの要素数（Δ／ε））または猶予時間Δとほぼ同じ時間だけ経過したスレッドのＴＩＤである。すなわち、図９に示す動作では、スレッド情報ＳＩＮＦの退避が猶予時間Δだけ猶予される。
【００９１】
これにより、例えば、スレッドの終了から猶予時間Δ以内に、終了したスレッドに対して、ｐｔｈｒｅａｄ＿ｊｏｉｎを実行するスレッドは、第１記憶部３００に格納されたスレッド情報ＳＩＮＦから返り値を読み出すことができる。第１記憶部３００に対するアクセス時間が第２記憶部４００に対するアクセス時間より短い場合、第１記憶部３００から返り値を読み出すことにより、第２記憶部４００から返り値を読み出す場合に比べて、返り値の取得に掛かる時間を短くすることができる。換言すれば、第２記憶部４００に格納されたスレッド情報ＳＩＮＦから返り値を読み出す場合、第１記憶部３００から返り値を読み出す場合に比べて、返り値の取得に掛かる時間が増加し、実行時間のペナルティが増加する。したがって、図９に示す動作では、スレッド情報ＳＩＮＦの退避を猶予時間Δだけ猶予することにより、ｐｔｈｒｅａｄ＿ｊｏｉｎを実行するスレッドに対する実行時間のペナルティの増加を抑制することができる。
【００９２】
また、図９に示す動作は、スレッドの終了直後にスレッド情報ＳＩＮＦの退避が実行される場合に比べて、他のスレッドに使用される可能性があるスレッドのスレッド情報ＳＩＮＦが第２記憶部４００に退避されることを低減することができる。他のスレッドに使用される可能性があるスレッドのスレッド情報ＳＩＮＦは、例えば、プログラムのバグまたは意図的にメモリ上に未解放のまま残るスレッド情報ＳＩＮＦ以外のスレッド情報ＳＩＮＦである。
【００９３】
図１０は、図９に示した退避処理の一例を示す。すなわち、ステップＳ４６２の処理は、図９に示したステップＳ４４０により変数ｉ１が更新された後、実行される。したがって、図１０に示す変数ｉ１の値は、図９に示したステップＳ４４０により更新された値である。
【００９４】
ステップＳ４６２では、退避処理部２２０は、変数ｉ１で指定される循環リストＣＬＳＴ［ｉ１］が空か否かを判定する。循環リストＣＬＳＴ［ｉ１］が空の場合、すなわち、循環リストＣＬＳＴ［ｉ１］にＴＩＤが格納されていない場合、退避処理は終了し、情報処理装置１００の動作は、図９に示したステップＳ４８０に移る。一方、循環リストＣＬＳＴ［ｉ１］が空でない場合、すなわち、循環リストＣＬＳＴ［ｉ１］にＴＩＤが格納されている場合、情報処理装置１００の動作は、ステップＳ４６４に移る。
【００９５】
ステップＳ４６４では、退避処理部２２０は、循環リストＣＬＳＴ［ｉ１］に格納されたＴＩＤのリストの先頭のＴＩＤｔを読み出してＴＩＤのリストから削除する。なお、図１０では、ステップＳ４６６からステップＳ４７２の一連の処理の対象となるスレッドのＴＩＤと他のスレッドのＴＩＤとを区別するために、ステップＳ４６４で読み出されるＴＩＤは、ＴＩＤの末尾に“ｔ”を付してＴＩＤｔと称される。また、以下では、ＴＩＤｔが示すスレッドのインデックスＩＤＸは、ＴＩＤｔ．ＩＤＸとも称され、ＴＩＤｔが示すスレッドの世代番号は、ＴＩＤｔ．ＧＥＮとも称される。
【００９６】
次に、ステップＳ４６６では、退避処理部２２０は、ＴＩＤｔ．ＩＤＸで指定される世代番号の配列ＴＧＡ［ＴＩＤｔ．ＩＤＸ］の値を“１”増加する（ＴＧＡ［ＴＩＤｔ．ＩＤＸ］＋＋）。これにより、世代番号の配列ＴＧＡ［ＴＩＤｔ．ＩＤＸ］の値は、ＴＩＤｔ．ＧＥＮより１つ大きい世代番号に更新される。この結果、例えば、第２記憶部４００にスレッド情報ＳＩＮＦが退避されたスレッドのインデックスＩＤＸが再利用される場合でも、ＴＩＤの一意性を保証することができる。
【００９７】
次に、ステップＳ４６８では、退避処理部２２０は、ＴＩＤｔ．ＩＤＸを未割り当てキューＦＩＤＸＱに戻す。これにより、ＴＩＤｔのスレッドに割り当てられた資源（配列ＴＤＡ［ＴＩＤｔ．ＩＤＸ］、配列ＴＳＡ［ＴＩＤｔ．ＩＤＸ］等）が解放される。
【００９８】
次に、ステップＳ４７０では、警告部２８０は、退避対象のスレッド（ＴＩＤｔのスレッド）でメモリリークの発生の可能性があることを警告する。例えば、退避処理部２２０は、ＴＩＤｔを警告部２８０に通知する。そして、警告部２８０は、退避対象のスレッド（ＴＩＤｔのスレッド）でメモリリークの発生の可能性があることを示す表示画面を、コンソール等に出力する。
【００９９】
次に、ステップＳ４７２では、退避処理部２２０は、管理構造体の配列ＴＤＡ［ＴＩＤｔ．ＩＤＸ］とスタックの配列ＴＳＡ［ＴＩＤｔ．ＩＤＸ］と現在時刻とを含むデータを、ＴＩＤｔをキーとしてＢ＋木に登録する。これにより、管理構造体の配列ＴＤＡ［ＴＩＤｔ．ＩＤＸ］とスタックの配列ＴＳＡ［ＴＩＤｔ．ＩＤＸ］とを含むスレッド情報ＳＩＮＦが第１記憶部３００から第２記憶部４００に退避される。なお、Ｂ＋木に登録されるデータに含まれる現在時刻は、スレッド情報ＳＩＮＦが第１記憶部３００から第２記憶部４００に退避される退避時刻を示す。退避時刻を示す現在時刻は、Ｂ＋木に登録されるデータから省かれてもよい。また、ＴＩＤｔのスレッドの実行が再開されることがないため、Ｂ＋木に登録されるデータは、管理構造体の配列ＴＤＡ［ＴＩＤｔ．ＩＤＸ］とスタックの配列ＴＳＡ［ＴＩＤｔ．ＩＤＸ］とを含むスレッド情報ＳＩＮＦから間引いた情報でもよい。ステップＳ４７２の処理が実行された後、情報処理装置１００の動作は、ステップＳ４６２に戻る。
【０１００】
このように、退避処理部２２０は、図９に示したステップＳ４４０により更新された変数ｉ１で指定される循環リストＣＬＳＴ［ｉ１］に格納されたＴＩＤのスレッドを退避対象のスレッドに決定する。なお、スレッドの資源を退避する場合の情報処理装置１００の動作は、図９および図１０に示す例に限定されない。
【０１０１】
図１１は、他のスレッドの返り値を使用する場合の情報処理装置１００の動作の一例を示す。なお、図１１に示す動作は、情報処理装置の制御方法および情報処理装置の制御プログラムの一態様である。例えば、図１１に示す動作は、ハードウェアのみで実現されてもよく、ハードウェアを制御プログラム等のソフトウェアで制御することにより実現されてもよい。図１１に示す動作は、例えば、ｐｔｈｒｅａｄ＿ｊｏｉｎが呼び出される度に実行される。図１１に示す例では、情報処理装置１００は、ＴＩＤｏのスレッドの返り値（他のスレッドの返り値）をｐｔｈｒｅａｄ＿ｊｏｉｎの引数ｒｅｔで指定される領域に格納する。また、図１１では、ＴＩＤｏが示すスレッドのインデックスＩＤＸは、ＴＩＤｏ．ＩＤＸとも称され、ＴＩＤｏが示すスレッドの世代番号は、ＴＩＤｏ．ＧＥＮとも称される。
【０１０２】
ステップＳ５００では、実行部２００は、ＴＩＤｏ．ＧＥＮが世代番号の配列ＴＧＡ［ＴＩＤｏ．ＩＤＸ］より小さいか否かを判定する。すなわち、実行部２００は、ＴＩＤｏ．ＧＥＮが現在使用中の世代番号より小さいか否かを判定する。世代番号の配列ＴＧＡ［ＴＩＤｏ．ＩＤＸ］より小さいＴＩＤｏ．ＧＥＮは、ＴＩＤｏのスレッドのスレッド情報ＳＩＮＦが第２記憶部４００に退避されたことを示す。また、世代番号の配列ＴＧＡ［ＴＩＤｏ．ＩＤＸ］と同じ値のＴＩＤｏ．ＧＥＮは、ＴＩＤｏのスレッドのスレッド情報ＳＩＮＦが第２記憶部４００に退避されていないことを示す。ＴＩＤｏ．ＧＥＮが世代番号の配列ＴＧＡ［ＴＩＤｏ．ＩＤＸ］より小さい場合、情報処理装置１００の動作は、ステップＳ５１０に移る。一方、ＴＩＤｏ．ＧＥＮが世代番号の配列ＴＧＡ［ＴＩＤｏ．ＩＤＸ］以上の場合、情報処理装置１００の動作は、ステップＳ５４０に移る。
【０１０３】
ステップＳ５１０では、情報受け渡し部２４０は、ＴＩＤｏをキーとしてＢ＋木を検索する。例えば、実行部２００は、ＴＩＤｏを情報受け渡し部２４に通知することにより、ＴＩＤｏのスレッドの返り値の取得を情報受け渡し部２４に要求する。そして、情報受け渡し部２４０は、実行部２００から通知されたＴＩＤｏをキーとしてＢ＋木を検索する。
【０１０４】
次に、ステップＳ５２０では、情報受け渡し部２４０は、ＴＩＤｏをキーとするデータ（ステップＳ５１０で検索したデータ）に含まれる返り値ＲＮＶｏを、呼び出し元のスレッド（ｐｔｈｒｅａｄ＿ｊｏｉｎを呼び出したスレッド）に受け渡す。例えば、情報受け渡し部２４０は、ＴＩＤｏをキーとするデータに含まれる返り値ＲＮＶｏを、ｐｔｈｒｅａｄ＿ｊｏｉｎの引数ｒｅｔで指定される領域に格納する（ｒｅｔ＝ＲＮＶｏ）。これにより、実行部２００は、ＴＩＤｏのスレッドの返り値ＲＮＶｏを、ｐｔｈｒｅａｄ＿ｊｏｉｎの引数ｒｅｔで指定される領域から取得できる。なお、情報受け渡し部２４０は、返り値ＲＮＶｏを実行部２００に通知してもよい。この場合、実行部２００は、情報受け渡し部２４０から通知された返り値ＲＮＶｏを、ｐｔｈｒｅａｄ＿ｊｏｉｎの引数ｒｅｔで指定される領域に格納してもよい。
【０１０５】
次に、ステップＳ５３０では、情報受け渡し部２４０は、キーＴＩＤｏをＢ＋木から削除する。これにより、ＴＩＤｏのスレッドの資源が第２記憶部４００から解放され、ＴＩＤｏのスレッドのスレッド情報ＳＩＮＦが第２記憶部４００に退避されている場合の処理は終了する。なお、上述したように、ＴＩＤｏのスレッドのスレッド情報ＳＩＮＦが第２記憶部４００に退避されていない場合、ステップＳ５４０の処理が実行される。
【０１０６】
ステップＳ５４０では、実行部２００は、ＴＩＤｏのスレッド（他のスレッド）が実行中か否かを判定する。ＴＩＤｏのスレッドが実行中の場合、情報処理装置１００の動作は、ステップＳ５５０に移る。一方、ＴＩＤｏのスレッドが実行中でない場合、情報処理装置１００の動作は、ステップＳ５６０に移る。すなわち、ＴＩＤｏのスレッドが終了し、かつ、ＴＩＤｏのスレッドのスレッド情報ＳＩＮＦが第１記憶部３００に格納されている場合、情報処理装置１００の動作は、ステップＳ５６０に移る。
【０１０７】
ステップＳ５５０では、実行部２００は、呼び出し元のスレッド（ｐｔｈｒｅａｄ＿ｊｏｉｎを呼び出したスレッド）の処理を、ＴＩＤｏのスレッドが終了するまで待機する。ＴＩＤｏのスレッドの処理が終了した場合、情報処理装置１００の動作は、ステップＳ５７０に移る。
【０１０８】
ステップＳ５６０では、退避処理部２２０は、ＴＩＤｏを循環リストＣＬＳＴから削除する。これにより、ＴＩＤｏのスレッドは、退避対象のスレッドから除外される。このように、プログラムのバグまたは意図的にメモリ上に未解放のまま残るスレッド情報ＳＩＮＦ以外のスレッド情報ＳＩＮＦ（他のスレッドに使用されるスレッド情報ＳＩＮＦ）が退避されることを低減することができる。ステップＳ５６０の処理が実行された後、情報処理装置１００の動作は、ステップＳ５７０に移る。
【０１０９】
ステップＳ５７０では、情報処理装置１００は、管理構造体の配列ＴＤＡ［ＴＩＤｏ．ＩＤＸ］に含まれる返り値ＲＮＶｏを、呼び出し元のスレッド（ｐｔｈｒｅａｄ＿ｊｏｉｎを呼び出したスレッド）に受け渡す。例えば、情報処理装置１００は、管理構造体の配列ＴＤＡ［ＴＩＤｏ．ＩＤＸ］に含まれる返り値ＲＮＶｏを、ｐｔｈｒｅａｄ＿ｊｏｉｎの引数ｒｅｔで指定される領域に格納する（ｒｅｔ＝ＲＮＶｏ）。これにより、ＴＩＤｏのスレッドの資源が第１記憶部３００から解放され、ＴＩＤｏのスレッドのスレッド情報ＳＩＮＦが第２記憶部４００に退避されていない場合の処理は終了する。
【０１１０】
なお、他のスレッドの返り値を使用する場合の情報処理装置１００の動作は、図１１に示す例に限定されない。例えば、ステップＳ５３０は、省かれてもよい。この場合、例えば、ユーザがプログラム解析等を実行する際に、スレッドの終了後に第２記憶部４００に退避されたスレッド情報ＳＩＮＦにアクセスすることができる。
【０１１１】
以上、図３から図１１に示す実施形態では、情報処理装置１００は、スレッドの実行に使用するスレッド情報ＳＩＮＦを記憶する第１記憶部３００と第１記憶部３００から退避されるスレッド情報ＳＩＮＦを記憶する第２記憶部４００とを有する。さらに、情報処理装置１００は、スレッドを実行する実行部２００と、退避処理部２２０と、情報受け渡し部２４０と、割り当て部２６０と、警告部２８０とを有する。退避処理部２２０は、実行部２００が実行するスレッドのうち、スレッド情報ＳＩＮＦを退避する退避対象のスレッドのスレッド情報ＳＩＮＦを、退避対象のスレッドの終了後に第１記憶部３００から第２記憶部４００に退避する。これにより、退避対象のスレッドに割り当てられた第１記憶部３００内の記憶領域を解放することができ、メモリリークの発生を抑止することができる。
【０１１２】
また、例えば、退避処理部２２０は、スレッド情報ＳＩＮＦの退避を猶予時間Δだけ猶予する。この場合、スレッドの終了直後にスレッド情報ＳＩＮＦの退避が実行される場合に比べて、他のスレッドのスレッド情報ＳＩＮＦを使用するスレッドに対する実行時間のペナルティの増加を抑制することができる。また、スレッドの終了直後にスレッド情報ＳＩＮＦの退避が実行される場合に比べて、プログラムのバグまたは意図的にメモリ上に未解放のまま残るスレッド情報ＳＩＮＦ以外のスレッド情報ＳＩＮＦが退避されることを低減できる。
【０１１３】
また、情報受け渡し部２４０は、実行中のスレッドが第２記憶部４００に退避されたスレッド情報ＳＩＮＦを使用する場合、実行中のスレッドにより使用されるスレッド情報ＳＩＮＦを第２記憶部４００から実行部２０に転送する。これにより、第１記憶部３００から第２記憶部４００に退避されたスレッド情報ＳＩＮＦが後続のスレッドで使用される場合でも、後続のスレッドにスレッド情報ＳＩＮＦを受け渡すことができる。この結果、後続のスレッドがスレッド情報ＳＩＮＦを使用できずに異常終了することを防止することができる。
【０１１４】
また、割り当て部２６０は、新規のスレッドに資源を割り当てる場合に、スレッドを識別するための識別情報ＴＩＤをスレッドのインデックスと世代番号とを用いて生成し、生成した識別情報ＴＩＤを実行部２００に通知する。これにより、情報処理装置１００は、第２記憶部４００にスレッド情報ＳＩＮＦが退避されたスレッドのインデックスＩＤＸを再利用する場合でも、ＴＩＤの一意性を保証できる。
【０１１５】
図１２は、情報処理装置の制御プログラムを実行するハードウェアの一例を示す。なお、図１から図１１で説明した要素と同一または同様の要素については、同一または同様の符号を付し、これ等については、詳細な説明を省略する。例えば、コンピュータ装置１０００は、情報処理装置の制御プログラムを実行することにより、図１および図３に示した情報処理装置１０、１００等の機能を実現する。
【０１１６】
コンピュータ装置１０００は、例えば、プロセッサ１１００、メモリ１２００、ハードディスク装置１３００、入力インタフェース１４００、出力インタフェース１５００およびドライブ装置１６００を有する。プロセッサ１１００、メモリ１２００、ハードディスク装置１３００、入力インタフェース１４００、出力インタフェース１５００およびドライブ装置１６００は、バス１７００に接続される。情報処理装置１０、１００等の機能は、例えば、プロセッサ１１００と、メモリ１２００と、ハードディスク装置１３００と、入力インタフェース１４００と、出力インタフェース１５００とにより実現される。
【０１１７】
ドライブ装置１６００は、リムーバブルメディア１６２０を装着可能であり、装着したリムーバブルメディア１６２０に記録された情報の読み出しおよび記録を実行する。リムーバブルメディア１６２０は、例えば、ＣＤ−ＲＯＭ（Compact Disc Read only memory）、ＤＶＤ（Digital Versatile Disc）、ＵＳＢ（Universal Serial Bus）メモリ等である。
【０１１８】
また、コンピュータ装置１０００は、入力インタフェース１４００および出力インタフェース１５００を介してコンピュータ装置１０００の外部と通信する。例えば、入力インタフェース１４００は、キーボードやマウス等の図示しない入力装置に接続される。出力インタフェース１５００は、例えば、表示装置１８００に接続され、メモリリークの発生の可能性があることを示す警告等の表示画面を表示装置１８００に出力する。
【０１１９】
メモリ１２００は、例えば、コンピュータ装置１０００のオペレーティングシステム、情報処理装置の制御プログラム等を格納する。また、メモリ１２００は、例えば、管理構造体の配列ＴＤＡ、スタックの配列ＴＳＡ等のスレッド情報ＳＩＮＦを記憶してもよい。そして、ハードディスク装置１３００は、メモリ１２００から退避されるスレッド情報ＳＩＮＦを記憶してもよい。
【０１２０】
情報処理装置の制御プログラム等のソフトウェアは、リムーバブルメディア１６２０に記録して頒布することができる。例えば、コンピュータ装置１０００は、情報処理装置の制御プログラム等のソフトウェアを、リムーバブルメディア１６２０からドライブ装置１６００を介して読み出し、メモリ１２００やハードディスク装置１３００に格納してもよい。すなわち、リムーバブルメディア１６２０は、情報処理装置の制御プログラムを記録し、コンピュータが読み取り可能な記録媒体の一例である。
【０１２１】
また、コンピュータ装置１０００は、情報処理装置の制御プログラム等のソフトウェアを、インターネット等のネットワークに接続する通信装置（図示せず）を介してダウンロードし、メモリ１２００やハードディスク装置１３００に格納してもよい。
【０１２２】
なお、情報処理装置の制御プログラムを実行するハードウェアは、図１２に示す例に限定されない。例えば、コンピュータ装置１０００は、ドライブ装置１６００が省かれてもよい。また、例えば、コンピュータ装置１０００は、ハードディスク装置１３００の代わりにＳＳＤ（Solid State Drive）等を有してもよい。
【０１２３】
以上の実施形態において説明した発明を整理して、付記として以下の通り開示する。
（付記１）
スレッドを実行する実行部と、
前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、
前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部と、
前記実行部が実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避する退避処理部と、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する情報受け渡し部と
を有することを特徴とする情報処理装置。
（付記２）
付記１に記載の情報処理装置において、
前記退避処理部は、スレッドの処理が終了してから所定の時間が経過するまでに前記スレッド情報が使用されていないスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
（付記３）
付記２に記載の情報処理装置において、
前記退避処理部は、スレッドの返り値を他のスレッドに渡さないスレッドを、前記退避対象のスレッドから除外する
ことを特徴とする情報処理装置。
（付記４）
付記１ないし付記３のいずれか１項に記載の情報処理装置において、
前記退避処理部は、スレッド内で最初に実行される関数の種類に基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
（付記５）
付記１ないし付記４のいずれか１項に記載の情報処理装置において、
前記退避処理部は、スレッドの生成を指示する命令の格納先を示すアドレスに基づいて前記退避対象のスレッドを決定する
ことを特徴とする情報処理装置。
（付記６）
付記１ないし付記５のいずれか１項に記載の情報処理装置において、
前記退避処理部は、スレッドの属性にスレッドの処理の終了後に前記スレッド情報が退避される属性を含むスレッドを、前記退避対象のスレッドに決定する
ことを特徴とする情報処理装置。
（付記７）
付記１ないし付記６のいずれか１項に記載の情報処理装置において、
新規のスレッドの生成を指示する命令に基づいて、前記新規のスレッドの前記スレッド情報を記憶する空き領域が前記第１記憶部に有るかを判定し、前記第１記憶部に前記空き領域が有る場合、前記空き領域を前記新規のスレッドのスレッド情報に割り当てる割り当て部をさらに有する
ことを特徴とする情報処理装置。
（付記８）
付記７に記載の情報処理装置において、
前記割り当て部は、前記新規のスレッドが生成される度に、スレッドを識別するための識別情報を、前記第１記憶部に記憶される前記スレッド情報を識別するためのインデックスと、前記第１記憶部に記憶される前記スレッド情報と前記第２記憶部に退避される前記スレッド情報とを判別するための判別情報とを用いて生成し、生成した前記識別情報を前記実行部に通知する
ことを特徴とする情報処理装置。
（付記９）
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部とを含む情報処理装置の制御方法において、
前記情報処理装置が、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避し、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する
ことを特徴とする情報処理装置の制御方法。
（付記１０）
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部とを含む情報処理装置の制御プログラムにおいて、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避し、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する
処理を前記情報処理装置に実行させるための制御プログラム。
（付記１１）
スレッドを実行する実行部と、前記スレッドの実行に使用されうるスレッド情報を記憶する第１記憶部と、前記第１記憶部から退避される前記スレッド情報を記憶する第２記憶部とを含む情報処理装置の制御プログラムを記録した記録媒体であって、
実行するスレッドのうち、前記スレッド情報を退避する退避対象のスレッドの実行の終了後に、前記退避対象のスレッドのスレッド情報を前記第１記憶部から前記第２記憶部に退避し、
実行中のスレッドが前記第２記憶部に退避された前記スレッド情報を使用する場合、実行中のスレッドにより使用される前記スレッド情報を前記第２記憶部から前記実行部に転送する
処理を前記情報処理装置に実行させるための制御プログラムを記録したことを特徴とする記録媒体。
【０１２４】
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。
【符号の説明】
【０１２５】
１０、１００‥情報処理装置；２０、２００‥実行部；２２、２２０‥退避処理部；２４、２４０‥情報受け渡し部；３０、３００‥第１記憶部；４０、４００‥第２記憶部；２６０‥割り当て部；２８０‥警告部；１０００‥コンピュータ装置；１１００‥プロセッサ；１２００‥メモリ；１３００‥ハードディスク装置；１４００‥入力インタフェース；１５００‥出力インタフェース；１６００‥ドライブ装置；１６２０‥リムーバブルメディア；１７００‥バス；１８００‥表示装置
【図１】
2018147068.tif 000003
【図２】
2018147068.tif 000004
【図３】
2018147068.tif 000005
【図４】
2018147068.tif 000006
【図５】
2018147068.tif 000007
【図６】
2018147068.tif 000008
【図７】
2018147068.tif 000009
【図８】
2018147068.tif 000010
【図９】
2018147068.tif 000011
【図１０】
2018147068.tif 000012
【図１１】
2018147068.tif 000013
【図１２】
2018147068.tif 000014