(57)【要約】【課題】  複数スレッドがメモリ領域を並列にアクセスする状況においてエラーのない効率的なメモリ領域割り当てを実現する。【解決手段】  スレッド毎の進入時刻情報を記録したスレッド情報からなるスレッドリストをスレッド管理情報として保持し、メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当てに際して、リリースキューの各キューに設定された開放要求時刻と、スレッドリストの最古進入時刻との比較を実行し、開放要求時刻が最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当て処理を実行する。本構成により、アクセス対象となっていないメモリ領域のみを確実に選択して割り当てることが可能となる。【選択図】  図１４
2006127463.tif 000002
【特許請求の範囲】
【請求項１】
情報処理装置であり、
データ処理単位としてのスレッド情報を管理するスレッド管理部と、
メモリ領域の管理を実行するメモリ領域管理部とを有し、
前記スレッド管理部は、各データ処理プログラムからのオペレーティングシステムの機能呼出時刻としての進入時刻情報をスレッド毎に記録したスレッドリストをスレッド管理情報として保持し、
前記メモリ領域管理部は、開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻と、前記スレッドリストの各要素中の最古進入時刻との比較を実行し、開放要求時刻が前記最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当てを実行する構成であることを特徴とする情報処理装置。
【請求項２】
前記スレッド管理部は、
複数プロセッサ各々に対応するスレッドリストを生成し、各スレッドリストのヘッダ部に、スレッドリストに含まれるスレッド情報に設定さたれ進入時刻情報中の最古の進入時刻を記録し、該記録情報を他プロセッサから参照可能な設定として管理する構成を有することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記メモリ領域管理部は、
前記スレッド管理部の管理するプロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報をすべて参照し、全てのプロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報中、最も古い最古進入時刻を選択し、該選択最古進入時刻と、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻との比較を実行し、開放要求時刻が前記選択最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当てを実行する構成であることを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記スレッド管理部は、
前記スレッドリストのヘッダおよびリスト構成要素に他のリスト構成要素の識別情報を記録し、ヘッダから順次各構成要素を取得可能な構成を持つリストとしてスレッドリストを構築し、スレッドの進入、退出に際して、ヘッダまたはリスト構成要素に設定された識別情報の更新処理を実行する構成であることを特徴とする請求項１に記載の情報処理装置。
【請求項５】
前記メモリ領域管理部は、
前記リリースキューのヘッダおよびキュー要素に他のキュー要素の識別情報を記録し、ヘッダから順次各キュー要素を取得可能な構成を持つリストとしてリリースキューを構築し、新たなキューの設定、またはキューの削除処理に際して、ヘッダまたはキュー要素に設定された識別情報の更新処理を実行する構成であることを特徴とする請求項１に記載の情報処理装置。
【請求項６】
前記メモリ領域管理部は、
プロセッサに対応して設定される有限サイズのメモリ領域としてのヒープ単位でのメモリ管理処理を実行する構成であり、開放要求があり未開放のヒープについてヒープ単位の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、前記リリースキューに含まれるヒープ単位の各キュー要素に記録されたメモリ領域の割り当てを実行する構成であることを特徴とする請求項１に記載の情報処理装置。
【請求項７】
前記メモリ領域管理部は、
メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、
前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタを構成要素とするｗｅａｋポインタチェーンの検証を実行し、該ｗｅａｋポインタチェーンにｗｅａｋポインタが存在しない場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行する構成であることを特徴とする請求項１に記載の情報処理装置。
【請求項８】
前記メモリ領域管理部は、
メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、
前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタと該ｗｅａｋポインタの参照領域を含むメモリ領域を構成要素とするｗｅａｋポインタチェーンに含まれるメモリ領域のリタイア済みフラグを検証し、該リタイア済みフラグがリタイア済みであることを示す場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行する構成であることを特徴とする請求項１に記載の情報処理装置。
【請求項９】
メモリ領域管理方法であり、
各データ処理プログラムからのオペレーティングシステムの機能呼出時刻としての進入時刻情報をスレッド毎に記録したスレッド情報からなるスレッドリストを生成、更新するスレッド管理ステップと、
メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として生成、更新するメモリ領域管理ステップと、
メモリ領域の割り当て処理に際して、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻と、前記スレッドリストの各要素中の最古進入時刻との比較を実行し、開放要求時刻が前記最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当て処理を実行するメモリ領域割り当てステップと、
を有することを特徴とするメモリ領域管理方法。
【請求項１０】
前記スレッド管理ステップは、
複数プロセッサ各々に対応するスレッドリストを生成し、各スレッドリストのヘッダ部に、スレッドリストに含まれるスレッド情報に設定さたれ進入時刻情報中の最古の進入時刻を記録し、該記録情報を他プロセッサから参照可能な設定として管理することを特徴とする請求項９に記載のメモリ領域管理方法。
【請求項１１】
前記メモリ領域割り当てステップは、
プロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報をすべて参照し、全てのプロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報中、最も古い最古進入時刻を選択し、該選択最古進入時刻と、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻との比較を実行し、開放要求時刻が前記選択最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当てを実行することを特徴とする請求項１０に記載のメモリ領域管理方法。
【請求項１２】
前記スレッド管理ステップは、
前記スレッドリストのヘッダおよびリスト構成要素に他のリスト構成要素の識別情報を記録し、ヘッダから順次各構成要素を取得可能な構成を持つリストとしてスレッドリストを構築し、スレッドの進入、退出に際して、ヘッダまたはリスト構成要素に設定された識別情報の更新処理を実行するステップを含むことを特徴とする請求項９に記載のメモリ領域管理方法。
【請求項１３】
前記メモリ領域管理ステップは、
前記リリースキューのヘッダおよびキュー要素に他のキュー要素の識別情報を記録し、ヘッダから順次各キュー要素を取得可能な構成を持つリストとしてリリースキューを構築し、新たなキューの設定、またはキューの削除処理に際して、ヘッダまたはキュー要素に設定された識別情報の更新処理を実行するステップを含むことを特徴とする請求項９に記載のメモリ領域管理方法。
【請求項１４】
前記メモリ領域管理ステップは、
プロセッサに対応して設定される有限サイズのメモリ領域としてのヒープ単位でのメモリ管理処理を実行し、開放要求があり未開放のヒープについてヒープ単位の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、
前記メモリ領域割り当てステップは、
前記リリースキューに含まれるヒープ単位の各キュー要素に記録されたメモリ領域の割り当てを実行することを特徴とする請求項９に記載のメモリ領域管理方法。
【請求項１５】
前記メモリ領域管理ステップは、
メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、
前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタを構成要素とするｗｅａｋポインタチェーンの検証を実行し、該ｗｅａｋポインタチェーンにｗｅａｋポインタが存在しない場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行するステップを含むことを特徴とする請求項９に記載のメモリ領域管理方法。
【請求項１６】
前記メモリ領域管理ステップは、
メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、
前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタと該ｗｅａｋポインタの参照領域を含むメモリ領域を構成要素とするｗｅａｋポインタチェーンに含まれるメモリ領域のリタイア済みフラグを検証し、該リタイア済みフラグがリタイア済みであることを示す場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行するステップを含むことを特徴とする請求項９に記載のメモリ領域管理方法。
【請求項１７】
メモリ領域管理処理を実行するコンピュータ・プログラムであり、
各データ処理プログラムからのオペレーティングシステムの機能呼出時刻としての進入時刻情報をスレッド毎に記録したスレッド情報からなるスレッドリストを生成、更新するスレッド管理ステップと、
メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として生成、更新するメモリ領域管理ステップと、
メモリ領域の割り当て処理に際して、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻と、前記スレッドリストの各要素中の最古進入時刻との比較を実行し、開放要求時刻が前記最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当て処理を実行するメモリ領域割り当てステップと、
を有することを特徴とするコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、メモリ領域管理方法、並びにコンピュータ・プログラムに関する。さらに詳細には、複数のスレッドが並行にメモリ領域を参照し更新する構成において、適切なメモリ領域の割り当ておよびメモリ管理処理を実現する情報処理装置、メモリ領域管理方法、並びにコンピュータ・プログラムに関する。
【背景技術】
【０００２】
単一のあるいは複数のオペレーティングシステム（ＯＳ）上で、複数のデータ処理プログラムを実行する場合、システムで共通のハードウェア、すなわちＣＰＵやメモリ等を時系列に順次切り替えて利用した処理が行なわれる。
【０００３】
複数ＯＳの各々の実行プロセス（タスク）のスケジューリングは、例えばパーティション管理ソフトウェアによって実行される。１つのシステムにＯＳ（α）とＯＳ（β）の２つのオペレーティングシステムが並存する場合、ＯＳ（α）の処理をパーティションＡとし、ＯＳ（β）の処理をパーティションＢとすると、パーティション管理ソフトウェアは、パーティションＡとパーティションＢの実行スケジュールを決定し、決定したスケジュールに基づいて、ハードウェア資源を割り当てて各ＯＳにおける処理を実行する。
【０００４】
マルチＯＳ型のシステムにおけるタスク管理を開示した従来技術として、例えば、特許文献１がある。特許文献１には、複数のＯＳの各々において実行されるタスク管理において、緊急性の高い処理を優先的に処理させるためのタスクスケジューリング手法を開示している。
【０００５】
単一のあるいは複数のオペレーティングシステム（ＯＳ）上で、複数のプログラムを実行する場合、プログラム実行単位として規定されるスレッドが並列に複数存在し、個々のスレッドが共通リソースとしてのメモリを利用する。このような状態において、例えばあるスレッドがある特定のメモリ領域をアクセスしている間に、他のスレッドに対してそのメモリ領域の開放を行なうとアクセスエラーなどの原因となる。従来は、割り込み禁止時間の設定などにより、このようなエラーの発生を防止する構成を採用していたが、割り込み禁止時間の設定による処理遅延などの副次的問題が発生する。
【特許文献１】特開２００３−３４５６１２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
本発明は、上述の問題点に鑑みてなされたものであり、複数のスレッドが並行にメモリ領域を参照し更新する構成において、アクセスエラー等を発生させない適切なメモリ領域の割り当ておよびメモリ管理処理を実現する情報処理装置、メモリ領域管理方法、並びにコンピュータ・プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の第１の側面は、
情報処理装置であり、
データ処理単位としてのスレッド情報を管理するスレッド管理部と、
メモリ領域の管理を実行するメモリ領域管理部とを有し、
前記スレッド管理部は、各データ処理プログラムからのオペレーティングシステムの機能呼出時刻としての進入時刻情報をスレッド毎に記録したスレッドリストをスレッド管理情報として保持し、
前記メモリ領域管理部は、開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻と、前記スレッドリストの各要素中の最古進入時刻との比較を実行し、開放要求時刻が前記最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当てを実行する構成であることを特徴とする情報処理装置にある。
【０００８】
さらに、本発明の情報処理装置の一実施態様において、前記スレッド管理部は、複数プロセッサ各々に対応するスレッドリストを生成し、各スレッドリストのヘッダ部に、スレッドリストに含まれるスレッド情報に設定さたれ進入時刻情報中の最古の進入時刻を記録し、該記録情報を他プロセッサから参照可能な設定として管理する構成を有することを特徴とする。
【０００９】
さらに、本発明の情報処理装置の一実施態様において、前記メモリ領域管理部は、前記スレッド管理部の管理するプロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報をすべて参照し、全てのプロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報中、最も古い最古進入時刻を選択し、該選択最古進入時刻と、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻との比較を実行し、開放要求時刻が前記選択最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当てを実行する構成であることを特徴とする。
【００１０】
さらに、本発明の情報処理装置の一実施態様において、前記スレッド管理部は、前記スレッドリストのヘッダおよびリスト構成要素に他のリスト構成要素の識別情報を記録し、ヘッダから順次各構成要素を取得可能な構成を持つリストとしてスレッドリストを構築し、スレッドの進入、退出に際して、ヘッダまたはリスト構成要素に設定された識別情報の更新処理を実行する構成であることを特徴とする。
【００１１】
さらに、本発明の情報処理装置の一実施態様において、前記メモリ領域管理部は、前記リリースキューのヘッダおよびキュー要素に他のキュー要素の識別情報を記録し、ヘッダから順次各キュー要素を取得可能な構成を持つリストとしてリリースキューを構築し、新たなキューの設定、またはキューの削除処理に際して、ヘッダまたはキュー要素に設定された識別情報の更新処理を実行する構成であることを特徴とする。
【００１２】
さらに、本発明の情報処理装置の一実施態様において、前記メモリ領域管理部は、プロセッサに対応して設定される有限サイズのメモリ領域としてのヒープ単位でのメモリ管理処理を実行する構成であり、開放要求があり未開放のヒープについてヒープ単位の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、前記リリースキューに含まれるヒープ単位の各キュー要素に記録されたメモリ領域の割り当てを実行する構成であることを特徴とする。
【００１３】
さらに、本発明の情報処理装置の一実施態様において、前記メモリ領域管理部は、メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタを構成要素とするｗｅａｋポインタチェーンの検証を実行し、該ｗｅａｋポインタチェーンにｗｅａｋポインタが存在しない場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行する構成であることを特徴とする。
【００１４】
さらに、本発明の情報処理装置の一実施態様において、前記メモリ領域管理部は、メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタと該ｗｅａｋポインタの参照領域を含むメモリ領域を構成要素とするｗｅａｋポインタチェーンに含まれるメモリ領域のリタイア済みフラグを検証し、該リタイア済みフラグがリタイア済みであることを示す場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行する構成であることを特徴とする。
【００１５】
さらに、本発明の第２の側面は、
メモリ領域管理方法であり、
各データ処理プログラムからのオペレーティングシステムの機能呼出時刻としての進入時刻情報をスレッド毎に記録したスレッド情報からなるスレッドリストを生成、更新するスレッド管理ステップと、
メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として生成、更新するメモリ領域管理ステップと、
メモリ領域の割り当て処理に際して、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻と、前記スレッドリストの各要素中の最古進入時刻との比較を実行し、開放要求時刻が前記最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当て処理を実行するメモリ領域割り当てステップと、
を有することを特徴とするメモリ領域管理方法にある。
【００１６】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記スレッド管理ステップは、複数プロセッサ各々に対応するスレッドリストを生成し、各スレッドリストのヘッダ部に、スレッドリストに含まれるスレッド情報に設定さたれ進入時刻情報中の最古の進入時刻を記録し、該記録情報を他プロセッサから参照可能な設定として管理することを特徴とする。
【００１７】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記メモリ領域割り当てステップは、プロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報をすべて参照し、全てのプロセッサ対応のスレッドリストのヘッダ部に設定された最古進入時刻情報中、最も古い最古進入時刻を選択し、該選択最古進入時刻と、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻との比較を実行し、開放要求時刻が前記選択最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当てを実行することを特徴とする。
【００１８】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記スレッド管理ステップは、前記スレッドリストのヘッダおよびリスト構成要素に他のリスト構成要素の識別情報を記録し、ヘッダから順次各構成要素を取得可能な構成を持つリストとしてスレッドリストを構築し、スレッドの進入、退出に際して、ヘッダまたはリスト構成要素に設定された識別情報の更新処理を実行するステップを含むことを特徴とする。
【００１９】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記メモリ領域管理ステップは、前記リリースキューのヘッダおよびキュー要素に他のキュー要素の識別情報を記録し、ヘッダから順次各キュー要素を取得可能な構成を持つリストとしてリリースキューを構築し、新たなキューの設定、またはキューの削除処理に際して、ヘッダまたはキュー要素に設定された識別情報の更新処理を実行するステップを含むことを特徴とする。
【００２０】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記メモリ領域管理ステップは、プロセッサに対応して設定される有限サイズのメモリ領域としてのヒープ単位でのメモリ管理処理を実行し、開放要求があり未開放のヒープについてヒープ単位の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、前記メモリ領域割り当てステップは、前記リリースキューに含まれるヒープ単位の各キュー要素に記録されたメモリ領域の割り当てを実行することを特徴とする。
【００２１】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記メモリ領域管理ステップは、メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタを構成要素とするｗｅａｋポインタチェーンの検証を実行し、該ｗｅａｋポインタチェーンにｗｅａｋポインタが存在しない場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行するステップを含むことを特徴とする。
【００２２】
さらに、本発明のメモリ領域管理方法の一実施態様において、前記メモリ領域管理ステップは、メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、前記リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタと該ｗｅａｋポインタの参照領域を含むメモリ領域を構成要素とするｗｅａｋポインタチェーンに含まれるメモリ領域のリタイア済みフラグを検証し、該リタイア済みフラグがリタイア済みであることを示す場合、当該キュー要素をリリースキューから破棄し、該キュー要素対応のメモリ領域の開放を実行するステップを含むことを特徴とする。
【００２３】
さらに、本発明の第３の側面は、
メモリ領域管理処理を実行するコンピュータ・プログラムであり、
各データ処理プログラムからのオペレーティングシステムの機能呼出時刻としての進入時刻情報をスレッド毎に記録したスレッド情報からなるスレッドリストを生成、更新するスレッド管理ステップと、
メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として生成、更新するメモリ領域管理ステップと、
メモリ領域の割り当て処理に際して、前記リリースキューに含まれる各キュー要素に設定された開放要求時刻と、前記スレッドリストの各要素中の最古進入時刻との比較を実行し、開放要求時刻が前記最古進入時刻以前に設定されたキュー要素に対応するメモリ領域の割り当て処理を実行するメモリ領域割り当てステップと、
を有することを特徴とするコンピュータ・プログラムにある。
【００２４】
なお、本発明のコンピュータ・プログラムは、例えば、様々なプログラム・コードを実行可能な汎用コンピュータ・システムに対して、コンピュータ可読な形式で提供する記憶媒体、通信媒体、例えば、ＣＤやＦＤ、ＭＯなどの記憶媒体、あるいは、ネットワークなどの通信媒体によって提供可能なコンピュータ・プログラムである。このようなプログラムをコンピュータ可読な形式で提供することにより、コンピュータ・システム上でプログラムに応じた処理が実現される。
【００２５】
本発明のさらに他の目的、特徴や利点は、後述する本発明の実施例や添付する図面に基づく、より詳細な説明によって明らかになるであろう。なお、本明細書においてシステムとは、複数の装置の論理的集合構成であり、各構成の装置が同一筐体内にあるものには限らない。
【発明の効果】
【００２６】
本発明の構成によれば、データ処理単位としてのスレッド毎の進入時刻情報を記録したスレッド情報からなるスレッドリストをスレッド管理情報として保持し、メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、リリースキューに含まれる各キュー要素に設定された開放要求時刻と、スレッドリストの最古進入時刻との比較を実行し、開放要求時刻が最古進入時刻以前に設定されたキュー要素のみに対応するメモリ領域の割り当て処理を実行する構成としたので、全てのスレッドにおいてアクセス対象となっていないメモリ領域のみを確実に選択して割り当て処理を実行することが可能となり、各スレッドにおけるアクセスエラーの発生などのない安全なメモリ領域の割り当て処理が可能となる。
【発明を実施するための最良の形態】
【００２７】
以下、図面を参照しながら、本発明の情報処理装置、メモリ領域管理方法、並びにコンピュータ・プログラムの詳細について説明する。
【００２８】
まず、図１を参照して、本発明の情報処理装置のハードウェア構成例について説明する。プロセッサモジュール１０１は、複数のプロセッサ（Processing Unit)から構成されたモジュールであり、ＲＯＭ(Read Only Memory)１０４、ＨＤＤ１２３等に記憶されているプログラムに従って、オペレーティングシステム（ＯＳ：Operating System)、ＯＳ対応のアプリケーション・プログラムなど、各種プログラムに従ったデータ処理を実行する。プロセッサモジュール１０１の詳細については、さらに、後段で、図２を参照して説明する。
【００２９】
グラフィックエンジン１０２は、プロセッサモジュール１０１から入力される指示に従って、出力部１２２を構成する表示デバイスに画面出力するためのデータ生成、例えば３Ｄグラフィック描画処理を実行する。メインメモリ（ＤＲＡＭ）１０３には、プロセッサモジュール１０１において実行するプログラムやその実行において適宜変化するパラメータ等を格納する。これらはＣＰＵバスなどから構成されるホストバス１１１により相互に接続されている。
【００３０】
ホストバス１１１は、ブリッジ１０５を介して、ＰＣＩ(Peripheral Component Interconnect/Interface)バスなどの外部バス１１２に接続されている。ブリッジ１０５は、ホストバス１１１、外部バス１１２間、およびコントローラ１０６、メモリカード１０７、その他のデバイスとのデータ入出力制御を実行する。
【００３１】
入力部１２１は、キーボード、ポインティングデバイスなどのユーザにより操作される入力デバイスからの入力情報を入力する。出力部１２２は、液晶表示装置やＣＲＴ（Cathode Ray Tube）などの画像出力部とスピーカ等からなる音声出力部から構成される。
【００３２】
ＨＤＤ（Hard Disk Drive）１２３は、ハードディスクを内蔵し、ハードディスクを駆動し、プロセッサモジュール１０１によって実行するプログラムや情報を記録または再生させる。
【００３３】
ドライブ１２４は、装着されている磁気ディスク、光ディスク、光磁気ディスク、または半導体メモリ等のリムーバブル記録媒体１２７に記録されているデータまたはプログラムを読み出して、そのデータまたはプログラムを、インタフェース１１３、外部バス１１２、ブリッジ１０５、およびホストバス１１１を介して接続されているメインメモリ（ＤＲＡＭ）１０３に供給する。
【００３４】
接続ポート１２５は、外部接続機器１２８を接続するポートであり、ＵＳＢ，ＩＥＥＥ１３９４等の接続部を持つ。接続ポート１２５は、インタフェース１１３、外部バス１１２、ブリッジ１０５、およびホストバス１１１を介してプロセッサモジュール１０１等に接続されている。通信部１２６は、ネットワークに接続され、プロセッサモジュール１０１や、ＨＤＤ１２３等から提供されるデータの送信、外部からのデータ受信を実行する。
【００３５】
次に、プロセッサモジュールの構成例について、図２を参照して説明する。図２に示すように、プロセッサモジュール２００は、複数のメインプロセッサからなるメインプロセッサグループ２０１、複数のサブプロセッサからなる複数のサブプロセッサグループ２０２〜２０ｎによって構成されている。それぞれにメモリコントローラ、２次キャッシュが設けられている。各プロセッサグループ２０１〜２０ｎの各々は例えば８つのプロセッサユニットを有し、クロスバーアキテクチャ、あるいはパケット交換式ネットワークなどによって接続されている。メインプロセッサグループ２０１のメインプロセッサの指示のもとに、複数のサブプロセッサグループ２０２〜２０ｎの１以上のサブプロセッサが選択され、所定のプログラムが実行される。
【００３６】
各プロセッサグループに設置されたメモリフローコントローラは、図１に示すメインメモリ１０３とのデータ入出力制御を実行し、２次キャッシュは、各プロセッサグループにおける処理用データの記憶領域として利用される。
【００３７】
前述したように、単一のあるいは複数のオペレーティングシステム（ＯＳ）上で、複数のプログラムを実行する場合、プログラム実行単位として規定されるスレッドが並列に複数存在し、個々のスレッドが共通リソースとしてのメモリ、例えば図１に示すメインメモリ（ＤＲＡＭ）を利用する。このような状態においては、例えばあるスレッドがある特定のメモリ領域をアクセスしている間に、他のスレッドがそのメモリ領域の開放処理を行なうとアクセスエラーなどが発生する。従来は、割り込み禁止時間の設定などにより、このようなエラーの発生を防止していたが、割り込み禁止時間の設定による処理遅延などの副次的問題が発生する。
【００３８】
本発明においては、スレッドに対応した適切なメモリ管理を実行することにより、効率的なデータ処理を実現する。図３以下を参照して、スレッド対応の適切なメモリ割り当て、開放処理を含むメモリ管理処理の詳細について説明する。
【００３９】
図３は、本発明の情報処理装置におけるソフトウェアスタックを示す図である。オペレーティングシステム（ＯＳ）３１０と、オペレーティングシステム（ＯＳ）３１０上において実行されるアプリケーション・プログラム３２０によって構成される。オペレーティングシステム（ＯＳ）３１０は、マルチタスク制御、ファイルシステム管理、メモリ管理、入出力制御処理などを実行するカーネル３１１を有する。
【００４０】
カーネル３１１は、スレッドの管理処理を実行するスレッド管理部（システムコールディスパッチャ）３１２と、メモリ領域の管理処理を実行するメモリ領域管理部（ヒープ管理モジュール）３１３と、その他のカーネルモジュール３１４を有する。
【００４１】
オブジェクト指向型のメモリ管理処理では、リソースをオブジェクトとして扱い、ヒープと呼ばれる有限サイズのメモリ領域に基づいてメモリ管理を行なう。オブジェクトのヒープへの割り当て管理を行なうのがメモリ領域管理部（ヒープ管理モジュール）３１３である。メモリ領域管理部（ヒープ管理モジュール）３１３は有限であるヒープを適宜開放しながら、メモリ領域（ヒープ）を要求する各スレッドに対して効率的なヒープ割り当てを行なう。
【００４２】
一般的なスレッドに対するメモリ割り当て処理について、図４、図５を参照して説明する。図４に示すようにオブジェクトとして設定されるメモリ領域ｘ３５１、メモリ領域ｙ３５２、メモリ領域ｚ３５３は、オブジェクトへのポインタ情報として設定されるＩＤ表３５０を介してプログラムの実行するスレッドからアクセス可能となる。
【００４３】
あるスレッドにおいてアクセス中のメモリ領域に対して、他のスレッドがアクセスしようとした場合のアクセスを回避するため、ＯＳのカーネルは、ＩＤ表にロックをかけて他のスレッドからのアクセスを防止する。従って、他のスレッドは、ロックが解除するまで、メモリアクセスが実行できず、処理が待たされることになる。
【００４４】
図５は、２段階のＩＤ表を有する構成を示している。ＩＤ表ａ３７１は、オブジェクトとしてのメモリ領域ｘ３６１とメモリ領域ｚ３６２等をアクセスするために適用され、さらに、メモリ領域ｚ３６２は、第２のＩＤ表ｂ３７２を有し、第２のＩＤ表ｂ３７２を適用することで、メモリ領域ａ３６３とメモリ領域ｂ３６４がアクセスされる。このような構成においても、ＯＳのカーネルは、ＩＤ表にロックをかけて他のスレッドからのアクセスを防止する。従って、他のスレッドは、ロックが解除するまで、メモリアクセスが実行できず、処理が待たされることになる。
【００４５】
例えば、個々のメモリ領域、例えば図５におけるメモリ領域ａ３６３やメモリ領域ｂ３６４が利用されていない場合であっても、メモリ領域ｘ３６１が利用中の場合は、カーネルの実行するメモリ管理処理は、ＩＤ表ａ３７１にロックをかける処理を実行することになり、結果として利用可能なメモリ領域までも有効に利用できないという状態に設定されてしまう。
【００４６】
本発明では、このようなメモリの非効率的な利用構成を排除し、各スレッドに対する効率的なメモリ割り当てを可能とする。この処理は、図３に示すカーネル３１１のスレッド管理部（システムコールディスパッチャ）３１２と、メモリ領域管理部（ヒープ管理モジュール）３１３とによって実行される。以下、具体的な処理について図を参照して説明する。
【００４７】
まず、図６、図７を参照して、スレッド管理部（システムコールディスパッチャ）３１２における処理について説明する。
【００４８】
スレッド管理部（システムコールディスパッチャ）３１２は、情報処理装置に備えられたスレッドを実行するプロセッサ毎にスレッドの管理を実行する。スレッド管理部（システムコールディスパッチャ）３１２は、プロセッサ毎のスレッド管理情報を保持する。
【００４９】
スレッド管理情報について、図６および図７を参照して説明する。図６は、各プロセッサ毎のスレッド管理情報を構成するスレッドリストを示している。図ではプロセッサ１、プロセッサ２のみに対応するスレッドリストを示しているが、スレッド管理部（システムコールディスパッチャ）３１２は、スレッドの実行プロセッサに対応する管理情報としてのスレッドリストを生成し保持する。
【００５０】
図６（ａ）は、プロセッサ１のスレッド管理情報としてのスレッドリストであり、プロセッサ１でハイパーバイザ内を走行中の個々のスレッドの進入時刻情報の連結データ、および最も古い進入時刻情報とからなるリストによって構成される。図６（ｂ）は、プロセッサ２のスレッド管理情報としてのスレッドリストであり、プロセッサ２でハイパーバイザ内を走行中の個々のスレッドの進入時刻情報の連結データ、および最も古い進入時刻情報とからなるリストによって構成される。スレッドの進入時刻情報とは、様々なデータ処理プログラムとしてのアプリケーション・プログラムからのオペレーティングシステムの機能呼出時刻に相当する。いずれのリストにおいても、最も古い進入時刻情報については、他のプロセッサからも参照可能な情報とされる。スレッドは前述したように論理パーティション対応のデータ処理実行単位であり、スレッドを実行するためにはプロセッサ、メモリ領域など様々なリソースの確保が必要となる。
【００５１】
スレッドを実行予定のプロセッサが決定されると、そのプロセッサを適用したスレッドにおいて利用可能なメモリ領域の割り当てを行なうことが必要となる。スレッド管理部（システムコールディスパッチャ）３１２は、各スレッドをプロセッサ毎に区分し、メモリ領域の割り当てを待つスレッド情報としてのスレッドリストを生成してスレッドの管理を実行する。
【００５２】
ハイパーバイザは、論理パーティションとハードウェアとの間に位置する特権レイヤであり、論理パーティションの管理処理を実行する。スレッドは、論理パーティションの実行する処理であり、図１、図２を参照して説明したプロセッサモジュールにおいて実行される各スレッドは、論理パーティションによって実行される。各論理パーティションには、システム内のハードウェア資源（リソース：計算機資源としてのメインプロセッサ、サブプロセッサ、メモリ、デバイスなどが割り振られ、各論理パーティションは割り振られたリソースを適用した処理を実行する。
【００５３】
スレッド管理部（システムコールディスパッチャ）３１２は、論理パーティションとハードウェアとの間に位置する特権レイヤとしてのハイパーバイザによって識別されたスレッドに関する進入時刻情報を記録し、保持する。
【００５４】
図７を参照して、スレッド管理部（システムコールディスパッチャ）３１２の保持するスレッドリスト情報の詳細について説明する。図６を参照して説明したように、各プロセッサ毎のスレッド管理情報としてのスレッドリストは、個々のスレッドの進入時刻情報の連結データ、および最も古い進入時刻情報とからなる。これらの管理情報は、図７に示すプロセッサ毎に設定される変数４００と、スレッド毎に設定される変数４１０の組み合わせに基づいて構成される。なお、前述したようにスレッドの進入時刻情報とは、様々なデータ処理プログラムとしてのアプリケーション・プログラムからのオペレーティングシステムの機能呼出時刻に相当する。
【００５５】
プロセッサ毎に設定される変数４００は、ヘッダ（ｈｅａｄ）４０１と、最古進入時刻（ｏｌｄｅｓｔ＿ｔｉｍｅ）４０２によって構成される。ヘッダ（ｈｅａｄ）４０１は、リストの先頭要素へのポインタ情報を含む情報である。最古進入時刻（ｏｌｄｅｓｔ＿ｔｉｍｅ）４０２は、リストに設定された要素中の最古の進入時刻情報が記録される。リストは、スレッドの進入、退出処理により、適宜更新され、更新処理においてリストを構成する要素中の最古の進入時刻が変更された場合は、最古進入時刻（ｏｌｄｅｓｔ＿ｔｉｍｅ）４０２が併せて更新される。なお、アクセス処理の効率を考慮して、ヘッダ（ｈｅａｄ）４０１と、最古進入時刻（ｏｌｄｅｓｔ＿ｔｉｍｅ）４０２は、別々のキャッシュラインに配置し、さらに、ヘッダ（ｈｅａｄ）４０１が配置されるキャッシュラインには、他のプロセッサから参照する必要がない変数だけを集める。最古進入時刻（ｏｌｄｅｓｔ＿ｔｉｍｅ）４０２の配置されるキャッシュラインは他のプロセッサから参照可能なキャッシュラインとして設定される。
【００５６】
スレッド毎に設定される変数４１０は、図に示すように、先行スレッド識別情報（ｐｒｅｄｅｃｅｓｓｏｒ）４１１と、進入時刻（ｔｉｍｅ）４１２によって構成される。先行スレッド識別情報（ｐｒｅｄｅｃｅｓｓｏｒ）４１１は先行するスレッド対応情報の識別子（たとえばポインタ）である。図に示すように、リストには、最新の進入時刻を持つスレッドから古い進入時刻を持つスレッドの順にスレッド情報が並べられており、それぞれのスレッド情報は、先行するスレッド情報の先行スレッド識別情報（ｐｒｅｄｅｃｅｓｓｏｒ）４１１によって特定し、取得することが可能となる。リストの先頭のスレッド情報については、最も古い進入時刻情報中のヘッダ（ｈｅａｄ）４０１に基づいて、特定し取得することが可能である。なお、末尾のスレッド情報には先行するスレッドが存在しないので［先行スレッド識別情報（ｐｒｅｄｅｃｅｓｓｏｒ）＝ＮＵＬＬ］が設定される。進入時刻（ｔｉｍｅ）４１２は、各スレッドの進入時刻を示している。
【００５７】
次に図８を参照して、メモリ領域管理部（ヒープ管理モジュール）３１３の管理する情報について説明する。前述したように、オブジェクト指向型のメモリ管理処理では、リソースをオブジェクトとして扱い、ヒープと呼ばれる有限サイズのメモリ領域に基づいてメモリ管理を行なう。オブジェクトのヒープへの割り当て管理を行なうのがメモリ領域管理部（ヒープ管理モジュール）３１３である。メモリ領域管理部（ヒープ管理モジュール）３１３は有限であるヒープを適宜開放しながら、メモリ領域（ヒープ）を要求する各スレッドに対して効率的なヒープ割り当てを行なう。
【００５８】
メモリ領域管理部（ヒープ管理モジュール）３１３は、プロセッサに対応して設定されるヒープ管理情報を保持する。すなわち、プロセッサ数に対応するヒープ管理情報を持つ。ヒープ管理情報には、図８に示すリリースキューが含まれる。リリースキューは、解放が要求されたが，いまだ解放されていないメモリ領域（ヒープ）の情報によって構成されるキュー情報である。
【００５９】
図８を参照してメモリ領域管理部（ヒープ管理モジュール）３１３の保持するリリースキューの構成について説明する。図８に示すリリースキューは、１つのプロセッサに対応して設定されるヒープ管理情報として設定されるリリースキューである。複数のプロセッサについて、図８に示すリリースキューが個別に設定される。
【００６０】
リリースキューは、ヘッダ情報（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ）４５１と、キュー要素４６０の連結リストとして設定される。キュー要素４６０には、ヒープ識別子（ｈｅａｐ＿ｉｄ）４６１、開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）４６２、後続キュー情報（ｓｕｃｃｅｓｓｏｒ）４６３、メモリ領域情報４６４が含まれる。
【００６１】
ヒープ識別子（ｈｅａｐ＿ｉｄ）４６１は、プロセッサに対応して設定されるメモリ領域としてのヒープ識別情報である。開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）４６２は、ヒープの開放が要求された時間を示す。スレッドからヒープの利用要求があった時間である。後続キュー情報（ｓｕｃｃｅｓｓｏｒ）４６３は、リリースキューの後続キューヘのポインタである。メモリ領域情報４６４は、ヒープＩＤ（ｈｅａｐ＿ｉｄ）４６１に対応するプロセッサの利用可能なメモリ領域に対するアクセス情報である。
【００６２】
ヘッダ情報（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ）４５１は、ヒープ識別子（ｈｅａｐ＿ｉｄ）を含み、先頭キューのポインタ情報を含む情報として設定される。図に示すように、ヘッダ情報（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ）４５１から、各キュー要素の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）４６３をたどることで、すべてのキュー要素を取得することができる。
【００６３】
各スレッドは、リソース配分により、利用可能なプロセッサが割り当てられ、プロセッサに対応するヒープ領域が特定され、スレッドの実行待ちの状態になり、この時点で、割り当てプロセッサに対応するリリースキューにキュー要素が設定されることになる。
【００６４】
本発明では、カーネル３１１のスレッド管理部（システムコールディスパッチャ）３１２と、メモリ領域管理部（ヒープ管理モジュール）３１３との制御によって、スレッドに対する効率的なメモリ割り当てを実行する。以下、図９以下の図面を参照して、カーネル３１１のスレッド管理部（システムコールディスパッチャ）３１２と、メモリ領域管理部（ヒープ管理モジュール）３１３の実行する処理について説明する。
【００６５】
まず、図９〜図１２を参照して、スレッド管理部（システムコールディスパッチャ）３１２の処理について説明する。スレッド管理部（システムコールディスパッチャ）３１２は、図６、図７を参照して説明したスレッドリストに対するスレッド情報の進入処理と、スレッド情報の退出処理を実行する。
【００６６】
スレッド情報の進入処理は、アプリケーション・プログラムがＯＳの機能を呼び出した直後に行われる処理である。すなわちアプリケーション・プログラムがＯＳの機能を呼び出すことによりプロセッサを適用したデータ処理としてのスレッドが発生する。このスレッドはメモリ領域の開放待ち状態に設定され、このスレッドに対応するスレッド情報がスレッド管理部（システムコールディスパッチャ）３１２の管理情報として新たに設定される。
【００６７】
スレッド情報の退出処理は、ＯＳによるシステムコール処理が完了し，アプリケーション・プログラムに制御が戻る直前に行われる処理である。すなわち、ＯＳによるメモリ割り当て処理が終了して、アプリケーション・プログラムに制御が戻ることによってスレッドは、ＯＳによって割り当てられたプロセッサ、メモリ領域などを利用したスレッドの実行が可能となる。ＯＳによるシステムコール処理が完了し，アプリケーション・プログラムに制御が戻る際には、スレッドにはメモリ領域（ヒープ）が割り当て済みとなるので、メモリ領域の待機状態にあるスレッド情報を管理するスレッド管理部（システムコールディスパッチャ）３１２はそのスレッド情報をスレッドリストから削除する。この処理が退出処理である。
【００６８】
まず、図９のフローチャートおよび図１０を参照して、スレッドの進入処理シーケンスについて説明する。スレッドの進入処理は、図１０に示すように新たなスレッド情報５１０をスレッドリストに追加する処理として実行される。図１０（ａ）に示す新たなスレッド情報５１０の追加位置は、プロセッサ対応データ５００に含まれるヘッダ情報５０１によってポイントされる位置である。この追加処理によって、図１０（ｂ）に示す設定のスレッドリストが構築される。新たなスレッド情報５１０を追加する際には、既に存在するスレッドリスト中の各種情報を更新する必要が生じる。この更新処理の手順を示すのが図９のフローチャートである。
【００６９】
図９に示すフローチャートの各ステップの処理について説明する。なお、図９に示す一連の処理は、割り込み禁止状態で実行する。ステップＳ１０１において、変数［ｐ］を進入処理を実行するプロセッサの識別子として設定する。前述したように、スレッド管理部（システムコールディスパッチャ）３１２はスレッドリストをプロセッサ毎に設定し管理しており、スレッド進入処理を実行するスレッドリストの特定のために変数［ｐ］を進入処理を実行するプロセッサの識別子として設定する。ステップＳ１０２では、変数［ｔｈｒｅａｄ］を進入処理を実行する現行スレッドの識別子として設定する。すなわち、変数［ｔｈｒｅａｄ］は、図１０に示すスレッド５１０の識別子として設定される。
【００７０】
ステップＳ１０３では、
変数［ｏｌｄ＿ｈｅａｄ］＝先行スレッド識別情報（ｐｒｅｄｅｃｅｓｓｏｒ＿ｔｈｒｅａｄ＿ｉｄ［ｔｈｒｅａｄ］）＝ｈｅａｄ［ｐ］として設定する。
この処理は、図１０（ａ）に示すヘッダ５０１に設定されている値［ｈｅａｄ［ｐ］］を新たなスレッド情報５１０の先行スレッド情報５１１とし、さらに、これを変数［ｏｌｄ＿ｈｅａｄ］と設定することを意味する。
【００７１】
ステップＳ１０４では、
変数［ｈｅａｄ［ｐ］］＝ｔｈｒｅａｄ
とする。この処理は、図１０（ａ）に示すヘッダ５０１の設定値を進入するスレッド情報５１０の識別子として設定する処理に相当する。
【００７２】
ステップＳ１０５では、
変数ｔｉｍｅ［ｔｈｒｅａｄ］＝現在時刻の設定を行なう。この処理は、図１０（ａ）に示す進入スレッド情報５１０の進入時刻情報５１２に現在時刻を設定する処理に相当する。
【００７３】
ステップＳ１０６では、ステップＳ１０３で設定した変数［ｏｌｄ＿ｈｅａｄ］がＮＵＬＬであるか否かを判定する。ステップＳ１０３で設定した変数［ｏｌｄ＿ｈｅａｄ］は、進入処理以前に図１０（ａ）のヘッダ５０１に設定されていた情報である。進入処理以前に図１０（ａ）のヘッダ５０１に［ＮＵＬＬ］が設定されている場合は、スレッドリストに全くスレッド情報が存在していなかった状態であり、図１０に示す進入スレッド情報５１０がスレッドリストに設定される唯一のスレッド情報となることを意味する。この場合は、図１０（ａ）に示すプロセッサ対応データ５００に含まれる最古進入時刻５０２をステップＳ１０５において、進入スレッドの進入時刻情報５１２として設定した時刻情報、すなわちｔｉｍｅ［ｔｈｒｅａｄ］に設定する。
【００７４】
一方、変数［ｏｌｄ＿ｈｅａｄ］がＮＵＬＬでない場合は、進入スレッド情報５１０より古い進入時刻を持つスレッド情報がスレッドリストに存在していることを意味するので、図１０（ａ）に示すプロセッサ対応データ５００に含まれる最古進入時刻５０２を更新する処理を実行することなく処理を終了する。
【００７５】
この進入処理の結果として、図１０（ｂ）に示すように進入スレッド情報５１０が、プロセッサ対応データ５００のヘッダ５０１によって取得可能な位置に設定されたスレッドリストが生成される。
【００７６】
次に、図１１、図１２を参照して、スレッド管理部（システムコールディスパッチャ）３１２の実行するスレッドの退出処理の詳細について説明する。スレッドの退出処理は、前述したようにＯＳによるシステムコール処理が完了し，アプリケーション・プログラムに制御が戻る直前に行われる。すなわち、ＯＳによるメモリ割り当て処理が終了して、アプリケーション・プログラムに制御が戻ることによってスレッドは、ＯＳによって割り当てられたプロセッサ、メモリ領域などを利用したスレッドの実行が可能となる。ＯＳによるシステムコール処理が完了し，アプリケーション・プログラムに制御が戻る際には、スレッドにはメモリ領域（ヒープ）が割り当て済みとなるので、メモリ領域の待機状態にあるスレッド情報を管理するスレッド管理部（システムコールディスパッチャ）３１２はそのスレッド情報をスレッドリストから削除する。この処理が退出処理である。
【００７７】
図１１を参照して退出処理の処理シーケンスを説明する。なお、図１１に示す一連の処理は、割り込み禁止状態で実行する。図１１のステップＳ２０１、Ｓ２０２は、退出処理を実行するプロセッサとスレッド情報の特定処理であり、ステップＳ２０１において、変数［ｐ］を退出処理を実行するプロセッサの識別子として設定する。ステップＳ２０２で、変数［ｔｈｒｅａｄ］を退出処理を実行する現行スレッドの識別子として設定する。
【００７８】
ステップＳ２０３は、退出処理の対象となるスレッドの位置を判別する処理である。すなわち、退出処理の対象となるスレッド情報がスレッドリストのどの位置にあるかによって、ステップＳ２１１〜Ｓ２１３の処理を実行するか、ステップＳ２２１〜Ｓ２２４の処理を実行するかが決定される。具体的には、退出処理の対象となるスレッド情報が図１２（ａ）または図１２（ｂ）のいずれかの位置にあるかによって処理が異なる。
【００７９】
図１２（ａ）は、退出処理の対象となるスレッド情報５５０が、スレッドリスト中の先頭位置にある場合であり、プロセッサ対応データ５４０のヘッダ５４１の指定する位置に存在する場合である。この場合には、プロセッサ対応データ５４０のヘッダ５４１のヘッダ情報［ｈｅａｄ［ｐ］］は、退出処理の対象となるスレッド情報５５０の識別情報［ｔｈｒｅａｄ］として設定されており、ステップＳ２０３の判定はＹｅｓとなり、ステップＳ２１１〜Ｓ２１３の処理を実行する。
【００８０】
図１２（ｂ）は、退出処理の対象となるスレッド情報５５０が、スレッドリスト中の先頭位置以外にある場合である。この場合には、プロセッサ対応データ５４０のヘッダ５４１のヘッダ情報［ｈｅａｄ［ｐ］］は、退出処理の対象となるスレッド情報５５０の識別情報［ｔｈｒｅａｄ］として設定されておらず、ステップＳ２０３の判定はＮｏとなり、ステップＳ２２１〜Ｓ２２４の処理を実行する。
【００８１】
まず、図１２（ａ）に示すように、退出処理の対象となるスレッド情報５５０が、スレッドリスト中の先頭位置にある場合の処理について説明する。ステップＳ２１１において、プロセッサ対応データ５４０のヘッダ５４１のヘッダ情報［ｈｅａｄ［ｐ］］を、退出処理の対象となるスレッド情報５５０に設定された先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｔｈｒｅａｄ］］５５１を設定する。これは、図１２（ａ）において、プロセッサ対応データ５４０のヘッダ５４１にスレッド情報５６０を指示する情報を設定することに相当する。なお、退出処理の対象となるスレッド情報５５０の先行スレッドがない場合は、先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｔｈｒｅａｄ］］５５１には［ＮＵＬＬ］が設定されているので、ヘッダ５４１のヘッダ情報［ｈｅａｄ［ｐ］］にも［ＮＵＬＬ］が設定されることになる。
【００８２】
次に、ステップＳ２１２において、プロセッサ対応データ５４０のヘッダ５４１のヘッダ情報［ｈｅａｄ［ｐ］］がＮＵＬＬとして設定されているか否かを判定する。ＮＵＬＬとして設定されている場合は、退出処理の対象となるスレッド情報５５０の退出によって、スレッドリストには、全くスレッド情報が存在しない状態に設定されたことを意味し、この場合は、プロセッサ対応データ５４０の最古進入時刻［ｏｌｄｅｓｔ＿ｔｉｍｅ］＝０と設定して処理を終了する。
【００８３】
ステップＳ２１２において、プロセッサ対応データ５４０のヘッダ５４１のヘッダ情報［ｈｅａｄ［ｐ］］がＮＵＬＬとして設定されていない場合は、退出処理の対象となるスレッド情報５５０の退出後も、スレッドリストにスレッド情報が存在しており、この場合は、プロセッサ対応データ５４０の最古進入時刻［ｏｌｄｅｓｔ＿ｔｉｍｅ］の書き換えは実行することなく処理を終了する。
【００８４】
次に、図１２（ｂ）に示すように、退出処理の対象となるスレッド情報５５０が、スレッドリスト中の先頭位置以外にある場合の処理について説明する。ステップＳ２２１において、変数［ｓｕｃｃ］をリスト内で、退出処理スレッドの直前にあるスレッドとする。なお、ここではリストの先頭方向を前とする。つまり、直前にあるスレッドとは図１２（ｂ）に示すスレッド情報５７０に相当する。
【００８５】
ステップＳ２２２では、退出処理スレッドの直前にあるスレッドの先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｓｕｃｃ］］を退出処理スレッドの先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｔｈｒｅａｄ］］に更新する処理を実行する。この処理は、図１２（ｂ）において、スレッド情報５７０の先行スレッド識別情報にスレッド情報５８０を指示する情報を設定することに相当する。なお、退出処理の対象となるスレッド情報５５０の先行スレッドがない場合は、先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｔｈｒｅａｄ］］５５１には［ＮＵＬＬ］が設定されているので、スレッド情報５７０の先行スレッド識別情報にも［ＮＵＬＬ］が設定されることになる。
【００８６】
次に、ステップＳ２２３において、退出処理スレッドの先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｔｈｒｅａｄ］］がＮＵＬＬとして設定されているか否かを判定する。ＮＵＬＬとして設定されている場合は、退出処理の対象となるスレッド情報５５０の退出が最古の進入時刻を持つスレッドの退出になることを意味し、この場合は、プロセッサ対応データ５４０の最古進入時刻［ｏｌｄｅｓｔ＿ｔｉｍｅ］＝ｔｉｍｅ［ｓｕｃｃ］とする設定を実行して処理を終了する。すなわち、この処理は、図１２（ｂ）のスレッド情報５８０が存在しない場合であり、スレッド情報５７０の進入時刻５７２がプロセッサ対応データ５４０の最古進入時刻［ｏｌｄｅｓｔ＿ｔｉｍｅ］として設定される。
【００８７】
ステップＳ２２３において、退出処理スレッドの先行スレッド識別情報［ｐｒｅｄｅｃｅｓｓｏｒ［ｔｈｒｅａｄ］］がＮＵＬＬとして設定されていない場合は、退出処理の対象となるスレッド情報５５０より古い進入時刻を持つスレッド、すなわち、図１２（ｂ）に示すスレッド情報５８０が存在することを意味し、この場合は、プロセッサ対応データ５４０の最古進入時刻［ｏｌｄｅｓｔ＿ｔｉｍｅ］の書き換えは実行することなく処理を終了する。
【００８８】
次に図１３以下を参照して、メモリ領域管理部（ヒープ管理モジュール）３１３の実行する処理について説明する。メモリ領域管理部（ヒープ管理モジュール）３１３は、プロセッサに対応して設定されるヒープ管理情報として、図８に示すリリースキューを保持する。リリースキューは、解放が要求されたが，いまだ解放されていないメモリ領域（ヒープ）の情報によって構成されるキュー情報である。
【００８９】
メモリ領域管理部（ヒープ管理モジュール）３１３は、メモリ領域（ヒープ）の解放要求登録処理、および割り当て処理を実行する。メモリ領域（ヒープ）の解放要求登録処理は、図８を参照して説明したリリースキューに新たなキューを追加する処理であり、メモリ領域（ヒープ）の割り当て処理は、スレッドに対するメモリ領域の割り当て処理であり、必要に応じてリリースキューからキューを削除する処理として実行される。
【００９０】
まず、図１３のフローチャートを参照してメモリ領域（ヒープ）の解放要求登録処理シーケンスについて説明する。ステップＳ３０１において、あらたなリリースキューとして設定するキュー要素のヒープＩＤ［ｈｉｄ］を開放要求のあったメモリ領域のヒープ識別子として設定する。前述したように、メモリ領域（ヒープ）の管理情報としてのリリースキューはプロセッサ対応のヒープ毎の管理情報として設定されており、メモリ領域管理部（ヒープ管理モジュール）３１３は、各ヒープ毎にメモリ領域の開放、割り当て処理を実行するものであり、リリースキューに追加するキューのヒープＩＤとして、開放要求対象となるヒープＩＤを設定する。
【００９１】
ステップＳ３０２では、新たなキュー要素の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）にリリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）を設定する。ステップＳ３０３において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、開放領域の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されている場合は、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）に新たなキュー要素のポインタ情報を代入し、メモリ領域情報などの各種情報をキューに設定して処理を終了する。
【００９２】
ステップＳ３０３において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、開放領域の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていない場合は、ステップＳ３０２に戻り、再度ステップＳ３０２，Ｓ３０３の処理を繰り返し実行して、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、開放領域の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていることを確認して、メモリ領域情報などの各種情報をキューに設定して処理を終了する。
【００９３】
ステップＳ３０３において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、開放領域の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていない場合とは、他のプロセッサによる他のキュー設定処理などが同時期に行なわれ、開放領域の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）の書き換えが実行されている場合などに発生し得る。
【００９４】
ステップＳ３０３において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、開放領域の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていることの確認に基づいて、リリースキューにあらたなキュー設定を行うことで、プロセッサ対応のメモリ領域を確実に確保（予約）することができる。
【００９５】
次に、図１４を参照して、メモリ領域管理部（ヒープ管理モジュール）３１３の実行するメモリ領域（ヒープ）の割り当て処理シーケンスについて説明する。ステップＳ４０１において、変数［ｈｉｄ］をメモリ領域割り当てを実行するプロセッサ識別子と等しく設定する。メモリ領域の割り当て処理はプロセッサ毎に実行されるものであり、まず、メモリ領域の割り当て処理の対象となるプロセッサを特定する。
【００９６】
ステップＳ４０２では、割り当て要求のなされたメモリ領域サイズと同一サイズの未使用領域がメモリに存在するか否かを判定する。すなわちメモリ領域管理部（ヒープ管理モジュール）３１３は、スレッドの要求するメモリ領域サイズと同一サイズの未使用領域がメモリに存在するか否かの確認を実行し、存在する場合は、ステップＳ４０５に進み、未使用領域をステップＳ４０１で設定した識別子を持つプロセッサを適用するスレッドのデータ処理用のメモリ領域として割り当てる。
【００９７】
ステップＳ４０２において、割り当て要求のなされたメモリ領域サイズと同一サイズの未使用領域がメモリに存在しないと判定した場合は、ステップＳ４０３に進み、割り当て要求のなされたメモリ領域サイズが、予め定められた閾値より小さいか否かを判定する。小さい場合は、ステップＳ４０４に進み、割り当て要求のなされたメモリ領域サイズを満足する未使用領域がヒープ領域に存在するか否かを判定し、存在する場合には、ステップＳ４０５において、未使用ヒープ領域として設定されているメモリ領域の割り当て処理を行なう。この処理は、要求メモリサイズが予め定めた閾値より小さく未使用ヒープ領域の割り当てのみで要求が満足される場合に実行される。
【００９８】
ステップＳ４０３において、割り当て要求のなされたメモリ領域サイズが、予め定められた閾値より小さくない場合、および、割り当て要求のなされたメモリ領域サイズが、予め定められた閾値より小さいが、ステップＳ４０４において、割り当て要求のなされたメモリ領域サイズを満足する未使用領域がヒープ領域に存在しない場合には、ステップＳ４０６以下の処理を実行してメモリ領域の割り当て処理が実行される。ステップＳ４０６の処理は、リリースキューおよびスレッドリストを参照した処理として実行される。
【００９９】
ステップＳ４０６において、変数［ｈｅａｄ］をリリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）として設定し、さらに、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）を０とする設定を実行する。
【０１００】
ステップＳ４０７において、変数［ｔｉｍｅ］を全プロセッサに対応するスレッドリストに設定された最古進入時刻中の最小値、すなわち最も古い時刻に設定する。
【０１０１】
ステップＳ４０８において、リリースキューについて、それぞれヘッダからたどれる各要素に設定された開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）について、ステップＳ４０７において設定した［ｔｉｍｅ］＝全プロセッサに対応するスレッドリストに設定された最古進入時刻中の最小値と比較し、開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）が［ｔｉｍｅ］より小さいもののみを選択して、リリースキューから削除してこれらのキューに対応するメモリ領域を開放してメモリ要求スレッドに対して割り当てる。
【０１０２】
全てのプロセッサの最古進入時刻中の最小値より前に開放要求があったメモリ領域については、全てのスレッドにおいてアクセス対象となっていないことが保証されるので、これらを選択して開放、割り当て処理を実行することで、安全なメモリ領域の割り当てが可能となる。
【０１０３】
ステップＳ４０９では、ステップＳ４０８において、リリースキューから削除したキューを除く残存キューの末尾の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）をリリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）に設定する。ステップＳ４１０において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、末尾のキューの後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されている場合は、ステップＳ４０８において、リリースキューから削除したキューを除く残存キューの先頭のキューに対するポインタをリリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）に設定して処理を終了する。
【０１０４】
ステップＳ４１０において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、末尾のキューの後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていない場合は、ステップＳ４０９に戻り、ステップＳ４０９，Ｓ４１０の処理を繰り返し実行して、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、末尾のキューの後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていることを確認して、メモリ領域情報などの各種情報をキューに設定して処理を終了する。
【０１０５】
ステップＳ４１０において、リリースキューヘッダ（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ［ｈｉｄ］）の値が、末尾のキューの後続キュー情報（ｓｕｃｃｅｓｓｏｒ）と等しい状態に設定されていない場合とは、他のプロセッサによる他のキュー設定、削除処理などが同時期に行なわれ、後続キュー情報（ｓｕｃｃｅｓｓｏｒ）の書き換えが実行されている場合などに発生し得る。
【０１０６】
このように、メモリ領域管理部（ヒープ管理モジュール）３１３は、リリースキューの各要素に設定された開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）が、全プロセッサに対応するスレッドリストに設定された最古進入時刻中の最小値より小さい時刻情報を持つもののみを選択して、これらをリリースキューから削除してこれらのキューに対応するメモリ領域を開放してメモリ要求スレッドに対して割り当てる構成としたので、全てのスレッドにおいてアクセス対象となっていないメモリ領域のみを確実に選択して割り当て処理を実行することが可能となり、各スレッドにおけるアクセスエラーの発生などのない安全なメモリ領域の割り当てが可能となる。
【０１０７】
次に、Ｗｅａｋポインタの適用をサポートするメモリ管理処理構成について説明する。先に、図８を参照してメモリ領域管理部（ヒープ管理モジュール）３１３の保持するリリースキューの構成について説明した。リリースキューは、図８を参照して説明したように、ヘッダ情報（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ）４５１と、キュー要素４６０の連結リストとして設定される。キュー要素４６０には、ヒープ識別子（ｈｅａｐ＿ｉｄ）４６１、開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）４６２、後続キュー情報（ｓｕｃｃｅｓｓｏｒ）４６３、メモリ領域情報４６４が含まれる。
【０１０８】
ヒープ識別子（ｈｅａｐ＿ｉｄ）４６１は、プロセッサに対応して設定されるメモリ領域としてのヒープ識別情報である。開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）４６２は、ヒープの開放が要求された時間を示す。スレッドからヒープの利用要求があった時間である。後続キュー情報（ｓｕｃｃｅｓｓｏｒ）４６３は、リリースキューの後続キューヘのポインタである。メモリ領域情報４６４は、ヒープＩＤ（ｈｅａｐ＿ｉｄ）４６１に対応するプロセッサの利用可能なメモリ領域に対するアクセス情報である。
【０１０９】
ヘッダ情報（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ）４５１は、ヒープ識別子（ｈｅａｐ＿ｉｄ）を含み、先頭キューのポインタ情報を含む情報として設定される。図に示すように、ヘッダ情報（ｒｅｌｅａｓｅ＿ｑｕｅｕｅ＿ｈｅａｄ）４５１から、各キュー要素の後続キュー情報（ｓｕｃｃｅｓｓｏｒ）４６３をたどることで、すべてのキュー要素を取得することができる。
【０１１０】
各スレッドは、リソース配分により、利用可能なプロセッサが割り当てられ、プロセッサに対応するヒープ領域が特定され、スレッドの実行待ちの状態になり、この時点で、割り当てプロセッサに対応するリリースキューにキュー要素が設定されることになる。
【０１１１】
図８を参照して説明したリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、リリースキューに含まれる各キューの要素に設定された解放要求時刻と、スレッドリストの最古進入時刻との比較を実行して、開放要求時刻が最古進入時刻以前に設定されたキュー要素のみに対応するメモリ領域の割り当て処理を実行する構成とすることで、全てのスレッドにおいてアクセス対象となっていないメモリ領域のみを確実に選択して割り当て処理を実行することが可能となり、各スレッドにおけるアクセスエラーの発生のない安全なメモリ領域の割り当て処理が実現される。
【０１１２】
メモリ領域がアクセス対象となっているか否かの判定処理のために、各ヒープ（メモリ領域）に対応して設定される参照カウンタ（ｒｆ：Ｒｅｆｅｒｅｎｃｅ  Ｃｏｕｎｔｅｒ）の値を適用することが可能である。参照カウンタのカウントが１以上であれば、そのヒープ（メモリ領域）が参照されている。すなわち参照しているスレッドが存在することが確認できる。
【０１１３】
ヒープ（メモリ領域）に対するアクセスを行なう場合、ヒープ（メモリ領域）に対するアドレス情報を保持したポインタオブジェクトから、メモリアドレスを取得して取得アドレスをレジスタに設定し、レジスタ設定アドレスに従ってアクセスを実行する。この処理期間に、他のスレッドからのメモリアクセスが発生すると、アクセス先のメモリ情報が予定されていたものと変更されてしまう場合があるが、先の図８を参照して説明したリリースキューに設定された解放要求時刻と、スレッドリストの最古進入時刻との比較を実行することで、確実なメモリアクセスが可能となる。
【０１１４】
ポインタオブジェクトの１つとして、ｗｅａｋポインタがある。ｗｅａｋポインタは、ヒープ（メモリ領域）に対応して設定される上述の参照カウンタ（ｒｆ）の値を増加させない特殊なポインタである。すなわち、ヒープ（メモリ領域）を参照するポインタであっても、通常ポインタと異なるｗｅａｋポインタの場合は、ヒープ（メモリ領域）に対応する参照カウンタ（ｒｆ）の値に反映されず、参照カウンタ（ｒｆ）の値に基づいて、参照の有無を判別することができない。ただし、ｗｅａｋポインタのヒープ参照が解除されたときに、ｗｅａｋポインタの保有していたヒープ（メモリ領域）に対応するアドレス情報は０（ＮＵＬＬ）に更新される。すなわち、ｗｅａｋポインタは、ヒープの参照カウンタに対する影響を及ぼさずに自己の保持するポインタ情報を０（ＮＵＬＬ）に更新する。
【０１１５】
このような性質を持つｗｅａｋポインタを適用した場合、メモリを参照する際にｗｅａｋポインタの保持しているポインタ情報を取得してレジスタに格納すると、ｗｅａｋポインタの保持情報は即座に０（ＮＵＬＬ）に置き換わってしまい、その後は、そのｗｅａｋポインタのポインタ情報を適用したメモリアクセスができなくなり、また、ｗｅａｋポインタのポインタ情報が消失するので、先に説明した図８のリリースキューの構成変更がスムーズに実行されないという問題が発生する。この問題を解決する構成例について以下、説明する。
【０１１６】
ｗｅａｋポインタを適用した場合においても確実なメモリアクセス、リリースキュー更新を可能とする構成について、図１５以下を参照して説明する。図１５は、ｗｅａｋポインタおよびｗｅａｋポインタによって参照される参照メモリ領域を持つヒープ（メモリ領域）６００を示している。図８のリリースキューにおける各キュー要素４６０のメモリ領域情報４６４が、図１５のヒープ（メモリ領域）６００の構成をとる。
【０１１７】
各ｗｅａｋポインタａ〜ｎは、すべて同じ参照メモリ領域を参照するｗｅａｋポインタである。ｗｅａｋポインタａ〜ｎは、図に示すように、ポインタ識別子としてのポインタＩＤを含むポインタヘッダの他、以下のメンバ変数を設定した構成を持つ。
（ａ）サクセッサー（Ｓｕｃｃｅｓｓｏｒ）
（ｂ）プレデッセッサー（Ｐｒｅｄｅｃｅｓｓｏｒ）
（ｃ）オブジェクトポインタ（Ｏｂｊｅｃｔ  Ｐｏｉｎｔｅｒ）
【０１１８】
オブジェクトポインタは、参照するメモリ領域情報としてのオブジェクトメンバ変数である。この一群のｗｅａｋポインタａ〜ｎは、すべて同じ参照メモリ領域を参照するｗｅａｋポインタであり、同一のオブジェクトポインタが設定される。
【０１１９】
サクセッサー（Ｓｕｃｃｅｓｓｏｒ）、プレデッセッサー（Ｐｒｅｄｅｃｅｓｓｏｒ）は、同一の参照メモリ領域を持つｗｅａｋポインタと、ｗｅａｋポインタによって参照される参照メモリ領域を持つヒープ（メモリ領域）とのチェーンを構成するためのポインタ変数である。サクセッサー（Ｓｕｃｃｅｓｓｏｒ）は、後続オブジェクトとしてｗｅａｋポインタまたはヒープの識別情報であり、プレデッセッサー（Ｐｒｅｄｅｃｅｓｓｏｒ）は、先行オブジェクトとしてｗｅａｋポインタまたはヒープの識別情報が設定される。
【０１２０】
サクセッサー（Ｓｕｃｃｅｓｓｏｒ）、プレデッセッサー（Ｐｒｅｄｅｃｅｓｓｏｒ）は、同一参照メモリ領域を持つｗｅａｋポインタと、ｗｅａｋポインタによって参照される参照メモリ領域を持つヒープ（メモリ領域）に設定され、これらの一群のｗｅａｋポインタおよびヒープを相互に連結する双方向のリンク、すなわちチェーンが構築される。このチェーンをｗｅａｋポインタチェーンと呼ぶ。
【０１２１】
また、ヒープ（メモリ領域）には、リタイア済みフラグ、参照カウンタの各情報が設定される。参照カウンタは前述したように、メモリ領域の参照状況に応じた値を持つ。ただし、ｗｅａｋポインタについての参照情報は反映されず、ｗｅａｋポインタ以外の参照情報が反映される。リタイア済みフラグは、ｗｅａｋポインタを含むポインタによる参照が全くない場合、すなわちリタイア済みであるか否かを判別するフラグであり、例えばリタイア済みの場合［１］、リタイア済みでない場合［０］に設定される。なお、新しくメモリ割り当てが行われる初期化工程において、リタイア済みフラグが［０］に設定される。
【０１２２】
次に、このようなｗｅａｋポインタチェーンを構成可能とした設定において、ｗｅａｋポインタからのポインタ値、すなわち参照メモリ領域を参照するために必要なアドレスに相当するオブジェクトメンバ変数としてのオブジェクトポインタを取得する処理手順について図１６に示すフローチャートを参照して説明する。
【０１２３】
ｗｅａｋポインタからのポインタ値の取得に際しては、まずステップＳ５０１において、ｗｅａｋポインタのオブジェクトポインタ、すなわち、オブジェクトメンバ変数が０でないこと（条件１）、さらに、ｗｅａｋポインタチェーンによって関連付けられたヒープに設定された参照カウンタ（ｒｆ）の値が１以上であること（条件２）、これらの２条件を満足するか否かを判定する。
【０１２４】
これらの２条件を満足する場合は、ステップＳ５０２に進み、オブジェクトの値、すなわち、ｗｅａｋポインタに設定された参照メモリ領域を参照するために必要なアドレスに相当するオブジェクトメンバ変数としてのオブジェクトポインタを返す。一方、この２条件を満足しない場合には、ステップＳ５０３に進み［０］を返す。
【０１２５】
ｗｅａｋポインタのオブジェクトポインタ、すなわち、オブジェクトメンバ変数が０である場合、あるいは、ｗｅａｋポインタチェーンによって関連付けられたヒープに設定された参照カウンタ（ｒｆ）の値が０である場合には、ステップＳ５０３において［０］が返されることになる。参照カウンタ（ｒｆ）の値が０である場合は、ｗｅａｋポインタ以外のポインタによる参照がない場合に相当するが、ｗｅａｋポインタによる参照の有無は判別されない。この状況で、ｗｅａｋポインタからのポインタ値を取得してしまうと、ｗｅａｋポインタのオブジェクトポインタが０に設定され、その後、そのｗｅａｋポインタのポインタ情報を適用したメモリアクセスができなくなり、また、ｗｅａｋポインタのポインタ情報の消失によりリリースキューの構成変更がスムーズに実行されないという問題が発生する。この問題の発生を防止するため、このような状況では、ポインタ値の取得を行なわない構成としている。
【０１２６】
次に、図１７を参照して、リリースキューのフラッシュ処理について説明する。リリースキューは、図８を参照して説明したリリースキューに相当し、メモリ領域管理部（ヒープ管理モジュール）３１３の管理する情報である。前述したように、オブジェクト指向型のメモリ管理処理では、リソースをオブジェクトとして扱い、ヒープと呼ばれる有限サイズのメモリ領域に基づいてメモリ管理を行なう。オブジェクトのヒープへの割り当て管理を行なうのがメモリ領域管理部（ヒープ管理モジュール）３１３である。メモリ領域管理部（ヒープ管理モジュール）３１３は有限であるヒープを適宜開放しながら、メモリ領域（ヒープ）を要求する各スレッドに対して効率的なヒープ割り当てを行なう。
【０１２７】
メモリ領域管理部（ヒープ管理モジュール）３１３は、プロセッサに対応して設定されるヒープ管理情報を保持する。すなわち、プロセッサ数に対応するヒープ管理情報を持つ。ヒープ管理情報には、図８に示すリリースキューが含まれる。リリースキューは、解放を要求されたが，いまだ解放されていないメモリ領域（ヒープ）の情報によって構成されるキュー情報である。
【０１２８】
ｗｅａｋポインタを含む構成では、リリースキューのフラッシュ、すなわち更新処理に際して、特別な処理を実行する。このリリースキユー・フラッシュ処理手順について図１７に示すフローチャートを参照して説明する。図１７に示す処理は、リリースキューに含まれる全てのオブジェクト（リリースキュー要素）について順次実行される処理である。
【０１２９】
まず、ステップＳ６０１において、リリースキューを空にする。つまり、図８のリリースキューヘッダ４５１の先頭キューのポインタ情報を空にして、キューを切り離す。
【０１３０】
次に、ステップＳ６０２において、処理対象のリリースキューに設定されていたオブジェクト（リリースキュー要素）のリリース時刻、すなわち開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）について、プロセッサに対応するスレッドリストに設定された最古進入時刻と比較する。リリース時刻が最古進入時刻より小さい場合、ステップＳ６０３に進む。
【０１３１】
ステップＳ６０３では、
（条件ａ）処理対象のオブジェクト（リリースキュー要素）のヒープＩＤによって特定されるヒープ（メモリ領域）に設定されたリタイア済みフラグがリタイア済みを示している。または、
（条件ｂ）ヒープ（メモリ領域）に対応して設定されるｗｅａｋポインタチェーンに１つもｗｅａｋポインタが存在しない。すなわち、ｗｅａｋポインタチェーンが空。
これら条件ａまたはｂのいずれかが満足されるかを判定する。
【０１３２】
これら条件ａまたはｂのいずれかが満足される場合は、ステップＳ６０４に進み、オブジォクトを破棄、すなわち、リリースキューに設定されたそのオブジェクト（リリースキュー要素）に対応するメモリ領域を開放して、リリースキューからそのオブジェクト（リリースキュー要素）を削除する。
【０１３３】
これら条件ａまたはｂのいずれもが満足されない場合は、ステップＳ６２１に進み、ヒープ（メモリ領域）に対応して設定されるｗｅａｋポインタチェーンに含まれる全てのｗｅａｋポインタのオブジェクトメンバ変数としてのオブジェクトポインタの値を［０］に設定し、ステップＳ６２２において、リタイア済みフラグを［１］に設定し、さらに、ステップＳ６２３において、リリースキューに設定されたそのオブジェクト（リリースキュー要素）のリリース時刻、すなわち開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）に現在時刻を代入して、ステップＳ６２４において、そのオブジェクト（リリースキュー要素）を再度、リリースキューに設定する。
【０１３４】
また、ステップＳ６０２の判定処理において、処理対象のリリースキューに設定されたオブジェクト（リリースキュー要素）のリリース時刻、すなわち開放要求時刻（ｒｅｌｅａｓｅ＿ｔｉｍｅ）が、プロセッサに対応するスレッドリストに設定された最古進入時刻より小さくないと判定された場合は、ステップＳ６１１に進み、オブジェクト（リリースキュー要素）のヒープＩＤによって特定されるヒープ（メモリ領域）に設定された参照フラグ（ｒｆ）が０であるか否かを判定し、０である場合は、ステップＳ６２４に進み、そのオブジェクト（リリースキュー要素）を再度、リリースキューに設定する。
【０１３５】
このフローに示す処理は、図３に示すオペレーティングシステム３１０のメモリ領域管理部３１３において実行される。すなわち、メモリ領域管理部３１３は、メモリ領域を参照するポインタとしてｗｅａｋポインタを含む構成において、リリースキューに含まれるキュー要素に対応するメモリ領域を参照するｗｅａｋポインタとｗｅａｋポインタの参照領域を含むメモリ領域を構成要素とするｗｅａｋポインタチェーンの検証によってｗｅａｋポインタチェーンにｗｅａｋポインタが存在しないことが確認された場合、あるいは、ｗｅａｋポインタチェーンに含まれるメモリ領域のリタイア済みフラグがリタイア済みであることを示す場合、当該キュー要素をリリースキューから破棄し、このキュー要素対応のメモリ領域の開放を実行する。
【０１３６】
なお、図１７のフローに示す処理は、リリースキューに設定された各オブジェクト（リリースキュー要素）について実行される。このフラッシュ処理によって、ｗｅａｋポインタを適用した構成においても、リリースキューの更新が確実に実行され、リリースキューに設定された解放要求時刻と、スレッドリストの最古進入時刻との比較が確実に実行され、エラーのないメモリアクセスが実現される。
【０１３７】
以上、特定の実施例を参照しながら、本発明について詳解してきた。しかしながら、本発明の要旨を逸脱しない範囲で当業者が該実施例の修正や代用を成し得ることは自明である。すなわち、例示という形態で本発明を開示してきたのであり、限定的に解釈されるべきではない。本発明の要旨を判断するためには、特許請求の範囲の欄を参酌すべきである。
【０１３８】
なお、明細書中において説明した一連の処理はハードウェア、またはソフトウェア、あるいは両者の複合構成によって実行することが可能である。ソフトウェアによる処理を実行する場合は、処理シーケンスを記録したプログラムを、専用のハードウェアに組み込まれたコンピュータ内のメモリにインストールして実行させるか、あるいは、各種処理が実行可能な汎用コンピュータにプログラムをインストールして実行させることが可能である。
【０１３９】
例えば、プログラムは記録媒体としてのハードディスクやＲＯＭ（Read Only Memory)に予め記録しておくことができる。あるいは、プログラムはフレキシブルディスク、ＣＤ−ＲＯＭ(Compact Disc Read Only Memory)，ＭＯ(Magneto optical)ディスク，ＤＶＤ(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体に、一時的あるいは永続的に格納（記録）しておくことができる。このようなリムーバブル記録媒体は、いわゆるパッケージソフトウェアとして提供することができる。
【０１４０】
なお、プログラムは、上述したようなリムーバブル記録媒体からコンピュータにインストールする他、ダウンロードサイトから、コンピュータに無線転送したり、ＬＡＮ(Local Area Network)、インターネットといったネットワークを介して、コンピュータに有線で転送し、コンピュータでは、そのようにして転送されてくるプログラムを受信し、内蔵するハードディスク等の記録媒体にインストールすることができる。
【０１４１】
なお、明細書に記載された各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。また、本明細書においてシステムとは、複数の装置の論理的集合構成であり、各構成の装置が同一筐体内にあるものには限らない。
【産業上の利用可能性】
【０１４２】
以上、説明したように、本発明の構成によれば、データ処理単位としてのスレッド毎の進入時刻情報を記録したスレッド情報からなるスレッドリストをスレッド管理情報として保持し、メモリ開放要求があり未開放のメモリ領域についての領域単位毎の開放要求時刻を記録した待ち行列としてのリリースキューをメモリ領域管理情報として保持し、メモリ領域の割り当て処理に際して、リリースキューに含まれる各キュー要素に設定された開放要求時刻と、スレッドリストの最古進入時刻との比較を実行し、開放要求時刻が最古進入時刻以前に設定されたキュー要素のみに対応するメモリ領域の割り当て処理を実行する構成としたので、全てのスレッドにおいてアクセス対象となっていないメモリ領域のみを確実に選択して割り当て処理を実行することが可能となり、各スレッドにおけるアクセスエラーの発生などのない安全なメモリ領域の割り当て処理が可能となる。
【図面の簡単な説明】
【０１４３】
【図１】本発明の情報処理装置の構成例を示す図である。
【図２】プロセッサモジュールの構成例を示す図である。
【図３】本発明の情報処理装置におけるソフトウェア構成を説明する図である。
【図４】一般的なメモリ領域のアクセス処理例について説明する図である。
【図５】一般的なメモリ領域のアクセス処理例について説明する図である。
【図６】本発明の情報処理装置におけるスレッド管理部の管理する情報について説明する図である。
【図７】本発明の情報処理装置におけるスレッド管理部の管理する情報の詳細について説明する図である
【図８】本発明の情報処理装置におけるメモリ領域管理部の管理する情報の詳細について説明する図である
【図９】本発明の情報処理装置におけるスレッド管理部の実行するスレッド情報進入処理のシーケンスを説明するフロー図である。
【図１０】本発明の情報処理装置におけるスレッド管理部の実行するスレッド情報進入処理の詳細を説明する図である。
【図１１】本発明の情報処理装置におけるスレッド管理部の実行するスレッド情報退出処理のシーケンスを説明するフロー図である。
【図１２】本発明の情報処理装置におけるスレッド管理部の実行するスレッド情報退出処理の詳細を説明する図である。
【図１３】本発明の情報処理装置におけるメモリ領域管理部の実行するメモリ領域開放要求登録処理のシーケンスを説明するフロー図である。
【図１４】本発明の情報処理装置におけるメモリ領域管理部の実行するメモリ領域割り当て処理の詳細を説明するフロー図である。
【図１５】ｗｅａｋポインタの構成およびｗｅａｋポインタチェーンの構成について説明する図である。
【図１６】ｗｅａｋポインタからのポインタ値取得処理シーケンスについて説明するフローチャートを示す図である。
【図１７】ｗｅａｋポインタを有する構成におけるリリースキューの更新（フラッシュ）処理シーケンスについて説明するフローチャートを示す図である。
【符号の説明】
【０１４４】
１０１  プロセッサモジュール
１０２  グラフィックエンジン
１０３  メインメモリ（ＤＲＡＭ）
１０４  ＲＯＭ
１０５  ブリッジ
１０６  コントローラ
１０７  メモリカード
１１１  ホストバス
１１２  外部バス
１１３  インタフェース
１２１  入力部
１２２  出力部
１２３  ＨＤＤ
１２４  ドライブ
１２５  接続ポート
１２６  通信部
１２７  リムーバブル記録媒体
１２８  外部接続機器
２００  プロセッサモジュール
２０１  メインプロセッサグループ
２０２〜２０ｎ  サブプロセッサグループ
３１０  オペレーティングシステム（ＯＳ）
３１１  カーネル
３１２  スレッド管理部
３１３  メモリ領域管理部
３１４  その他カーネルモジュール
３２０  アプリケーション・プログラム
３５０  ＩＤ表
３５１〜３５３  メモリ領域
３６１〜３６４  メモリ領域
３７１，３７２  ＩＤ表
４００  プロセッサ毎に設定される変数
４０１  ヘッダ
４０２  最古進入時刻
４１０  スレッド毎に設定される変数
４１１  先行スレッド識別情報
４１２  進入時刻
４５１  リリースキューヘッダ
４６０  キュー要素
４６１  ヒーブＩＤ
４６２  開放要求時刻
４６３  後続キュー情報
４６４  メモリ領域情報
５００  プロセッサ対応データ
５０１  ヘッダ情報
５０２  最古進入時刻
５１０  スレッド情報
５１１  先行スレッド識別情報
５１２  進入時刻
５２１  スレッド情報
５４０  プロセッサ対応データ
５４１  ヘッダ情報
５５０  スレッド情報
５５１  先行スレッド識別情報
５６０  スレッド情報
５７０  スレッド情報
５７２  進入時刻
５８０  スレッド情報
【図１】
2006127463.tif 000003
【図２】
2006127463.tif 000004
【図３】
2006127463.tif 000005
【図４】
2006127463.tif 000006
【図５】
2006127463.tif 000007
【図６】
2006127463.tif 000008
【図７】
2006127463.tif 000009
【図８】
2006127463.tif 000010
【図９】
2006127463.tif 000011
【図１０】
2006127463.tif 000012
【図１１】
2006127463.tif 000013
【図１２】
2006127463.tif 000014
【図１３】
2006127463.tif 000015
【図１４】
2006127463.tif 000016
【図１５】
2006127463.tif 000017
【図１６】
2006127463.tif 000018
【図１７】
2006127463.tif 000019