(57)【要約】      （修正有）【課題】定常的なトラフィックだけでなくバースト的なトラフィックに対してもメモリを有効に活用することができる記憶領域管理方法を得ること。【解決手段】要求されたメモリサイズのメモリブロックがサブメモリプールにプールされていない場合には、サブメモリプール切替部２２、メモリプール判定部２３、およびメモリブロック要求部２６が、要求されたメモリサイズより大きいメモリサイズのメモリブロックをプールしているサブメモリプールを検出し、サブメモリプール切替部２２、メモリプール判定部２３、メモリ分割部２４、およびメモリプール部２５が、検出されたサブメモリプールにプールされているメモリブロックを、要求したメモリサイズのサブメモリブロックになるまで順次１つメモリサイズの小さいメモリブロックに分割してサブメモリプールにプールして、メモリ割当部２１が要求されたメモリサイズのメモリブロックを提供する。【選択図】        図２
2006126973.tif 000002
【特許請求の範囲】
【請求項１】
システムメモリプールとして用いる記憶装置の記憶領域の未使用領域をｎのべき乗サイズの複数の異なるメモリサイズのメモリブロックに分割し、該分割されたメモリブロックを当該メモリブロックのメモリサイズに対応するサブメモリプールにプールし、前記サブメモリプールにプールされたメモリブロックをユーザに提供する記憶領域管理方法であって、
要求されたメモリサイズのメモリブロックをプールすべきサブメモリプールにメモリブロックがプールされていない場合には、前記要求されたメモリサイズより大きいメモリブロックをプールするサブメモリプールのなかでメモリブロックをプールしているサブメモリプールを選択するサブメモリ選択処理ステップと、
このサブメモリ選択処理ステップによって選択されたサブメモリプールにプールされているメモリブロックが前記要求されたメモリサイズになるまで該メモリブロックをメモリサイズの小さいメモリブロックに順次分割し、分割したメモリブロックを当該メモリブロックのメモリサイズに対応したサブメモリプールにプールさせるメモリ分割処理ステップと、
前記サブメモリプールにプールされている分割されたメモリブロックをユーザに提供するとともに、前記メモリブロックのメモリサイズおよび利用状態をサイズ管理テーブルに登録するメモリ割当ステップと、
を備えることを特徴とする記憶領域管理方法。
【請求項２】
前記サブメモリプール毎に予め定められた個数のメモリブロックを予め準備しておくことを特徴とする請求項１に記載の記憶領域管理方法。
【請求項３】
システムメモリプールとして用いる記憶装置の記憶領域の未使用領域をｎのべき乗サイズの複数の異なるメモリサイズのメモリブロックに分割し、該分割されたメモリブロックを当該メモリブロックのメモリサイズに対応するサブメモリプールにプールし、前記サブメモリプールにプールされたメモリブロックをユーザに提供する記憶領域管理方法であって、
２分割されたメモリブロックの一方である処理対象メモリブロックと対となる他方のメモリブロックであるペアメモリブロックを検出するペアメモリブロック検出処理ステップと、
このペアメモリブロック検出処理ステップによって検出されたペアメモリブロックが未使用でかつ前記処理対象メモリブロックと同一メモリサイズであるか否かを判定するペアメモリブロック連結判定処理ステップと、
このペアメモリブロック連結判定処理ステップによって、前記ペアメモリブロックが未使用でかつ前記処理対象メモリブロックと同一メモリサイズであると判定された場合、前記処理対象メモリブロックと前記ペアメモリブロックとを連結して１つメモリサイズの大きいメモリブロックを生成し、生成したメモリブロックを新たな処理対象メモリブロックとするペアメモリブロック連結ステップと、
を備えることを特徴とする記憶領域管理方法。
【請求項４】
請求項１または２に記載の記憶領域管理方法をコンピュータに実行させる記憶領域割当プログラム。
【請求項５】
システムメモリプールとして用いる記憶装置の記憶領域の未使用領域をｎのべき乗サイズの複数の異なるメモリサイズのメモリブロックに分割し、該分割されたメモリブロックを当該メモリブロックのメモリサイズに対応するサブメモリプールにプールし、前記サブメモリプールにプールされたメモリブロックをユーザに提供した後に、該ユーザから解放されたメモリブロックをサブメモリプールにプールするガベージコレクション処理プログラムにおいて、
前記異なるメモリサイズのメモリブロックの中で、最小メモリサイズのメモリブロックをプールするサブメモリプールから順次サイズの大きいサブメモリプールを選択して処理対象サブメモリプールを切り替えるサブメモリプール切替ステップと、
前記処理対象サブメモリプールにプールされているメモリブロックの中に未処理のメモリブロックが存在する場合には、前記未処理のメモリブロックを処理対象メモリブロックとして選択し、前記処理対象サブメモリプールにプールされているメモリブロックの中に未処理のメモリブロックが存在しない場合には、前記処理対象サブメモリプールを切り替えることを要求するサブメモリプール切替判定ステップと、
２分割されたメモリブロックの一方である前記処理対象メモリブロックと対となる他方のメモリブロックであるペアメモリブロックを検出するペアメモリブロック検出処理ステップと、
このペアメモリブロック検出処理ステップによって検出されたペアメモリブロックが未使用でかつ前記処理対象メモリブロックと同一メモリサイズであるか否かを判定するペアメモリブロック連結判定処理ステップと、
このペアメモリブロック連結判定処理ステップによって、前記ペアメモリブロックが未使用でかつ前記処理対象メモリブロックと同一メモリサイズであると判定された場合には、前記処理対象メモリブロックと前記ペアメモリブロックとを連結して１つメモリサイズの大きいメモリブロックを生成し、生成したメモリブロックを処理対象サブメモリプールより１つサイズの大きいサブメモリプールにプールするメモリプールステップと、
を備えることを特徴とするガベージコレクション処理プログラム。
【請求項６】
前記サブメモリプール切替ステップは、
前記サブメモリプールごとに予め定められたガベージコレクション閾値を越えた数のメモリブロックがプールされているサブメモリプールを処理対象サブメモリプールとして選択すること、
を特徴とする請求項５に記載のガベージコレクション処理プログラム。
【請求項７】
前記サブメモリプール切替判定ステップは、
前記処理対象サブメモリプールにプールされているメモリブロックの数が前記サブメモリプールごとに予め定められたガベージコレクション完了閾値よりも小さくなった場合に前記処理対象サブメモリプールを切り替えることを要求すること、
を特徴とする請求項６に記載のガベージコレクション処理プログラム。
【請求項８】
請求項４に記載の記憶領域割当プログラムと、請求項５〜７の何れか一つに記載のガベージコレクション処理プログラムとを備えることを特徴とする記憶領域管理プログラム。
【請求項９】
前記記憶領域管理プログラムはリアルタイムＯＳの記憶領域管理に用いるものであり、
前記記憶領域割当プログラムによってユーザに提供したメモリブロックが解放されると、解放されたメモリブロックを当該メモリブロックのメモリサイズに対応したサブメモリプールにプールするメモリブロックプール処理ステップ、
をさらに備え、
前記ガベージコレクション処理プログラムをアイドル時間に実行すること、
を特徴とする請求項８に記載の記憶領域管理プログラム。
【請求項１０】
予めサブメモリプールにサブメモリプールを識別するためのサブメモリプール識別子を付与しておき、
前記ガベージコレクション処理プログラムのサブメモリプール切替ステップは、
前記アイドル時間中に処理対象サブメモリプールに対して前記サブメモリプール切替判定ステップ、前記ペアメモリブロック検出処理ステップ、前記ペアメモリブロック連結判定処理ステップ、および前記メモリプールステップを実行可能であるか否かを判定し、実行可能である場合には前記サブメモリプール切替判定ステップを実行させ、実行不可能である場合には処理対象サブメモリプールとして選択すべきサブメモリプールに付与されているサブメモリプール識別子を記憶して、次のアイドル時間に記憶したサブメモリプール識別子が示すサブメモリプールを処理対象サブメモリプールとして選択すること、
を特徴とする請求項９に記載の記憶領域管理プログラム。
【請求項１１】
請求項８〜１０の何れか一つに記載の記憶領域管理プログラムを有する複数のプロセッサを用いたマルチプロセッサシステムに適用されるメッセージ管理プログラムであって、
前記記憶領域管理プログラムによって提供されたメモリブロックに記憶されているメッセージブロックが１〜複数個含まれるメッセージをユーザからのメッセージ送信要求を受けて前記複数のプロセッサ間で送信する場合、前記メッセージ送信要求に含まれるメモリブロックの先頭メモリアドレスを用いて前記サイズ管理テーブルからメモリブロックのメモリサイズを取得して前記メモリブロックのデータをコピーし、前記メモリブロックに記憶されているメッセージブロックの連結ポインタからつぎに連結すべきメッセージブロックが記憶されているメモリブロックの先頭メモリアドレスを取得し、取得した先頭メモリアドレスを用いて前記サイズ管理テーブルからメモリブロックのメモリサイズを取得して、前記連結ポインタから取得したメモリアドレスを先頭メモリアドレスとするメモリブロックのデータをコピーしたデータに連結する動作を繰り返して前記メッセージブロックを連結したメッセージパケットを生成すること、
を特徴とするメッセージ管理プログラム。
【請求項１２】
前記１〜複数のメッセージブロックの連結ポインタの位置を、メッセージブロックの種類に依存することなく前記メッセージブロックの先頭から所定の位置とすること、
を特徴とする請求項１１に記載のメッセージ管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶装置の記憶領域を動的にユーザに提供する記憶領域管理方法、記憶領域割当プログラム、ガベージコレクション処理プログラム、記憶領域管理プログラム、およびメッセージ管理プログラムに関するものである。
【背景技術】
【０００２】
従来から、携帯電話やＰＤＡ（Personal Digital Assistant）などの組み込み機器において記憶領域（以下、メモリとする）を効率よく活用するために種々の技術が考えられている。携帯電話などのリアルタイムＯＳ（Operating System）に適用される記憶領域管理方法では、ユーザ（タスク）が必要なときにメモリを取得し、必要がなくなると取得したメモリを解放して、メモリを動的に割り当てて少ないメモリを有効利用するようにしている。
【０００３】
携帯電話の場合、制御情報とユーザデータとを比較すると制御情報の方がユーザデータよりも扱う情報量が少ない。すなわち、制御情報の処理に関するタスクが要求するメモリサイズは小さく、ユーザデータの処理に関するタスクが要求するメモリサイズは大きくなる。大きさの異なるメモリサイズの要求や解放を繰り返すと、メモリの虫食い（穴あき）問題が生じる。
【０００４】
このような問題を改善するために、従来の記憶領域管理方法では、タスクが利用するメモリサイズによってタスクをグループ分けして、ほぼ同じサイズのメモリを利用するタスクのグループ（メモリの循環系）毎にピーク容量（メモリ利用量）に応じたメモリプールを提供するようにしている。すなわち、メモリの循環系毎にメモリプールを構築するようにしている。
【０００５】
さらに、従来の記憶領域管理方法では、メモリの循環系ごとに構築したメモリプールを有効利用するために、メモリをさらに小さなブロックに分割して要求されたメモリサイズのメモリを割り当てる可変長メモリプール方式を用いている。
【０００６】
可変長メモリプール方式はメモリ管理をリスト構造で行なっているので、ユーザが要求するメモリの割り当てや、ユーザから解放されたメモリを組み立てる際に、リストを検索しなければならない。リストの先頭近くに要求されたメモリサイズの連続した空きブロックや、解放されたブロックを組み立てる空きブロックがある場合には検索時間は短いが、要求されたメモリサイズの連続した空きブロックや、解放されたブロックを組み立てる空きブロックがリストの最後尾に近くにある場合には検索時間は長くなるという問題があった。
【０００７】
このような問題を改善するための従来技術として、特許文献１がある。特許文献１には、メモリ割当および解放処理でのリストの検索を解消し、リアルタイムＯＳを高速にする記憶領域管理方式の技術が開示されている。具体的には、メモリをある固定サイズのブロックで区切り、１つ以上の連続した空きブロックであるホールのサイズを２n≦ホールのサイズ＜２n+1の区分毎にフリーリストを作成する。そして、メモリの割り当て時には、要求サイズが区分されるホールのサイズより１つ大きいホールが繋がれているフリーリストの先頭のホールから要求サイズのホールを割当て、フリーリストの検索を解消している。
【０００８】
このように、従来の記憶領域管理方法では、複数のメモリプールを構築してメモリの循環系ごとにメモリプールを提供し、各メモリプールに可変長メモリプール方式を用いることでメモリを有効利用するとともに、各メモリプールの管理に特許文献１に記載の記憶領域管理方式を用いることで、メモリ割当および解放処理におけるリストの検索処理時間を短縮するようにしている。
【０００９】
【特許文献１】特開平０６−３０９１９７号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、近年では携帯電話は電話としての機能だけでなく、多彩な機能を備える情報端末へと変化してきている。ここで、従来の記憶領域管理方法を、リアルタイム性が要求される無線ＬＡＮ（Local Area Network）のリアルタイムＯＳの記憶領域管理に適用したとする。音声通信のトラフィックは定常的であるが、無線ＬＡＮのトラフィックはバースト的である。メモリサイズをトラフィックのピーク容量に応じて決定する従来の記憶領域管理方法では、バースト的なトラフィックのピーク容量に応じてメモリサイズを決定することになり、メモリの利用効率が低下するという問題があった。
【００１１】
また、無線ＬＡＮではリアルタイム性が要求される処理が多く、最悪実行時間（ＷＣＥＴ：Worst Case Execution Time）を保証しなければならない。しかしながら、上記特許文献１に記載の従来技術では、要求サイズが区分されるホールのサイズより大きいホールが存在しない場合には、要求サイズが区分されるホールが繋がれているフリーリストを検索しなければならない。この場合は、対象となるフリーリストの先頭近くに所望のホールがある場合と最後尾近くにある場合とでは検索時間が異なり、対象となるフリーリストにホールが何個つながれているかの情報が無いため、所望のホールを検索してメモリの割り当てる実行最悪時間を保証することができないという問題があった。
【００１２】
さらに、無線ＬＡＮなどに対応する組み込み機器では、高速大容量の処理を行なわなければならないため、複数のプロセッサを用いるマルチプロセッサシステムへの展開が望まれている。マルチプロセッサ間でソフトウエアを構築する場合には、キャッシュコヒーレンシを利用したＳＭＰ（Symmetric Multiprocessing）やメッセージを互いにパッシングしながら情報共有をはかる多重私有記憶（Multiple private memory）によって複数のプロセッサ間で情報を共有する。
【００１３】
ここで、メッセージパッシングを利用した情報共有方式を用いて２つのプロセッサが情報を共有する場合を考える。メッセージに関する処理を実行するメッセージ管理部は、ソフトウエアプログラムの位置に応じて、メッセージを任意プロセッサ上のタスクから他のプロセッサ上のタスクへ転送する。このときメッセージ管理部は、対象とするタスクにメッセージを転送することを意識させること無くメッセージ転送を実現する。この機能は位置透過と呼ばれている。
【００１４】
シングルリアルタイムＯＳ上で利用されるメッセージは、メッセージヘッダを含む複数のメッセージブロックが、ポインタによって連結されている。このようなシングルリアルタイムＯＳ上で利用されるメッセージをマルチプロセッサシステムのリアルタイムＯＳ上で利用して位置透過でメッセージを異なるプロセッサに転送する場合、メッセージ管理部は、複数のメッセージブロックで構成されるメッセージを１つのメッセージパケットにパッキングしなければならない。
【００１５】
しかしながら、メッセージ毎にメッセージを構成するメッセージブロックのサイズ（メッセージ長）や数、メッセージ間を接続するポインタの位置や数などが異なっているので、メッセージを１つのメッセージパケットにパッキングするためには、メッセージ管理部は、すべてのメッセージのメッセージ長およびポインタの位置を把握していなければならず、メッセージ数に応じてメッセージ管理部のプログラムサイズが増大するという問題があった。
【００１６】
また、メッセージ管理部がすべてのメッセージのメッセージ長およびそのポインタの位置を把握していなければならないため、新しいメッセージを追加するたびに、追加するメッセージの構造をメッセージ管理部に登録する必要があり、その度メッセージ管理部に関するプログラムの検証を行なわなければならないという問題もあった。
【００１７】
本発明は、上記に鑑みてなされたものであって、定常的なトラフィックだけでなくバースト的なトラフィックに対してもメモリを有効に活用することができる記憶領域管理方法を得ることを第１の目的とする。
【００１８】
第２の目的は、実行最悪時間を保証することができる記憶領域管理方法を得ることである。
【００１９】
第３の目的は、リアルタイム性が要求される分散ソフトウエア環境のおけるメッセージのパッキングが容易にできるメッセージ管理プログラムを得ることである。
【課題を解決するための手段】
【００２０】
上述した課題を解決し、目的を達成するために、本発明は、システムメモリプールとして用いる記憶装置の記憶領域の未使用領域をｎのべき乗サイズの複数の異なるメモリサイズのメモリブロックに分割し、該分割されたメモリブロックを当該メモリブロックのメモリサイズに対応するサブメモリプールにプールし、前記サブメモリプールにプールされたメモリブロックをユーザに提供する記憶領域管理方法であって、要求されたメモリサイズのメモリブロックをプールすべきサブメモリプールにメモリブロックがプールされていない場合には、前記要求されたメモリサイズより大きいメモリブロックをプールするサブメモリプールのなかでメモリブロックをプールしているサブメモリプールを選択するサブメモリ選択処理ステップと、このサブメモリ選択処理ステップによって選択されたサブメモリプールにプールされているメモリブロックが前記要求されたメモリサイズになるまで該メモリブロックをメモリサイズの小さいメモリブロックに順次分割し、分割したメモリブロックを当該メモリブロックのメモリサイズに対応したサブメモリプールにプールさせるメモリ分割処理ステップと、前記サブメモリプールにプールされている分割されたメモリブロックをユーザに提供するとともに、前記メモリブロックのメモリサイズおよび利用状態をサイズ管理テーブルに登録するメモリ割当ステップと、を備えることを特徴とする。
【発明の効果】
【００２１】
この発明によれば、記憶装置の記憶領域の未使用領域をｎのべき乗サイズの複数の異なるサイズのメモリブロックに分割し、分割されたメモリブロックを当該メモリブロックのサイズに対応するサブメモリプールにプールし、ユーザから要求されたサイズのメモリブロックをプールすべきサブメモリプールに、メモリブロックがプールされていない場合には、要求されたサイズより大きいメモリブロックをプールしているサブメモリプールからメモリブロックを取得して、取得したメモリブロックが要求されたサイズになるまで取得したメモリブロックを１つサイズの小さいメモリブロックに分割してユーザに提供するようにしているので、定常的なトラフィックだけでなくバースト的なトラフィックに対してもユーザから要求されたサイズのメモリブロックを確実に提供することができ、メモリを有効に活用することができる。
【発明を実施するための最良の形態】
【００２２】
以下に、本発明にかかる記憶領域管理方法、記憶領域割当プログラム、ガベージコレクション処理プログラム、記憶領域管理プログラム、およびメッセージ管理プログラムの実施の形態を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００２３】
図１は、この発明にかかる記憶領域管理方法が適用されるメモリプールの構成の一例を示す概念図である。この発明にかかる記憶領域管理方法が適用されるメモリプールは、メモリを共有するシステム内に１つのシステムメモリプール（System Memory Pool）１を備えている。システムメモリプール１はｎ（１＜ｎ，ｎは自然数）のべき乗のサイズ（この場合は、３２バイト、６４バイト、１２８バイト、２５６バイト、５１２バイト、１０２４バイト、２０４８バイトの７つのサイズ）のサブメモリプール（Sub-Memory Pool)２〜８を備えている。ただし、システムメモリプール数は、本発明において１つに限るものではない。
【００２４】
サブメモリプール２〜８は、３２バイト、６４バイト、１２８バイト、２５６バイト、５１２バイト、１０２４バイト、２０４８バイトのメモリブロックをプールする。図１では、サブメモリプール２には未使用（ＦＲＥＥ）の３２バイトのメモリブロック（Memory Block）９が２つプールされ、サブメモリプール６には未使用の５１２バイトのメモリブロック（Memory Block）１３が１つプールされ、サブメモリプール７には未使用の１０２４バイトのメモリブロック（Memory Block）１４が２つプールされ、サブメモリプール８には未使用の２０４８バイトのメモリブロック（Memory Block）１５が４つプールされており、サブメモリプール３〜５には未使用の６４，１２８，２５６バイトのメモリブロックのプールがない状態を示している。
【００２５】
以下に説明する実施の形態では、図１に示したように、システムメモリプール１を２のべき乗（３２，６４，１２８，２５６，５１２，１０２４，２０４８）バイトのメモリブロック単位で管理して、メモリブロックを分割、あるいは組み立てることにより、サブメモリプール２〜８の間でメモリブロックの交換（割り当て・取得）を行う。
【００２６】
実施の形態１．
図１〜図５を用いてこの発明の実施の形態１を説明する。この実施の形態１では、ユーザから要求されたメモリサイズのメモリブロックを提供する（メモリ割り当て）際の記憶領域管理方法について説明する。
【００２７】
図２は、この発明にかかる実施の形態１の記憶領域管理方法が適用される記憶領域管理装置の構成を示すブロック図である。図２に示した記憶領域管理装置は、図１に示したシステムメモリプール１として用いられる物理メモリであるメモリ４０（特許請求の範囲でいうところの記憶装置）と、メモリ４０の管理に必要な情報を記憶するサイズ管理テーブル３１およびサブメモリプール管理テーブル３２を有する情報テーブル３０と、メモリ割当処理部２０とを備えている。
【００２８】
メモリ割当処理部２０は、メモリ要求によってユーザから要求されたメモリサイズのメモリブロックがサブメモリプール２〜８にプールされているか否かを判定するとともに、要求されたメモリサイズのメモリブロックをユーザに提供するメモリ割当部２１と、サブメモリプール３〜８から処理対象サブメモリプールを選択するサブメモリプール切替部２２と、処理対象サブメモリプールにメモリブロックがプールされているか否かを判定するメモリプール判定部２３と、処理対象サブメモリプールを切り替えるためのメモリ要求を生成するメモリブロック要求部２６と、処理対象サブメモリプールにプールされているメモリブロックを１つメモリサイズの小さいメモリブロックに分割するメモリ分割部２４と、メモリ分割部２４によって分割されたメモリブロックをサブメモリプール２〜７にプールするメモリプール部２５とを備えている。
【００２９】
なお、特許請求の範囲でいうところのサブメモリプール選択処理ステップの機能をサブメモリプール切替部２２、メモリプール判定部２３、およびメモリブロック要求部２６が実現し、特許請求の範囲でいうところのメモリ分割処理ステップの機能をサブメモリプール切替部２２、メモリプール判定部２３、メモリ分割部２４、およびメモリプール部２５が実現し、特許請求の範囲でいうところのメモリ割当ステップの機能をメモリ割当部２１が実現している。
【００３０】
図３を参照して、サイズ管理テーブル３１およびサブメモリプール管理テーブル３２に登録される情報と、メモリ４０との関係を説明する。メモリ４０は、３２、６４、１２８、２５６、５１２、１０２４、２０４８バイトのメモリブロック単位でユーザに提供され、サイズ管理テーブル３１およびサブメモリプール管理テーブル３２によって管理される。図３では、メモリブロック（フリーメモリ）５１〜５３が未使用であり、メモリブロック６１〜６３が使用中となっている。
【００３１】
１０２４バイトのメモリブロックは２０４８バイトのメモリブロックを１／２に分割して生成され、５１２バイトのメモリブロックは１０２４バイトのメモリブロックを１／２に分割して生成され、２５６バイトのメモリブロックは５１２バイトのメモリブロックを１／２に分割して生成され、１２８バイトのメモリブロックは２５６バイトのメモリブロックを１／２に分割して生成され、６４バイトのメモリブロックは１２８バイトのメモリブロックを１／２に分割して生成され、３２バイトのメモリブロックは６４バイトのメモリブロックを１／２に分割して生成される。
【００３２】
サイズ管理テーブル３１は、メモリブロックの使用状態を管理するためのテーブルである。使用状態とは、メモリブロックをユーザが使用中（Ｕｓｉｎｇ）であるのか、未使用（ＦＲＥＥ）であるのかを示す利用状態と、何バイトのメモリブロックであるのか（メモリサイズ）を示すサイズ情報である。
【００３３】
サイズ管理テーブル３１には、メモリ４０のメモリサイズをサブメモリプール２〜８の最小メモリブロックのメモリサイズで割った数のエントリに対応付けてメモリブロックのサイズ情報および利用状態が登録される。先の図１に示したように、サブメモリプール２〜８の最小メモリブロックのメモリサイズは３２バイトである。したがって、図３では、３２バイトごとにエントリが作られる。なお、図３では、サイズ管理テーブル３１とメモリ４０の関係を示すためにＢ１、Ｂ９、Ｂ１０でその対応関係を示しているが、実際には、３２バイトブロックの先頭メモリアドレスに対応付けてメモリブロックのサイズ情報および利用状態が登録される。
【００３４】
図３のメモリブロック５１の先頭の３２バイトブロック（Ｂ１）に対応するサイズ管理テーブル３１のエントリ（Ｂ１）には、メモリブロック５１のメモリサイズおよび現在の利用状態が登録される。メモリブロック５１は、２５６バイトのメモリブロックで現在未使用（ＦＲＥＥ）であるので、サイズ管理テーブル３１のエントリ（Ｂ１）のサイズ情報には２５６バイトを示す値が登録され、利用状態にはＦＲＥＥであることを示す値が登録される。
【００３５】
また、メモリブロック６１の場合、メモリブロック６１の先頭の３２バイトブロック（Ｂ９）に対応するサイズ管理テーブル３１のエントリ（Ｂ９）のサイズ情報にはメモリブロック６１のメモリサイズを示す値が登録され、利用状態には使用中（Ｕｓｉｎｇ）であることを示す値が登録される。同様にして、サイズ管理テーブル３１には、メモリ４０に割り当てられている全てのメモリブロックのサイズ情報および利用状態がメモリブロックの先頭の３２バイトブロックに対応するエントリに対応付けて登録される。
【００３６】
メモリブロックの先頭以外の３２バイトブロック（Ｂ１０）に対応付けられるサイズ管理テーブル３１のエントリ（例えば、Ｂ１０）のサイズ情報および利用状態は不定値であり、以前そのメモリアドレスがメモリブロックの先頭であった時の値が残っている。
【００３７】
また、２５６バイトのメモリブロック５１を１／２に分割して２つの１２８バイトのメモリブロックを生成した場合には、メモリアドレス「０ｘＸＸＸＸ００００ｈ」に対応する３２バイトブロックのエントリ、およびメモリアドレス「０ｘＸＸＸＸ００８０ｈ」に対応する３２バイトブロックのエントリのサイズ情報に１２８バイトを示す値が登録され、利用状態にＦＲＥＥであることを示す値が登録される。
【００３８】
サブメモリプール２〜８にプールされるメモリブロックは、リンク構造で管理される。サブメモリプール管理テーブル３２は、リンク構造を管理するテーブルであり、サブメモリプール２〜８に対応付けて、サブメモリプール２〜８にプールされているメモリブロックの先頭メモリアドレス（ポインタ）が登録される。
【００３９】
図３は、サブメモリプール管理テーブル３２に３つの２５６バイトの未使用のメモリブロック（フリーメモリ）５１〜５３が連結されている例を示している。サブメモリプール管理テーブル３２の２５６バイトフリーメモリアドレスにはメモリブロック５２の先頭メモリアドレス「０ｘＸＸＸＸ０３００ｈ」が登録され、メモリブロック５２の先頭３２バイトには次に連結される２５６バイトのメモリブロック５３の先頭メモリアドレス「０ｘＸＸＸＸ０６００ｈ」が登録される。同様にメモリブロック５３の先頭３２バイトには次の２５６バイトのメモリブロック５１の先頭メモリアドレス「０ｘＸＸＸＸ００００ｈ」が登録される。メモリブロック５１の後にはメモリブロックが連結されていない。そのため、メモリブロック５１の先頭３２ビットには、連結されるメモリブロックが存在しないことを示す値、たとえば「ＮＵＬＬ」が登録される。なお、ここでは、メモリアドレスとして３２ビットを基本に説明しているが、メモリアドレスのビット数はこれに限るものではない。
【００４０】
また、図３では、サブメモリプール２〜４，６〜８にプールされる（対応付けられる）メモリブロックが存在しないので、サブメモリプール管理テーブル３２の３２バイト、６４バイト、１２８バイト、５１２バイト、１０２４バイト、２０４８バイトフリーメモリアドレスには、メモリブロックが連結されていないことを示す値、たとえば「ＮＵＬＬ」が登録される。
【００４１】
なお、図３では、単方向リンクによってサブメモリプール管理テーブル３２に連結されるメモリブロックを管理しているが、メモリの割り当てや、メモリ解放にともなうメモリブロックの連結を高速に行なうために、双方向リンクによってサブメモリプール２〜８にプールされるメモリブロックを管理するようにしてもよい。
【００４２】
つぎに、図４のフローチャートを参照して、この発明にかかる実施の形態１の記憶領域管理方法が適用される記憶領域管理装置の動作を説明する。ユーザからのメモリ要求を受けると、メモリ割当部２１は、サブメモリプール管理テーブル３２を検索して要求されたメモリサイズのメモリブロックがサブメモリプール２〜８に存在するか否か（プールされているか否か）、すなわち要求されたメモリサイズのメモリブロックがサブメモリプール管理テーブル３２にリンクされているか否かを判定する（ステップＳ１００，Ｓ１０１）。
【００４３】
要求されたメモリサイズのメモリブロックがサブメモリプール２〜８にプールされている場合、メモリ割当部２１は、要求されたメモリサイズのメモリブロックを取得してユーザに提供する（ステップＳ１０８）。具体的には、メモリ割当部２１は、要求されたメモリサイズに対応するサブメモリプール管理テーブル３２のフリーメモリアドレスに登録されているリンクの先頭のメモリブロックのメモリアドレスを取得する。メモリ割当部２１は、取得したメモリアドレスが示すメモリブロックの先頭３２ビットに登録されている次のリンクのメモリブロックのメモリアドレスを、要求されたメモリサイズに対応するサブメモリプール管理テーブル３２のフリーメモリアドレスに登録する。メモリ割当部２１は、サブメモリプール管理テーブル３２から取得したメモリアドレスに対応するサイズ管理テーブル３１のエントリの利用状態に使用中（Ｕｓｉｎｇ）であることを示す値を登録する。メモリ割当部２１は、サブメモリプール管理テーブル３２のリンクからデキューしたメモリブロックの先頭メモリアドレスをユーザに通知して、要求されたメモリサイズのメモリブロックをユーザに提供する。
【００４４】
一方、要求されたメモリサイズのメモリブロックがサブメモリプール２〜８にプールされていない場合、メモリ割当部２１は、ユーザから要求されたメモリサイズよりも１つ大きいメモリサイズのメモリブロックを要求するメモリ要求をサブメモリプール切替部２２に出力する（ステップＳ１０２）。
【００４５】
サブメモリプール切替部２２は、メモリ要求によって要求されたメモリサイズのメモリブロックをプールするサブメモリプール３〜８を選択し、選択したサブメモリプール３〜８を処理対象サブメモリプールに決定する。すなわち、サブメモリプール切替部２２は、メモリ要求によって処理対象サブメモリプールを現在の処理対象サブメモリプールよりも１つ大きいサイズ（この場合は、２倍のサイズ）のサブメモリプール３〜８に切り替える。
【００４６】
つぎに、メモリプール判定部２３は、処理対象サブメモリプールにメモリブロックがプールされているか否かを判定する（ステップＳ１０３）。処理対象サブメモリプールにメモリブロックがプールされていない場合、メモリプール判定部２３は、処理対象サブメモリプールを現在の処理対象サブメモリプールよりも１つサイズの大きいサブメモリプール３〜８に切り替えることをメモリブロック要求部２６に要求し、メモリブロック要求部２６は、処理対象サブメモリプールにプールされるメモリブロックより１つ大きいメモリサイズのメモリブロックを要求するメモリ要求をサブメモリプール切替部２２に出力し、サブメモリプール切替部２２は、メモリ要求によって要求されたメモリサイズのメモリブロックをプールするサブメモリプール３〜８を選択して処理対象サブメモリプールに決定する動作を、メモリブロックがプールされている処理対象サブメモリプールを検出するまで繰り返す（ステップＳ１０２，Ｓ１０３）。
【００４７】
メモリプール判定部２３によって処理対象サブメモリプールにメモリブロックがプールされていると判定された場合、メモリ分割部２４は、処理対象サブメモリプールからメモリブロックを１つ取得し、取得したメモリブロックを１／２に分割する（ステップＳ１０４）。
【００４８】
具体的には、メモリ分割部２４は、処理対象サブメモリプールに対応するサブメモリプール管理テーブル３２のフリーメモリアドレスに登録されているリンクの先頭のメモリブロックのメモリアドレスを取得する。メモリ分割部２４は、取得したメモリアドレスが示すメモリブロックの先頭３２ビットに登録されている次のリンクのメモリブロックのメモリアドレスを、処理対象サブメモリプールに対応するサブメモリプール管理テーブル３２のフリーメモリアドレスに登録する。メモリ分割部２４は、取得したメモリブロックを１／２に分割して、処理対象サブメモリプールにプールされるメモリブロックのメモリサイズより１つメモリサイズの小さいメモリブロックを２つ生成する。
【００４９】
つぎに、メモリプール部２５は、処理対象サブメモリプールのサイズより１つサイズの小さいサブメモリプール２〜７に、メモリ分割部２４によって生成された２つのメモリブロックをプールする（ステップＳ１０５）。
【００５０】
ここで、図５を参照して、１２８バイトのメモリブロックを分割して生成された２つのメモリブロック５６，５７をサブメモリプール３にプールする動作を説明する。図５において最初、６４バイトのサブメモリプール３には２つメモリブロック６５，６６がプールされている。すなわち、サブメモリプール管理テーブル３２の６４バイトフリーメモリアドレスには、メモリブロック６５の先頭メモリアドレス「０ｘＸＸＸＸ０４００ｈ」が登録され、メモリブロック６５の先頭３２バイトには、メモリブロック「０ｘＸＸＸＸ０４４０ｈ」が登録され、メモリブロック６６の先頭３２バイトには、つぎに連結されているメモリブロックが存在しないことを示す「ＮＵＬＬ」が登録されており、リンク５４，５０が形成されている。
【００５１】
メモリプール部２５は、処理対象サブメモリプールである１２８バイトのサブメモリプール４より１つサイズの小さい６４バイトのサブメモリプール３に対応するサブメモリプール管理テーブル３２の６４バイトフリーメモリアドレスに登録されているメモリアドレス「０ｘＸＸＸＸ０４００ｈ」を取得する。
【００５２】
メモリプール部２５は、取得したメモリアドレス「０ｘＸＸＸＸ０４００ｈ」を、メモリ分割部２４が生成した２つのメモリブロック５６，５７の一方のメモリブロックの先頭３２ビットに登録する。この場合は、メモリアドレス「０ｘＸＸＸＸ０３４０ｈ」から始まるメモリブロック５７の先頭３２ビットにメモリアドレス「０ｘＸＸＸＸ０４００ｈ」を登録してリンク５９を形成する。
【００５３】
メモリプール部２５は、メモリブロック５６，５７の一方のメモリブロックの先頭３２ビットに、他方のメモリブロックのメモリアドレスを登録する。この場合は、メモリブロック５６の先頭３２ビットに、メモリブロック５７の先頭のメモリアドレス「０ｘＸＸＸＸ０３４０ｈ」を登録してリンク５８を形成する。
【００５４】
メモリプール部２５は、一方のメモリブロックの先頭メモリアドレスをサブメモリプール４より１つサイズの小さいサブメモリプール３に対応するサブメモリプール管理テーブル３２のフリーメモリアドレスに登録する。この場合は、メモリブロック５６の先頭メモリアドレス「０ｘＸＸＸＸ０３００ｈ」をサブメモリプール管理テーブル３２の６４バイトのフリーメモリアドレスに登録してリンク５５を形成する。
【００５５】
これにより、サブメモリプール管理テーブル３２によって管理されるサブメモリプール３にプールされるメモリブロックのリンク構造は、リンク５４，リンク５０から、リンク５５，リンク５８，リンク５９，リンク５０となる。すなわち、サブメモリプール管理テーブル３２の６４バイトフリーメモリアドレスから始まるメモリブロックのリンクに、メモリブロック５６，５７が追加される。
【００５６】
メモリプール部２５は、サイズ管理テーブル３１のメモリブロック５６，５７の先頭３２バイトブロックに対応付けられるエントリの利用状態にＦＲＥＥを示す値を登録し、サイズ情報に６４バイトを示す値を登録する。
【００５７】
図４に戻って、メモリプール部２５がメモリ分割部２４によって１／２に分割された２つのメモリブロックをサブメモリプール２〜７にプールした後、サブメモリプール切替部２２は、処理対象サブメモリプールを１つサイズの小さいサブメモリプール２〜７、すなわちメモリプール部２５がメモリブロックをプールしたサブメモリプール２〜７に切り替える（ステップＳ１０６）。
【００５８】
サブメモリプール切替部２２は、処理対象サブメモリプールのサイズがユーザから要求されたメモリサイズのメモリブロックをプールするサブメモリプール２〜７であるか否かを判定する（ステップＳ１０７）。処理対象サブメモリプールがプールするメモリブロックのメモリサイズがユーザから要求されたメモリサイズとは異なる場合、メモリ分割部２４は処理対象サブメモリプールにプールされているメモリブロックを１／２に分割して、１つメモリサイズの小さいメモリブロックを生成し、メモリプール部２５はメモリ分割部２４によって生成されたメモリブロックを当該メモリブロックをプールするサブメモリプール２〜７にプールする動作を、処理対象サブメモリプールがプールするメモリブロックのメモリサイズがユーザから要求されたメモリサイズになるまで繰り返す（ステップＳ１０３〜Ｓ１０７）。
【００５９】
処理対象サブメモリプールのメモリサイズがユーザから要求されたメモリサイズである場合、メモリ割当部２１は、サブメモリプール管理テーブル３２を検索して要求されたサイズのメモリブロックがサブメモリプール２〜８にプールされているか否かを判定する（ステップＳ１０１）。
【００６０】
上述したように、メモリ要求によってユーザから要求されたメモリサイズのメモリブロックがサブメモリプール２〜７にプールされていない場合でも、サブメモリプール切替部２２、メモリプール判定部２３、およびメモリブロック要求部２６が、ユーザから要求されたメモリブロックのメモリサイズよりも大きいメモリブロックをプールしているサブメモリプール３〜８を検出し、サブメモリプール切替部２２、メモリプール判定部２３、メモリ分割部２４、およびメモリプール部２５が、検出されたサブメモリプール３〜８にプールされているメモリブロックを１つメモリサイズの小さいメモリブロックに分割し、分割したメモリブロックを当該メモリブロックをプールするサブメモリプール２〜７にプールするようにしているので、必ずユーザから要求されたメモリブロックのメモリサイズのサブメモリプール２〜７にメモリブロックをプールすることが可能となる。
【００６１】
要求されたサイズのメモリブロックがサブメモリプール２〜８にプールされている場合、メモリ割当部２１は、要求されたメモリサイズのメモリブロックを取得してユーザに提供する（ステップＳ１０８）。
【００６２】
先の図１のシステムメモリプール１において、たとえば、ユーザがメモリ要求によって１２８バイトのメモリブロックを要求したとする。１２８バイトのサブメモリプール４にはメモリブロックがプールされていないため、メモリ割当部２１は、要求されたメモリブロックのメモリサイズより１つメモリサイズの大きい２５６バイトのメモリブロックを要求するメモリ要求をサブメモリプール切替部２２に出力する。サブメモリプール切替部２２は、２５６バイトのサブメモリプール５を処理対象サブメモリプールに決定する。メモリプール判定部２３は、２５６バイトのサブメモリプール５にメモリブロックがプールされているか否かを判定する。サブメモリプール５にはメモリブロックがプールされていないので、メモリブロック要求部２６がサブメモリプール５にプールされるメモリブロックより１つメモリサイズの大きい５１２バイトのメモリブロックを要求するメモリ要求をサブメモリプール切替部２２に出力する。サブメモリプール切替部２２は、２５６バイトのサブメモリプール５より１つサイズの大きい５１２バイトのサブメモリプール６に切り替える。
【００６３】
メモリプール判定部２３は、５１２バイトのサブメモリプール６にメモリブロックがプールされているか否かを判定する。サブメモリプール６にはメモリブロック１３が１つプールされているので、メモリ分割部２４は、サブメモリプール６にプールされているメモリブロック１３を取得して１／２に分割して１つサイズの小さい２５６バイトのメモリブロックを２つ生成する。
【００６４】
メモリプール部２５は、メモリ分割部２４によって生成された２つの２５６バイトのメモリブロックを２５６バイトのサブメモリプール５にプールする。サブメモリプール切替部２２は、５１２バイトのサブメモリプール６より１つサイズの小さい２５６バイトのサブメモリプール５に切り替える。
【００６５】
ユーザが要求しているメモリブロックのメモリサイズは１２８バイトであるので、メモリプール判定部２３は、２５６バイトのサブメモリプール５にメモリブロックがプールされているか否かを判定する。２５６バイトのサブメモリプール５には、メモリプール部２５によって２つのメモリブロックがプールされているので、メモリ分割部２４は、１２８バイトのサブメモリプール５にプールされた２つのメモリブロックの１つを取得して１／２に分割して１つサイズの小さい１２８バイトのメモリブロックを２つ生成する。
【００６６】
メモリプール部２５は、メモリ分割部２４によって生成された２つの１２８バイトのメモリブロックを１２８バイトのサブメモリプール４にプールする。サブメモリプール切替部２２は、２５６バイトのサブメモリプール５より１つサイズの小さい１２８バイトのサブメモリプール４に切り替える。
【００６７】
ユーザが要求しているメモリブロックのメモリサイズは１２８バイトであり、１２８バイトのサブメモリプール４に２つのメモリブロックがプールされているので、メモリ割当部２１は、１２８バイトのサブメモリプール４にプールされているメモリブロックを取得してユーザに提供する。
【００６８】
このようにこの実施の形態１では、ｎのべき乗サイズのメモリブロックをメモリサイズ毎にサブメモリプール２〜８にプールするようにしているので、要求されたメモリサイズのメモリブロックがサブメモリプール２〜８にプールされている場合には、検索処理を行なうことなく高速にユーザが要求するサイズのメモリを提供することができる。
【００６９】
また、ユーザから要求されたメモリサイズのメモリブロックがサブメモリプール２〜８にプールされていない場合には、サブメモリプール切替部２２、メモリプール判定部２３、およびメモリブロック要求部２６によって実現されるサブメモリプール選択処理手段が、ユーザから要求されたメモリサイズより大きいメモリサイズのメモリブロックをプールしているサブメモリプール３〜８を検出し、サブメモリプール切替部２２、メモリプール判定部２３、メモリ分割部２４、およびメモリプール部２５によって実現されるメモリ分割処理手段が、サブメモリプール選択処理手段によって検出されたサブメモリプール３〜８にプールされているメモリブロックを、ユーザが要求したメモリサイズのサブメモリブロックになるまで順次１つメモリサイズの小さいメモリブロックに分割してサブメモリプール２〜７にプールするようにしているので、バースト的にユーザからメモリブロックを要求され、要求されたメモリサイズのメモリブロックをプールするサブメモリプール２〜７にメモリブロックがプールされていない場合でも、高速にメモリブロックを割り当てることができる。
【００７０】
また、ユーザが要求したメモリサイズのサブメモリブロックになるまで順次１つメモリサイズの小さいメモリブロックに分割してサブメモリプール２〜７にプールするようにしてメモリの共有化を計るようにしているので、従来のようにメモリサイズ毎にメモリプールを分離していた場合と比較して、メモリを有効に利用することができる。
【００７１】
さらに、この実施の形態１では、要求されたサイズのメモリブロックがサブメモリプール２〜７にプールされていない場合、順次大きいサイズのサブメモリプールを検索するようにしているので、サブメモリプールの数−１回のサブメモリプールの検索処理時間と、サブメモリプールの数−１回のサブメモリプールごとのメモリブロックの分割処理時間を加えた値が、メモリ要求を受けてからメモリブロック提供までの最悪実行時間となり、メモリ要求を受けてからメモリブロックを提供するまでの実行最悪時間を保証することができる。
【００７２】
なお、この発明における実施の形態１の記憶領域管理装置のメモリ割当部２１、サブメモリプール切替部２２、メモリプール判定部２３、メモリブロック要求部２６、メモリ分割部２４、およびメモリプール部２５によって実現される前述した各機能を、ＣＰＵ（Central Processing Unit）などのマイクロプロセッサに実行させるための記憶領域割当プログラムとして提供するようにしてもよい。
【００７３】
実施の形態２．
図６および図７を用いてこの発明の実施の形態２を説明する。この実施の形態２では、ユーザから解放されたメモリブロックを組み立てる（メモリブロックの連結）際の記憶領域管理方法について説明する。
【００７４】
図６は、この発明にかかる実施の形態２の記憶領域管理方法が適用される記憶領域管理装置の構成を示すブロック図である。図６に示した記憶領域管理装置は、図２に示したメモリ割当処理部２０の代わりに、メモリ連結処理部７０を備えている。図２に示した実施の形態１の記憶領域管理装置と同一機能を備える構成部分には同一符号を付し、重複する説明を省略する。
【００７５】
メモリ連結処理部７０は、処理対象メモリブロックのペアメモリブロックを検出するペアメモリブロック検出処理部７１と、処理対象メモリブロックとペアメモリブロックとを連結することができるか否かを判定するペアメモリブロック連結判定部７２と、処理対象メモリブロックとペアメモリブロックとを連結するペアメモリブロック連結部７３とを備えている。
【００７６】
ここで、ペアメモリブロックについて説明する。この発明にかかる記憶領域管理方法では、前述したようにシステムメモリプール１をｎのべき乗のサイズ単位のサブメモリプール２〜８で構成している。また、システムメモリプール１は、最大メモリブロック（図１では、２０４８バイト）の偶数倍とし、２０４８バイトのメモリブロックを順次１／２に分割していきサブメモリプール２〜８にプールするメモリブロックを生成する。この１／２に分割して生成された同一メモリサイズの２つのメモリブロックが、本発明におけるペアメモリブロックとなる。
【００７７】
たとえば、２０４８バイトのメモリを１／２に分割して生成された２つの１０２４バイトのメモリブロックがペアメモリブロックとなる。したがって、連続する２つの２０４８バイトのメモリブロックをそれぞれ１／２に分割して４つの１０２４バイトのメモリブロックを生成した場合、１つめの２０４８バイトのメモリブロックを１／２に分割して生成したメモリブロックを１番目、２番目とし、２つめの２０４８バイトのメモリブロックを１／２に分割して生成したメモリブロックを３番目と４番目とすると、１番目と２番目のメモリブロック、３番目と４番目のメモリブロックがそれぞれペアメモリブロックであり、２番目と３番目のメモリブロックは連続しているがペアメモリブロックとはなりえない。
【００７８】
つぎに、図７のフローチャートを参照して、この発明にかかる実施の形態２の記憶領域管理方法が適用される記憶領域管理装置の動作を説明する。なお、サブメモリプール管理テーブル３２にメモリブロックのリンクを追加する動作、およびサイズ管理テーブル３１にメモリブロックのサイズ情報および利用状態を登録する動作は、実施の形態１で説明した動作と同様であるので詳細な説明は省略する。
【００７９】
ユーザからのメモリの返却を受けると、ペアメモリブロック検出処理部７１は、メモリの返却によって解放されたメモリブロック（処理対象メモリブロック）のメモリサイズをサイズ管理テーブル３１から取得する（ステップＳ２００，Ｓ２０１）。
【００８０】
たとえば、先の図３に示した２５６バイトの使用中のメモリブロック６３が解放されたとする。メモリの返却時には、返却するメモリブロックの先頭メモリアドレス「０ｘＸＸＸＸ０７００ｈ」が通知される。ペアメモリブロック検出処理部７１は、先頭メモリアドレス「０ｘＸＸＸＸ０７００ｈ」に対応するサイズ管理テーブル３１のエントリに登録されているメモリブロックのメモリサイズ（ここでは、２５６バイト）を取得する。
【００８１】
ペアメモリブロック検出処理部７１は、取得した処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズであるか否かを判定する（ステップＳ２０２）。処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズではない場合、ペアメモリブロック検出処理部７１は、処理対象メモリブロックのメモリサイズを用いて、処理対象メモリブロックのペアメモリブロックの先頭メモリアドレスを取得する（ステップＳ２０３）。ここでは、解放されたメモリブロック６３の先頭メモリアドレス「０ｘＸＸＸＸ０６ｆｆｈ」とメモリブロック６３のメモリサイズ「０ｘ０１００ｈ」（２５６バイト）との排他的論理和（ＥＸＯＲ）によってペアメモリブロックの先頭メモリアドレス「０ｘＸＸＸＸ０６００ｈ」を取得する。
【００８２】
ペアメモリブロック連結判定部７２は、サイズ管理テーブル３１からペアメモリブロックの先頭メモリアドレスに対応付けられているメモリブロックの使用状態（サイズ情報および利用状態）を確認して、処理対象メモリブロックとの連結が可能であるか否かを判定する（ステップＳ２０４，Ｓ２０５）。具体的には、ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリブロックのメモリサイズが処理対象メモリブロックと同一メモリサイズであって、かつ未使用であるか否かを判定する。
【００８３】
ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリブロックのメモリサイズが連結しようとする処理対象メモリブロックと同一メモリサイズであって、かつ未使用の場合、ペアメモリブロック連結部７３は、処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックより１つメモリサイズの大きいメモリブロック（処理対象メモリブロックの２倍のメモリサイズのメモリブロック）生成する。
【００８４】
ペアメモリブロック連結部７３は、生成したメモリブロックをサイズ管理テーブル３１に登録するとともにサブメモリプール管理テーブル３２のリンクを変更する（ステップＳ２０６）。すなわち、処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックより１つメモリサイズの大きいメモリブロックを生成し、生成したメモリブロックのメモリサイズに応じたサブメモリプール３〜８に生成したメモリブロックをプールする。
【００８５】
上記動作を図３にて説明する。図３に示したメモリブロック５３とメモリブロック６３とを連結して５１２バイトのメモリブロックを生成する場合、メモリブロック５３の先頭３２バイトに対応するサイズ管理テーブル３１のエントリのサイズ情報に５１２バイトを示す値を登録し、利用状態にＦＲＥＥであることを示す値を登録する。また、サブメモリプール管理テーブル３２の２５６バイトのフリーメモリアドレスから始まる２５６バイトのメモリブロックのリンクからメモリブロック５３を切り離して、５１２バイトのフリーメモリアドレスから始まる２５６バイトのメモリブロックのリンクに、メモリブロック５３とメモリブロック６３とを連結して生成したメモリブロックを追加する。
【００８６】
なお、サブメモリプール管理テーブル３２からペアメモリブロックを切り離す（デキュー）処理を高速化するために、この発明にかかる実施の形態２の記憶領域管理方法が適用される記憶領域管理装置では、サブメモリプール管理テーブル３２のリンク構造として双方向リンクを用いる。すなわち、実施の形態１で説明したように未使用のメモリブロックに次に連結されるメモリブロックの先頭メモリアドレスを登録するともに、１つ前に連結されているメモリブロックの先頭メモリアドレスを登録しておく。これにより、単方向リンクの場合と比較して高速にメモリブロックをデキューすることができる。
【００８７】
ペアメモリブロック検出処理部７１は、ペアメモリブロック連結部７３によって生成されたメモリブロックを処理対象メモリブロックとしてペアメモリブロックを検出し、ペアメモリブロック連結判定部７２は、処理対象メモリブロックとペアメモリブロックとを連結可能であるか否か判定し、ペアメモリブロック連結部７３は、連結可能である場合には処理対象メモリブロックとペアメモリブロックとを連結する動作を、処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズになるか、処理対象メモリブロックとペアメモリブロックとを連結することができなくなるまで繰り返す（ステップＳ２０２〜Ｓ２０６）。
【００８８】
処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズである場合、または処理対象メモリブロックとペアメモリブロックとを連結できない（ペアメモリブロックが使用中、または処理対象メモリブロックのメモリブロックとメモリサイズが一致しない）場合、ペアメモリブロック連結判定部７２は、処理対象メモリブロックをサイズ管理テーブル３１に登録するとともにサブメモリプール管理テーブル３２のリンクにエンキューする（ステップＳ２０７）。すなわち、処理対象メモリブロックのメモリサイズに応じたサブメモリプール３〜８にプールする。
【００８９】
このようにこの実施の形態２では、メモリブロックをｎのべき乗サイズとしているので、解放されたメモリブロックと対となるペアメモリブロックをメモリブロックのメモリアドレスとサイズとの排他的論理和で取得することができるようにしているため、従来のように連結するメモリブロックをリンク検索によって検出する場合と比較して高速に連結処理を行なうことができる。そのため、リアルタイム処理が要求されるシステムに対応することが可能となるとともに、メモリを有効に利用することができる。
【００９０】
実施の形態３．
図８を用いてこの発明の実施の形態３を説明する。この発明にかかる実施の形態３の記憶領域管理方法では、図８に示すように、サブメモリプール２〜７にプールするメモリブロック９〜１４の数に閾値ＴＨ１〜ＴＨ６を設ける。閾値ＴＨ１〜ＴＨ６には、設計時に必要と考えられるメモリサイズのメモリブロック９〜１４の数を予測しておき、その数を設定する。
【００９１】
図８では、３２バイトのサブメモリプール２の閾値ＴＨ１には「６」が設定され、６４バイトのサブメモリプール３の閾値ＴＨ２には「４」が設定され、１２８バイトのサブメモリプール４の閾値ＴＨ３には「２」が設定され、２５６バイトのサブメモリプール５の閾値ＴＨ４には「５」が設定され、５１２バイトのサブメモリプール６の閾値ＴＨ５には「４」が設定され、１０２４バイトのサブメモリプール７の閾値ＴＨ６には「２」が設定されている。
【００９２】
システム起動時にシステムメモリプール１として使用するメモリ４０を初期化する際に、図８に示すように、サブメモリプール２〜７に閾値ＴＨ１〜ＴＨ６の数分のメモリブロック９〜１４をプールした後に、残ったメモリブロック１５を最大メモリサイズのサブメモリプール８にプールする。なお、メモリブロックの分割、およびメモリブロックをサブメモリプール２〜７にプールする処理は、実施の形態１のメモリ分割部２４およびメモリプール部２５の処理動作と同じであるのでここではその説明を省略する。
【００９３】
メモリ４０を初期化してサブメモリプール２〜７に閾値ＴＨ１〜ＴＨ６の数のメモリブロック９〜１４をプールして残ったメモリブロック１５をサブメモリプール８にプールした後に通常動作を開始し、ユーザからメモリ要求を受けると実施の形態１で図４のフローチャートを参照して説明したメモリ割当処理によってユーザにメモリブロックを提供する。このとき、サブメモリプール２〜７に予め閾値ＴＨ１〜ＴＨ６の数分だけのメモリブロックがプールされているので、閾値ＴＨ１〜ＴＨ６の数以内でユーザからのメモリ要求であれば、要求されたメモリサイズのメモリブロック９〜１４をプールするサブメモリプール２〜７よりも１つサイズの大きいサブメモリプール３〜８にプールされているメモリブロック１０〜１５を分割する必要がなくなり、ユーザから要求されたメモリを高速に提供することができる。
【００９４】
このようにこの実施の形態３では、サブメモリプール２〜７にプールするメモリブロックの数の閾値ＴＨ１〜ＴＨ６を設定して、システム起動時に予め閾値ＴＨ１〜ＴＨ６の数分のメモリブロック９〜１４を予めサブメモリプール２〜７にプールするようにしているので、メモリブロックの分割処理の発生を抑制し、高速にユーザが要求するサイズのメモリを提供することができる。
【００９５】
実施の形態４．
図９〜図１２を用いてこの発明の実施の形態４を説明する。実施の形態２では、ユーザからのメモリ返却によってメモリブロックが解放された場合、解放されたメモリブロックのペアメモリブロックの使用状態に基づいてメモリブロックを連結して解放されたメモリブロックから順次１つメモリサイズの大きいメモリブロックを生成してメモリブロックを連結するようにした。
【００９６】
ここで、実施の形態２の記憶領域管理方法をプログラムによって実現し、リアルタイムＯＳの記憶領域管理に適用したとする。実施の形態２では、ユーザからのメモリ返却によってメモリブロックが解放されると、解放されたメモリブロックの連結処理を実行するため、ユーザのリアルタイム処理を阻害してしまうという問題があった。
【００９７】
図９は、リアルタイムＯＳによるタスク（ユーザ）のスケジューリングを示す図である。図９では、リアルタイムＯＳの基準チック１００からタスク１０１が実行されてタスク１０２にディスパッチされ、タスク１０２が実行されてタスク１０３にディスパッチされ、タスク１０３実行後に、活性可能なタスクがなくなったことにより、リアルタイムＯＳのアイドルタスク１０４が起動されている。
【００９８】
この実施の形態４では、タスク１０１〜１０３の実行時にメモリ返却によってメモリブロックが解放された場合、解放されたメモリブロックに対して連結処理を実行することなくサブメモリプール２〜８にプールしておき、タスク１０１〜１０３が終了した後に起動されるアイドルタスク１０４の中でサブメモリプール２〜７にプールされている全てのメモリブロックに対して連結処理を実行するガベージコレクション処理プログラムを起動して、ユーザのリアルタイム処理を阻害することない記憶領域管理方法を提供する。
【００９９】
この発明にかかる実施の形態４の記憶領域管理方法は、タスク１０１〜１０３の実行時に解放されたメモリブロックを当該メモリブロックに対応するサブメモリプール２〜８にプールするメモリ解放処理プログラムと、アイドルタスク１０４の中でサブメモリプール２〜７にプールされている全てのメモリブロックに対して連結処理を実行するガベージコレクション処理プログラムとによって実現される。
【０１００】
図１０は、メモリ解放処理プログラムの処理モジュールの構成を示す図である。メモリ解放処理プログラムは、ユーザからのメモリ解放に関する処理を行なうメモリ解放処理部８０で構成される、図１０では、この発明にかかる記憶領域管理方法を実現するために必要なメモリブロックプール処理部８１のみを記載している。
【０１０１】
メモリブロックプール処理部８１は、解放されたメモリブロックを当該メモリブロックのメモリサイズに対応するサブメモリプール２〜８にプールする。すなわち、解放されたメモリブロックの先頭メモリアドレスが示すサイズ管理テーブル３１のエントリの利用状態を使用中から未使用に変更するとともに、サブメモリプール管理テーブル３２のリンクに解放されたメモリブロックをエンキューする。
【０１０２】
図１１は、ガベージコレクション処理プログラムの処理モジュールの構成を示す図である。ガベージコレクション処理プログラムは、サブメモリプール２〜７にプールされている全てのメモリブロックに対して連結処理を実行するガベージコレクション処理部（以下、ＧＣ処理部とする）９０で構成される。
【０１０３】
ＧＣ処理部９０は、ガベージコレクション処理（以下、ＧＣ処理とする）の処理対象サブメモリプールを選択するサブメモリプール切替部９１、処理対象サブメモリプールにプールされているメモリブロック全てに対して処理を実行したか否かを判定するサブメモリプール切替判定部９２と、処理対象メモリブロックのペアメモリブロックを検出するペアメモリブロック検出処理部９３、処理対象メモリブロックとペアメモリブロックとを連結することができるか否かを判定するペアメモリブロック連結判定部９４、および処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックより１つメモリサイズの大きいメモリブロックを生成してサブメモリプール３〜８にプールする次サブメモリプール・プール部９６と、処理対象メモリブロックを処理対象サブメモリプールにプールする対象サブメモリプール・プール部９７とを有するメモリプール部９５で構成される。すなわち、サブメモリプール切替部９１によって選択された処理対象サブメモリプールにプールされている全てのメモリブロックに対して、サブメモリプール切替判定部９２、ペアメモリブロック検出処理部９３、ペアメモリブロック連結判定部９４、およびメモリプール部９５がガベージコレクションを実行する。
【０１０４】
つぎに、図１２のフローチャートを参照して、ＧＣ処理部９０の動作を説明する。なお、ペアメモリブロック検出処理部９３およびペアメモリブロック連結判定部９４の動作は、実施の形態２のペアメモリブロック検出処理部７１およびペアメモリブロック連結判定部７２の動作と同じであるので、ここでは詳細な説明は省略する。また、メモリブロックをサブメモリプール２〜８にプールする動作、すなわち、サブメモリプール管理テーブル３２にメモリブロックのリンクを追加する動作、およびサイズ管理テーブル３１にメモリブロックのサイズ情報および利用状態を登録する動作は、実施の形態１で説明した動作と同様であるので詳細な説明は省略する。
【０１０５】
ガベージコレクション処理開始（ＧＣ開始）を受けるとサブメモリプール切替部９１は、ガベージコレクション（ＧＣ）を実行する処理対象サブメモリプールを選択する（ステップＳ３００）。ガベージコレクションは、小さいメモリブロックから大きいメモリブロックを組み立てていくので、サブメモリプール切替部９１は、３２バイトのサブメモリプール２、６４バイトのサブメモリプール３、１２８バイトのサブメモリプール４、２５６バイトのサブメモリプール５、５１２バイトのサブメモリプール６、１０２４バイトのサブメモリプール７、２０４８バイトのサブメモリプール８の順に処理対象サブメモリプールを選択する。
【０１０６】
サブメモリプール切替判定部９２は、処理対象サブメモリプールが最大メモリブロックのメモリブロックをプールするサブメモリプール８であるか否かを判定する（ステップＳ３０１）。処理対象サブメモリプールが最大メモリブロックのメモリブロックをプールするサブメモリプール８である場合、サブメモリプール切替部９１は処理を終了する。
【０１０７】
処理対象サブメモリプールが最大メモリブロックのメモリブロックをプールするサブメモリプール８ではない場合、ペアメモリブロック検出処理部９３は、サブメモリプール管理テーブル３２に基づいて、ガベージコレクションの処理対象メモリブロックを選択する。処理対象メモリブロックが存在する（ガベージコレクションを実行していない未処理のメモリブロックが存在する）場合、ペアメモリブロック検出処理部９３は、処理対象メモリブロックのペアメモリブロックの先頭メモリアドレスを計算する（ステップＳ３０２，Ｓ３０３）。
【０１０８】
ペアメモリブロック連結判定部９４は、サイズ管理テーブル３１からペアメモリブロックの先頭メモリアドレスに対応付けられている使用状態を確認して、処理対象メモリブロックとの連結が可能であるか否かを判定する（ステップＳ３０４，Ｓ３０５）。
【０１０９】
ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリサイズが処理対象メモリブロックのメモリサイズと異なる場合（処理対象メモリブロックのペアメモリブロックになりえない場合）、またはペアメモリブロックの利用状態が使用中である場合、対象サブメモリプール・プール部９７は、処理対象メモリブロックの連結処理を行なわずに、処理対象メモリブロックをサブメモリプール管理テーブル３２のリンクからデキューして、リンクの先頭にエンキューする（ステップＳ３０６，Ｓ３０７）。これは、処理対象サブメモリプールにプールされているメモリブロックの中で未処理のサブメモリブロックと処理を完了したメモリブロックとを識別するためである。
【０１１０】
ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリサイズが処理対象メモリブロックのメモリサイズと同一サイズ（処理対象メモリブロックのペアメモリブロックである場合）であって、かつペアメモリブロックの利用状態が未使用である場合、次サブメモリプール・プール部９６は、処理対象メモリブロックとペアメモリブロックとをサブメモリプール管理テーブル３２のリンクからデキューする（ステップＳ３０８）。
【０１１１】
次サブメモリプール・プール部９６は、処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックよりも１つメモリサイズの大きいメモリブロックを生成し、生成したメモリブロックを処理対象サブメモリプールより１つサイズの大きいサブメモリプール３〜８に対応するサブメモリプール管理テーブル３２のリンクにエンキューする（ステップＳ３０９）。
【０１１２】
メモリプール部９５が処理対象メモリブロック、または処理対象メモリブロックとペアメモリブロックとを連結して生成したメモリブロックをサブメモリプール２〜８にプールした後、サブメモリプール切替判定部９２は、処理対象サブメモリプールの未処理のメモリブロックから、次のＧＣ処理の処理対象メモリブロックを導出し、ペアメモリブロック検出処理部９３は処理対象メモリブロックのペアメモリブロックの先頭メモリアドレスを検出し、ペアメモリブロック連結判定部９４が処理対象メモリブロックとペアメモリブロックとを連結可能であるか否か判定し、連結可能である場合には次サブメモリプール・プール部９６が処理対象メモリブロックとペアメモリブロックとを連結して処理対象サブメモリプールより１つサイズの大きいサブメモリプール３〜８に連結したメモリブロックをプールし、連結できない場合には対象サブメモリプール・プール部９７が処理対象メモリブロックを処理対象サブメモリプールにプールする動作を、未処理のメモリブロックがなくなるまで繰り返す（ステップＳ３０２〜Ｓ３１０）。
【０１１３】
処理対象サブメモリプールにプールされているメモリブロックに対してガベージコレクションが終了すると、サブメモリプール切替判定部９２はサブメモリプール切替部９１に処理対象サブメモリプールを切り替えることを要求し、サブメモリプール切替部９１は、処理対象サブメモリプールを現在より１つサイズの大きいメモリプールに切り替えて、上述したステップＳ３０１〜Ｓ３１０の動作を処理対象サブメモリプールが最大メモリブロックをプールするサブメモリプール８になるまで繰り返す。
【０１１４】
このようにこの実施の形態４では、メモリ解放時には解放されたメモリブロックに対して連結処理を実行することなくサブメモリプール２〜８にプールしておき、アイドルタスク１０４の起動時にサブメモリプール２〜７にプールされているメモリブロックに対してガベージコレクション処理を実行するようにしているので、ユーザのリアルタイム処理中に解放されたメモリブロックに対する連結処理を実行する場合と比較して、ユーザ処理時間を短縮することができ、リアルタイムアプリケーションに適応することができる。
【０１１５】
実施の形態５．
図１３を用いてこの発明の実施の形態５を説明する。実施の形態４では、ガベージコレクション処理をリアルタイムＯＳのアイドル時間に実行するようにした。しかしながら、各サブメモリプール２〜７にプールされているメモリブロックの数に依存することなくガベージコレクション処理を実行するため、新たにそのサブメモリプールで、メモリブロックが必要になると、１つサイズの大きいサブメモリプールからメモリブロックを分割しなければならず、バースト的にメモリ要求および解放を行うリアルタイムシステムではメモリ割当てのオーバヘッドになるという問題があった。
【０１１６】
このような問題を改善するために、この実施の形態５の記憶領域管理方法におけるガベージコレクション処理プログラムでは、図１３に示すように、メモリブロックを連結する処理を実行するか否かを判定するガベージコレクション閾値（以下、ＧＣ閾値とする）ＴＨ１０〜ＴＨ６０をサブメモリプール２〜７毎に設定しておき、サブメモリプール２〜７にプールされているメモリブロックの数が、設定されたＧＣ閾値ＴＨ１０〜ＴＨ６０を越えた場合だけガベージコレクションを実行するものである。
【０１１７】
この発明にかかる実施の形態５の記憶領域管理方法が適用されるガベージコレクション処理プログラムの処理モジュールは、図１１に示したものとほぼ同じであり、異なる点はサブメモリプール切替部９１が処理対象サブメモリプールを選択する際に、サブメモリプール２〜７にプールされているメモリブロックの数がサブメモリプール２〜７に設定されているＧＣ閾値ＴＨ１０〜ＴＨ６０を越えているか否かを判定して、ＧＣ閾値ＴＨ１０〜ＴＨ６０を越えた数のメモリブロックをプールしているサブメモリプール２〜７を処理対象サブメモリプールとして選択することである。また、サブメモリプール管理テーブル３２には、フリーメモリアドレスとともにプールしているメモリブロックの数を登録しておく。
【０１１８】
つぎに、この発明にかかる実施の形態５のガベージコレクション処理プログラムの動作を説明する。なお、処理対象サブメモリプールを選択した後のガベージコレクションについては、実施の形態４で説明した動作と同じであるので、ここではその説明を省略し、処理対象サブメモリプールを選択する動作のみを説明する。
【０１１９】
リアルタイムＯＳのアイドル時間になってＧＣ開始を受けるとサブメモリプール切替部９１は、サブメモリプール管理テーブル３２に基づいて３２バイトのサブメモリプール２から順に、サブメモリプール２〜７にプールされているメモリブロックの数とＧＣ閾値ＴＨ１０〜ＴＨ６０とを比較して、ＧＣ閾値ＴＨ１０〜ＴＨ６０を越えた数のメモリブロックをプールしているサブメモリプール２〜７を検出し、検出したサブメモリプール２〜７を処理対象サブメモリプールとして選択する。
【０１２０】
ＧＣ開始時に、図１３に示したように、３２バイトのサブメモリプール２には９個のメモリブロック９がプールされ、６４バイトのサブメモリプール３には１０個のメモリブロック１０がプールされ、１２８バイトのサブメモリプール４には６個のメモリブロック１１がプールされ、２５６バイトのサブメモリプール５には７個のメモリブロック１２がプールされ、５１２バイトのサブメモリプール６には１０個のメモリブロック１３がプールされ、１０２４バイトのサブメモリプール７には６個のメモリブロック１４がプールされていたとする。
【０１２１】
図１３では、３２バイトのサブメモリプール２のＧＣ閾値ＴＨ１０は「１０」に設定され、６４バイトのサブメモリプール３のＧＣ閾値ＴＨ２０は「８」に設定され、１２８バイトのサブメモリプール４のＧＣ閾値ＴＨ３０は「６」に設定され、２５６バイトのサブメモリプール５のＧＣ閾値ＴＨ４０は「８」に設定され、５１２バイトのサブメモリプール６のＧＣ閾値ＴＨ５０は「１０」に設定され、１０２４バイトのサブメモリプール７のＧＣ閾値ＴＨ６０は「８」に設定されている。
【０１２２】
サブメモリプール切替部９１は、ＧＣ閾値ＴＨ１０とサブメモリプール２にプールされているメモリブロック９の数とを比較する。メモリブロック９は９個でＧＣ閾値ＴＨ１０の値「１０」を越えていないので、サブメモリプール切替部９１は、ＧＣ閾値ＴＨ２０とサブメモリプール３にプールされているメモリブロック１０の数とを比較する。メモリブロック１０は１０個でＧＣ閾値ＴＨ２０の値「８」を越えているので、サブメモリプール切替部９１は、サブメモリプール３を処理対象サブメモリプールとして選択する。
【０１２３】
サブメモリプール切替判定部９２、ペアメモリブロック検出処理部９３、ペアメモリブロック連結判定部９４、およびメモリプール部９５は、実施の形態４で図１２のフローチャートを参照して説明したように、サブメモリプール３にプールされている全てのメモリブロック１０に対してガベージコレクション（ステップＳ３０２〜Ｓ３１０）を実行する。
【０１２４】
処理対象サブメモリプールであるサブメモリプール３にプールに対するガベージコレクションが終了すると、サブメモリプール切替部９１は、処理対象サブメモリプールを切り替える。
【０１２５】
ここで、ガベージコレクションによってサブメモリプール３にプールされている１組のメモリブロック１０が連結されたとすると、サブメモリプール４に１個のメモリブロック１１がプールされてメモリブロック１１が７個になり、サブメモリプール４にプールされているメモリブロック１１の数がＧＣ閾値ＴＨ３０の値「６」を越える。したがって、サブメモリプール切替部９１は、処理対象サブメモリプールとしてサブメモリプール４を選択する。
【０１２６】
６４バイトのサブメモリプール３にプールされているメモリブロックにおいてメモリブロックが連結されなかった場合には、サブメモリプール４にプールされているメモリブロックは６個のままであり、サブメモリプール４にプールされているメモリブロックの数はＧＣ閾値ＴＨ３０の値「６」を超えていないので、サブメモリプール切替部９１は、サブメモリプール４を処理対象サブメモリプールとして選択しない。
【０１２７】
サブメモリプール切替部９１は、サブメモリプール５にプールされているメモリブロックの数とＧＣ閾値ＴＨ４０とを比較してサブメモリプール５を処理対象サブメモリプールとしてガベージコレクションを起動するか否かを判定し、５１２バイトのサブメモリプール６にプールされているメモリブロックの数とＧＣ閾値ＴＨ５０とを比較して５１２バイトのサブメモリプール６を処理対象サブメモリプールとしてガベージコレクションを起動するか否かを判定し、１０２４バイトのサブメモリプール７にプールされているメモリブロックの数とＧＣ閾値ＴＨ６０とを比較して１０２４バイトのサブメモリプール７を処理対象サブメモリプールとしてガベージコレクションを起動するか否かを判定する。
【０１２８】
このようにこの実施の形態５では、ユーザから解放されたメモリブロックに対してメモリブロックの連結処理を実行するか否かを決定するＧＣ閾値ＴＨ１０〜ＴＨ６０を設定して、サブメモリプール２〜７にプールされているメモリブロック数がＧＣ閾値ＴＨ１０〜ＴＨ６０を越えた場合のみメモリ連結を行うようにしているため、ガベージコレクション実行の発生頻度を抑制することができる。
【０１２９】
また、この実施の形態５では、解放されたメモリブロックに対してメモリブロックの連結処理を実行するか否かを決定するＧＣ閾値ＴＨ１０〜ＴＨ６０を設定して、サブメモリプール２〜７にプールされているメモリブロック数がＧＣ閾値ＴＨ１０〜ＴＨ６０を越えた場合のみメモリ連結を行うようにしているため、ＧＣ閾値ＴＨ１０〜ＴＨ６０を越えない数のメモリブロックをサブメモリプール２〜７にプールしておくことができ、高速にユーザが要求するサイズのメモリを提供することができる。
【０１３０】
さらに、ＧＣ閾値ＴＨ１０〜ＴＨ６０にサブメモリプール２〜７で利用されるピーク時のメモリブロック数を設定しておけば、メモリブロックのガベージコレクションを起動しないリアルタイムシステムを構築することができ、リアルタイム性の必要なシステムにおいて非常に有効である。
【０１３１】
また、ＧＣ閾値ＴＨ１０〜ＴＨ６０にメモリ４０の初期化時にサブメモリプール２〜７に割当てるメモリブロック数を設定しておけば、メモリ要求によってメモリブロックが分割され、１つ大きいサブメモリプール３〜８からメモリブロックを貸与された場合でも、ユーザからメモリブロックが解放されれば、即メモリブロックを組み立てて１つ大きいサブメモリプール３〜８にメモリブロックを返却するシステムを構築することができ、メモリ容量が少ないシステムにおいて非常に有効である。
【０１３２】
実施の形態６．
図１４および図１５を用いてこの発明にかかる実施の形態６を説明する。実施の形態５では、サブメモリプール２〜７にプールされているメモリブロック９〜１４に対してガベージコレクションを実行するか否かを判定するＧＣ閾値ＴＨ１０〜ＴＨ６０をサブメモリプール２〜７毎に設定しておき、サブメモリプール２〜７にプールされているメモリブロック９〜１４の数が、ＧＣ閾値ＴＨ１０〜ＴＨ６０を越えた場合だけメモリブロック９〜１４のガベージコレクションを実行するようにして、サブメモリプール２〜７にプールするメモリブロックの枯渇を防止するようにした。
【０１３３】
しかしながら、メモリブロックの数がＧＣ閾値ＴＨ１０〜ＴＨ６０を越えてガベージコレクションが実行された場合には、サブメモリプール２〜７にプールするメモリブロックが枯渇してしまう場合がある。
【０１３４】
このような問題を改善するために、この実施の形態６の記憶領域管理方法におけるガベージコレクション処理プログラムでは、図１４に示すように、メモリブロック９〜１４を連結する処理を停止するか否かを判定するガベージコレクション完了閾値（以下、ＧＣ完了閾値とする）ＴＨ１００〜ＴＨ１５０をサブメモリプール２〜７毎に設定しておき、サブメモリプール２〜７にプールされているメモリブロック９〜１４の数が、設定されたＧＣ完了閾値ＴＨ１００〜ＴＨ１５０より小さくなった場合には、処理対象サブメモリプールに対するガベージコレクションを停止するものである。
【０１３５】
この発明にかかる実施の形態６のガベージコレクション処理プログラムの処理モジュールは、実施の形態５のガベージコレクション処理プログラムの処理モジュールとほぼ同じである。実施の形態６のガベージコレクション処理プログラムの処理モジュールと実施の形態５のガベージコレクション処理プログラムの処理モジュールとの相違点は、サブメモリプール切替判定部９２が処理対象サブメモリプールを切り替えるか否かを判定する条件である。この実施の形態６のサブメモリプール切替判定部９２は、処理対象サブメモリプールにプールされているメモリブロックの数が処理対象サブメモリプールに設定されているＧＣ完了閾値ＴＨ１００〜ＴＨ１５０より小さい場合、または処理対象サブメモリプールにプールされているメモリブロック全てに対して処理を終了した場合に処理対象サブメモリプールを切り替えることを決定する。
【０１３６】
つぎに、この発明にかかる実施の形態６のガベージコレクション処理プログラムの動作を説明する。なお、上述したように、この発明にかかる実施の形態６のガベージコレクション処理プログラムは、サブメモリプール切替判定部９２が処理対象サブメモリプールを切り替えるか否かを判定する条件のみが実施の形態５に示したガベージコレクション処理プログラムと異なり、図１２のフローチャートのステップＳ３０２が、図１５のフローチャートに示した動作となる。
【０１３７】
処理対象サブメモリプールが最大メモリブロックのメモリブロック１５をプールするサブメモリプール８ではない場合（図１２のステップＳ３０１）、または処理対象サブメモリプールの未処理のメモリブロックから、次のＧＣ処理の処理対象メモリブロックを導出した後に（図１２のステップＳ３１０）、サブメモリプール切替判定部９２は、処理対象サブメモリプールに未処理のメモリブロックが存在する否かを判定する（図１５のステップＳ４００）。
【０１３８】
処理対象サブメモリプールに未処理のメモリブロックが存在する場合、サブメモリプール切替判定部９２は、ガベージコレクション実行前のメモリブロック数から連結処理に成功したメモリブロック数を減算して、処理対象サブメモリプールにその時点でプールされているメモリブロック数を算出する（図１５のステップＳ４０１）。
【０１３９】
サブメモリプール切替判定部９２は、算出したメモリブロック数と処理対象サブメモリプールに設定されているＧＣ完了閾値ＴＨ１００〜ＴＨ１５０とを比較する（図１５のステップＳ４０２）。比較の結果、算出したメモリブロック数がＧＣ完了閾値ＴＨ１００〜ＴＨ１５０より小さい場合、サブメモリプール切替判定部９２は、処理対象サブメモリプールに対するガベージコレクションを終了することを決定し、サブメモリプール切替部９１に処理対象サブメモリプールの切り替えを要求する。サブメモリプール切替部９１は、現在の処理対象サブメモリプールより１つサイズの大きいサブメモリプール３〜８を選択して処理対象サブメモリプールを切り替える（図１２のステップＳ３００）。比較の結果、算出したメモリブロック数がＧＣ完了閾値ＴＨ１００〜ＴＨ１５０以上の場合、サブメモリプール切替判定部９２は、処理対象サブメモリプールに対するガベージコレクションを継続することを決定し、ペアメモリブロック検出処理部９３が処理対象メモリブロックのペアメモリブロックのメモリアドレスの計算する（図１２のステップＳ３０３）。
【０１４０】
一方、処理対象サブメモリプールに未処理のメモリブロックが存在しない場合、サブメモリプール切替判定部９２は、処理対象サブメモリプールに対するガベージコレクションを終了することを決定し、サブメモリプール切替部９１に処理対象サブメモリプールの切り替えを要求する。サブメモリプール切替部９１が現在の処理対象サブメモリプールより１つサイズの大きいサブメモリプール３〜８を選択して処理対象サブメモリプールを切り替える（図１２のステップＳ３００）。
【０１４１】
図１４では、３２バイトのサブメモリプール２のＧＣ閾値ＴＨ１０は「１０」に設定され、ＧＣ完了閾値ＴＨ１００は「６」に設定されている。６４バイトのサブメモリプール３のＧＣ閾値ＴＨ２０は「８」に設定され、ＧＣ完了閾値ＴＨ１１０は「４」に設定されている。１２８バイトのサブメモリプール４のＧＣ閾値ＴＨ３０は「６」に設定され、ＧＣ完了閾値ＴＨ１２０は「２」に設定されている。２５６バイトのサブメモリプール５のＧＣ閾値ＴＨ４０は「８」に設定され、ＧＣ完了閾値ＴＨ１３０は「４」に設定されている。５１２バイトのサブメモリプール６のＧＣ閾値ＴＨ５０は「１０」に設定され、ＧＣ完了閾値ＴＨ１４０は「６」に設定されている。１０２４バイトのサブメモリプール７のＧＣ閾値ＴＨ６０は「８」に設定され、ＧＣ完了閾値ＴＨ１５０は「２」に設定されている。
【０１４２】
３２バイトのサブメモリプール２には、９個のメモリブロックがプールされ、６４バイトのサブメモリプール３には、１０個のメモリブロックがプールされ、１２８バイトのサブメモリプール４には、６個のメモリブロックがプールされ、２５６バイトのサブメモリプール５には、７個のメモリブロックがプールされ、５１２バイトのサブメモリプール６には、１０個のメモリブロックがプールされ、１０２４バイトのサブメモリプール７には６個のメモリブロックがプールされているので、ＧＣ閾値ＴＨ２０を越えた数のメモリブロックをプールしている６４バイトのサブメモリプール３のメモリブロックに対して、メモリブロックの数がＧＣ完了閾値ＴＨ１１０より小さくなるまでガベージコレクションを実行する。
【０１４３】
このようにこの実施の形態６では、サブメモリプール２〜７にガベージコレクションを停止するＧＣ完了閾値ＴＨ１００〜ＴＨ１５０を設定して、ガベージコレクションを実行した場合に、サブメモリプール２〜７にＧＣ完了閾値ＴＨ１００〜ＴＨ１５０の値の数のメモリブロックをプールしておくようにしているので、バースト的にメモリ割り当て、解放を行うアプリケーションに対して、最も利用頻度の高いメモリブロック数までガベージコレクションを実行させることができる。
【０１４４】
また、この実施の形態６では、サブメモリプール２〜７に、ガベージコレクションを実行するＧＣ閾値ＴＨ１０〜ＴＨ６０と、ガベージコレクションを停止するＧＣ完了閾値ＴＨ１００〜ＴＨ１５０とを設定するようにしているので、リアルタイム性とメモリ使用効率とを調整することができる。
【０１４５】
実施の形態７．
図１６および図１７を用いてこの発明の実施の形態７を説明する。実施の形態４〜６では、先の図９を用いて実施の形態４で説明したように、タスク１０１〜１０３の実行時にユーザからメモリブロックが解放された場合、解放されたメモリブロックに対して連結処理を実行することなくサブメモリプール２〜８にプールしておき、タスク１０１〜１０３が終了したに起動されるアイドルタスク１０４の中でサブメモリプール２〜７にプールされているメモリブロックに対してガベージコレクションを実行するガベージコレクション処理プログラムを起動した。
【０１４６】
しかしながら、タスク１０１〜１０３は非同期タスクである。そのため、タスク１０１〜１０３の処理時間は変動する。すなわち、図１６に示すように、チックタイム＃１（Ｔｉｃｋ  Ｔｉｍｅ＃１）で実行されるタスク１０１〜１０３の処理時間１１８と、チックタイム＃２（ＴｉｃｋＴｉｍｅ＃２）で実行されるタスク１０１〜１０３の処理時間１１８とは異なる。基準チック１００は周期的であるので、タスク１０１〜１０３の処理時間１１８の変動によりアイドル時間も変動する。したがって、アイドル時間にサブメモリプール２〜７にプールされているメモリブロックに対してガベージコレクションを実行する十分な時間がある場合と、ガベージコレクションを実行する時間が不足する場合とがあり、必ずしも１回のアイドル時間内でサブメモリプール２〜７全てに対してガベージコレクションを実行することができるとは限らない。
【０１４７】
このような問題を改善するために、この実施の形態７のガベージコレクション処理プログラムでは、サブメモリプール切替部９１が処理対象サブメモリプールを切り替える前、すなわち処理対象サブメモリプールに対してガベージコレクションが終了した時に、システム時間を取得して、次の基準チック１００までの残ＧＣ可能時間を測定し、次の処理対象サブメモリプールに対してガベージコレクションが実行可能かどうかを判定して、ガベージコレクションを実行するか否かを決定し、非同期タスク間の時間揺らぎに対応するものである。
【０１４８】
この発明にかかる実施の形態７のガベージコレクション処理プログラムの処理モジュールは、実施の形態４〜６のガベージコレクション処理プログラムの処理モジュールとほぼ同じである。実施の形態４〜６のガベージコレクション処理プログラムとの相違点は、サブメモリプール切替部９１が、処理対象サブメモリプールを切り替える前に、システム時間を取得して、次の基準チック１００までの残ＧＣ可能時間を測定して、次の処理対象サブメモリプールに対してガベージコレクションが実行可能かどうかを判定して、ガベージコレクションを実行するか否かを決定することである。
【０１４９】
つぎに、図１７のフローチャートを参照して、この発明にかかる実施の形態７のガベージコレクション処理プログラムの動作を説明する。なお、サブメモリプール２〜７を識別するために予めサブメモリプール２〜７にはサブメモリプールＩＤ（識別子）が付与されており、ＧＣ対象情報として、つぎにガベージコレクションの処理対象サブメモリプールとなるサブメモリプール２〜７を示すサブメモリプールＩＤが記憶されているものとする。ガベージコレクションは、サブメモリプール２から１つずつサイズの大きいサブメモリプール３〜７に対して実行されるので、ＧＣ対象情報の初期値はサブメモリプール２のサブメモリプールＩＤとなる。
【０１５０】
リアルタイムＯＳのアイドル時間になってＧＣ開始を受けるとサブメモリプール切替部９１は、ＧＣ対象情報からＧＣ対象となるサブメモリプールＩＤを取得する（ステップＳ５００）。サブメモリプール切替部９１は、取得したサブメモリプールＩＤが示すサブメモリプール２〜７を処理対象サブメモリプールとして選択して、実施の形態４〜６で説明したガベージコレクション処理を起動する（ステップＳ５０１）。
【０１５１】
処理対象サブメモリプールに対するガベージコレクションが終了すると、サブメモリプール切替部９１は、システム時間を取得して次の基準チック１００までの残ＧＣ可能時間を測定する（ステップＳ５０２）。
【０１５２】
サブメモリプール切替部９１は、残ＧＣ可能時間内に次のガベージコレクションを実行ことができるか否かを判定する（ステップＳ５０３）。残ＧＣ可能時間内に次のガベージコレクションを実行ことができる場合、サブメモリプール切替部９１は、処理対象サブメモリプールを切り替えて、次のサブメモリプール３〜７に対するガベージコレクション処理を起動し、ガベージコレクション処理が終了するとシステム時間を取得して次の基準チック１００までの残ＧＣ可能時間を測定し、残ＧＣ可能時間内に次のガベージコレクションを実行ことができるか否かを判定する動作を繰り返す（ステップＳ５０１〜Ｓ５０３）。
【０１５３】
残ＧＣ可能時間内に次のガベージコレクションを実行ことができない場合、サブメモリプール切替部９１は、処理対象サブメモリプールより１つサイズの大きいサブメモリプール２〜３に付与されているサブメモリプールＩＤをＧＣ対象情報として記憶して処理を終了する（ステップＳ５０４）。
【０１５４】
図１６の場合は、１番目のチックタイム＃１において、１つめの処理対象サブメモリプールに対するガベージコレクション１０５が終了した際に残ＧＣ可能時間１０９を測定し、２つめの処理対象サブメモリプールに対してガベージコレクションが実行可能と判定してガベージコレクション１０６を実行している。ガベージコレクション１０６が終了した際に残ＧＣ可能時間１１０を測定し、３つめの処理対象サブメモリプールに対してガベージコレクションを実行できないと判定して処理を中断している。
【０１５５】
２番目のチックタイム＃２において、３つめの処理対象サブメモリプールに対してガベージコレクション１０７を実行し、ガベージコレクション１０７が終了した際に残ＧＣ可能時間１１１を測定し、４つめの処理対象サブメモリプールに対してガベージコレクションが実行可能と判定してガベージコレクション１０８を実行している。ガベージコレクション１０８が終了した際に残ＧＣ可能時間１１２を測定し、５つめの処理対象サブメモリプールに対してガベージコレクションを実行できないと判定して処理を中断している。
【０１５６】
このようにこの実施の形態７では、処理対象サブメモリプールに対するガベージコレクションが終了した際に、システム時間を取得して、次の基準チック１００までの残ＧＣ可能時間を測定して、次の処理対象サブメモリプールに対してガベージコレクションが実行可能かどうかを判定して、ガベージコレクションを実行するのか、停止するのかを決定するようにしているので、アイドル時間がタスクの処理時間によって変動しても、効率的にガベージコレクションを実行することができる。
【０１５７】
実施の形態８．
図１８〜図２６を参照してこの発明にかかる実施の形態８を説明する。この実施の形態８では、実施の形態１〜７で説明した記憶領域管理方法を、ＣＰＵやＤＳＰ（Digital Signal Processor）などの複数のプロセッサで構成される分散マルチプロセッサ環境に適用した場合のメッセージ管理方法について説明する。
【０１５８】
図１８は、分散マルチプロセッサ環境の構成の一例を示す図である。ＣＰＵ１１０ａ，１１０ｂは、実施の形態１または実施の形態３で説明した記憶領域管理方法による記憶領域割当プログラムと、実施の形態４〜７で説明した記憶領域管理方法によるメモリ解放処理プログラムおよびガベージコレクション処理プログラムとを実装が実装され、サイズ管理テーブル３１ａ，３１ｂおよびサブメモリプール管理テーブル３２ａ，３２ｂを用いてメモリ４０ａ，４０ｂをシステムメモリプール１として管理する記憶領域管理部１１４ａ，１１４ｂと、メッセージを管理するメッセージ管理部１１３ａ，１１３ｂを備えている。
【０１５９】
タスク１１１ａ，１１２ａはＣＰＵ１１０ａで動作するタスクであり、タスク１１１ｂ，１１２ｂはＣＰＵ１１０ｂで動作するタスクである。共有メモリ１１５は、ＣＰＵ１１０ａとＣＵＰ１１０ｂとの間でメッセージ転送に用いられるメモリで、２つのＣＰＵ１１０ａ，１１０ｂがアクセス可能となっている。ＣＰＵ１１０ａで起動するタスク１１１ａ，１１２ａとＣＰＵ１１０ｂで起動するタスク１１１ｂ，１１２ｂとは、共有メモリ１１５を介してメッセージ交換を行なう。図１８では、ＣＰＵ１１０ａのタスク１１２ａがＣＵＰ１１０ｂのタスク１１１ｂにメッセージ１１６を転送している。
【０１６０】
複数の異なるプロセッサ上で動作するタスク間でメッセージを交換する場合、複数のプロセッサを接続してメッセージを交換しなければならない。図１９では、ＣＰＵ１２１〜１２３をバス１２０によって接続しており、図２０では、ＣＰＵ１３１〜１３３をスイッチ１３０によって接続しており、図２１では、ＣＰＵ１４１〜１４３をネットワーク１４０によって接続している。
【０１６１】
図１９〜図２１に示したように複数のプロセッサ（図１９〜図２１ではＣＰＵ１２０〜１２３，１３１〜１３３，１４１〜１４３）をバス１２０やスイッチ１３０、ネットワーク１４０などの媒体によって接続して、異なるプロセッサ上で動作するタスク間でメッセージを交換する場合、複数のメッセージブロックで構成されるメッセージをパッキングして、連続する１つのメッセージパケットを生成する必要がある。
【０１６２】
ここで、本発明と従来の記憶領域管理方法の差異を明確にするため、記憶領域管理部１１４ａ，１１４ｂが、この発明にかかる記憶領域管理方法ではなく、メモリの循環系ごとに構築したメモリプールを有効利用するために、メモリをさらに小さなブロックに分割して要求されたメモリサイズのメモリを割り当てる可変長メモリプール方式による従来の記憶領域管理方法を用いてメモリ４０を管理したと仮定する。
【０１６３】
従来の記憶領域管理方法を用いた場合のメッセージフォーマットは、たとえば、図２２に示すように、メッセージヘッダ（Message Header）１５０、第１メッセージブロック１５２、第２メッセージブロック１５５、第３メッセージブロック１５６で構成される。メッセージヘッダ１５０，第１メッセージブロック１５２，第２メッセージブロック１５５，第３メッセージブロック１５６は、連結ポインタ１５１，１５３，１５４に登録されているメモリアドレスによるリンク形式で接続される。
【０１６４】
メッセージヘッダ１５０、第１メッセージブロック１５２、第２メッセージブロック１５５、第３メッセージブロック１５６で構成されるメッセージをパッキングして、図２３に示すようなメッセージパケットを生成する場合、メッセージ管理部１１３ａ，１１３ｂは、メッセージヘッダ１５０のメッセージ長１６０、第１メッセージブロック１５２のメッセージ長１６１，第２メッセージブロック１５５のメッセージ長１６２，第３メッセージブロック１５６のメッセージ長１６３と、メッセージブロック間を接続する連結ポインタ１５１、１５３、１５４の位置を把握しておかなければならない。すなわち、メッセージ管理部１１３ａ，１１３ｂでは、異なるプロセッサ上に存在するタスク間で交換される全てのメッセージのフォーマットを認識しておく必要がある。
【０１６５】
そのため、メッセージの数の増加にともなってメッセージ管理部１１３ａ，１１３ｂのプログラムサイズが増大するという問題が生じる。また、ユーザプログラムの位置透過性を実現した場合、機能の追加にともない、プロセッサ間で交換されるメッセージが追加、変更されることも考えられる。メッセージ管理部１１３ａ，１１３ｂが、全てのメッセージフォーマットを認識する必要があるため、メッセージ変更のたびにメッセージ管理部１１３ａ，１１３ｂのプログラムを検証しなければならないという問題が生じる。
【０１６６】
しかしながら、記憶領域管理部１１４ａ，１１４ｂが、この発明にかかる記憶領域管理方法を用いてメモリ４０を管理した場合、メモリ４０をｎ（１＜ｎ，ｎは自然数）のべき乗のサイズのメモリサイズのメモリブロック単位で管理しているので、メッセージ管理部１１３ａ，１１３ｂは、メッセージのフォーマットを意識することなく、複数のメッセージブロックからなるメッセージをパッキングしてメッセージパケットを生成することを可能となる。
【０１６７】
記憶領域管理部１１４ａ，１１４ｂが、この発明にかかる記憶領域管理方法を用いてメモリ４０を管理した場合、ユーザはメモリ要求を行って記憶領域管理部１１４ａ，１１４ｂによって提供されたメモリブロックにメッセージブロックを生成する。そのため、メッセージ管理部１１３ａ，１１３ｂは、メッセージブロックの先頭メモリアドレスがわかればサイズ管理テーブル３１からメッセージブロックが記憶されているメモリブロックのメモリサイズ、すなわちメッセージ長（メッセージブロックサイズ）を取得することができる。そのため、メッセージ管理部１１３ａ，１１３ｂは、メッセージ長を認識する必要が無い。したがって、接続するメッセージブロックが記憶されているメモリアドレスが登録される連結ポインタの位置が既知であれば、メッセージ管理部１１３ａ，１１３ｂは、メッセージを構成する各メッセージブロックのフォーマットを意識することなくメッセージを１つの連続するパケットにパッキングすることができる。
【０１６８】
そこで、この発明にかかる実施の形態８のメッセージ管理方法では、全てのメッセージブロックの連結ポインタの位置をメッセージブロックの先頭からオフセットＮ（Ｎは自然数）に固定することで、メッセージ管理部１１３ａ，１１３ｂがメッセージブロックのフォーマットを意識することなく、メッセージを１つの連続するパケットにパッキングして、複数のプロセッサからなる分散環境においてもメッセージを交換することを可能にする。
【０１６９】
図２４は、メッセージブロックのオフセットＮが「０」の場合のメッセージ構成の一例を示す図である。図２４では、オフセットＮが「０」であるので、各メッセージブロック１７０，１７２，１７４，１７６の先頭に連結ポインタ１７１，１７３，１７５，１７７が位置している。
【０１７０】
図２５のフローチャートを参照して、メッセージ管理部１１３ａ，１１３ｂの動作を説明する。ユーザ（タスク）からメッセージ送信要求を受けると、メッセージ管理部１１３ａ，１１３ｂは、同一ＣＰＵ内のタスクへのメッセージ送信要求であるか否かを判定する（ステップＳ６００，Ｓ６０１）。
【０１７１】
同一ＣＰＵ内のタスクへのメッセージ送信要求ではない場合（異なるＣＰＵ内のタスクへのメッセージ送信要求の場合）、メッセージ管理部１１３ａ，１１３ｂは、メッセージ送信要求に含まれるメッセージブロックが記憶されているメモリブロックの先頭メモリアドレスを処理対象メモリアドレスとし、処理対象メモリアドレスとサイズ管理テーブル３１ａ，３１ｂとに基づいてメモリサイズ（メッセージブロック長）を取得する（ステップＳ６０２）。
【０１７２】
メッセージ管理部１１３ａ，１１３ｂは、処理対象メモリアドレスおよびメッセージブロックサイズに基づいてメッセージブロックをシステムが用いるメモリにコピーする（ステップＳ６０３）。メッセージ管理部１１３ａ，１１３ｂは、コピーしたメッセージブロックの連結ポインタにメッセージブロック長を登録する。これにより、メッセージパケットを受け取ったメッセージ管理部１１３ａ，１１３ｂは、メッセージブロック長を知ることができるので、メッセージパケットからメッセージを再構築することができる。
【０１７３】
メッセージ管理部１１３ａ，１１３ｂは、メッセージブロックの連結ポインタに登録されている次に接続されるメッセージブロックの先頭メモリアドレスを取得する（ステップＳ６０４）。メッセージ管理部１１３ａ，１１３ｂは、取得した先頭メモリアドレスがつぎに接続されるメッセージブロックが存在しないことを示すコード、たとえば「ＮＵＬＬ」になるまで、取得した先頭メモリアドレスを処理対象メモリアドレスとしてメッセージブロックサイズを取得してメッセージブロックを前回コピーしたメッセージブロックに連続してコピーする動作を繰り返す（ステップＳ６０２〜Ｓ６０５）。
【０１７４】
メッセージを構成するメッセージブロックを全てコピーしてメッセージパケットを生成すると、メッセージ管理部１１３ａ，１１３ｂは、メッセージ送信要求が示すＣＰＵのメッセージ管理部１１３ｂ，１１３ａにバス間、スイッチ間のメッセージ転送、或いはネットワークを介したＩＰ転送、ＭＡＣ転送などを用いて生成したメッセージパケットを送信して処理を終了する（ステップＳ６０６）。
【０１７５】
一方、同一ＣＰＵ内のタスクへのメッセージ送信要求の場合、メッセージをパッキングしてメッセージパケットを生成する必要がないので、メッセージ管理部１１３ａ，１１３ｂは、同一ＣＰＵ内メッセージ送信を実行して処理を終了する（ステップＳ６０７）。
【０１７６】
図２４に示したメッセージから図２６に示すメッセージパケットを生成する場合は、メッセージ送信要求に含まれるメッセージヘッダ（Message Header）１７０の先頭メモリアドレスおよびサイズ管理テーブル３１から取得したメッセージブロック長１８０に基づいてメッセージヘッダ１７０をコピーし、連結ポインタ１７１に登録されている第１メッセージブロック１７２の先頭メモリアドレスおよびサイズ管理テーブル３１から取得したメッセージブロック長１８１に基づいて第１メッセージブロック１７２をコピーし、連結ポインタ１７３に登録されている第２メッセージブロック１７４の先頭メモリアドレスおよびサイズ管理テーブル３１から取得したメッセージブロック長１８２に基づいて第２メッセージブロック１７２をコピーし、連結ポインタ１７５に登録されている第３メッセージブロック１７６の先頭メモリアドレスおよびサイズ管理テーブル３１から取得したメッセージブロック長１８３に基づいて第３メッセージブロック１７２をコピーする。
【０１７７】
このようにこの実施の形態８では、記憶領域管理部１１４ａ，１１４ｂがメモリ４０ａ，４０ｂをｎ（１＜ｎ，ｎは自然数）のべき乗のサイズのメモリサイズのメモリブロック単位で管理してサイズ管理テーブル３１にメモリブロックのメモリサイズを登録していることに着目して、メッセージブロックの先頭からオフセットＮの位置に連結ポインタを設けるようにしているので、メッセージ管理部１１３ａ，１１３ｂは、プロセッサ間で伝達されるメッセージのフォーマットを認識することなくタスク間の通信に利用する複数のメッセージブロックを有するメッセージを１つの連続領域からなるメッセージパケットにパッキングすることが可能となり、メッセージブロックのメッセージ長およびポインタ位置を把握しなければならない場合と比較してプログラムサイズを小さくすることができる。
また、メッセージのフォーマットを認識することなくメッセージパケットを生成することができるため、メッセージブロックのメッセージ長およびポインタ位置を把握しなければならない場合と比較してメッセージパケットを生成する時間を短縮することができる。
また、メッセージの構造やメッセージブロックを識別することなくメッセージをパッキングすることができるので、新たなメッセージが追加された場合でもマルチプロセッサシステムのリアルタイムＯＳを変更する必要が無い。そのため、マルチプロセッサシステムのリアルタイムＯＳを用いたシステムの検証として、追加されたメッセージに関する検証だけを行なえばよく、試験評価時間を短縮することができる。
【産業上の利用可能性】
【０１７８】
以上のように、本発明にかかる記憶領域管理方法は、少ないメモリを有効利用するとともにリアルタイム性が要求されるリアルタイムＯＳに有用であり、特に、無線ＬＡＮなどの組み込み機器に適している。
【図面の簡単な説明】
【０１７９】
【図１】この発明にかかる記憶領域管理方法が適用されるメモリプールの構成の一例を示す図である。
【図２】この発明にかかる実施の形態１の記憶領域管理方法が適用される記憶領域管理装置の構成を示すブロック図である。
【図３】図２に示したメモリと情報テーブルとの関連図である。
【図４】この発明にかかる実施の形態１の記憶領域管理装置の動作を説明するためのフローチャートである。
【図５】この発明にかかる実施の形態１の記憶領域管理装置の動作を説明するための図である。
【図６】この発明にかかる実施の形態２の記憶領域管理方法が適用される記憶領域管理装置の構成を示すブロック図である。
【図７】この発明にかかる実施の形態２の記憶領域管理装置の動作を説明するためのフローチャートである。
【図８】この発明にかかる実施の形態３の記憶領域管理装置に設定される閾値を説明するための図である。
【図９】リアルタイムＯＳによるタスクのスケジューリングを示す図である。
【図１０】この発明にかかる実施の形態４の記憶領域管理方法が適用されるメモリ解放処理プログラムの処理モジュールの構成を示す図である。
【図１１】この発明にかかる実施の形態４の記憶領域管理方法が適用されるガベージコレクション処理プログラムの処理モジュールの構成を示す図である。
【図１２】図１１に示したガベージコレクション処理部の動作を説明するためのフローチャートである。
【図１３】この発明にかかる実施の形態５のガベージコレクション処理プログラムの動作を説明するための図である。
【図１４】この発明にかかる実施の形態６のガベージコレクション処理プログラムの動作を説明するための図である。
【図１５】この発明にかかる実施の形態６のガベージコレクション処理プログラムの動作を説明するためのフローチャートである。
【図１６】リアルタイムＯＳによるタスクのスケジューリングを示す図である。
【図１７】この発明にかかる実施の形態７のガベージコレクション処理プログラムの動作を説明するためのフローチャートである。
【図１８】この発明にかかる実施の形態８の分散マルチプロセッサ環境の構成の一例を示す図である。
【図１９】分散リアルタイムＯＳ環境における複数のＣＰＵの接続構成の一例を示す図である。
【図２０】分散リアルタイムＯＳ環境における複数のＣＰＵの接続構成の一例を示す図である。
【図２１】分散リアルタイムＯＳ環境における複数のＣＰＵの接続構成の一例を示す図である。
【図２２】従来の記憶領域管理方法を用いた場合のメッセージフォーマットを示す図である。
【図２３】図２２に示したメッセージをパッキングして生成したメッセージパケットを示す図である。
【図２４】この発明にかかる記憶領域管理方法を用いた場合のメッセージフォーマットを示す図である。
【図２５】この発明にかかる実施の形態８のメッセージ管理プログラムの動作を説明するためのフローチャートである。
【図２６】図２２に示したメッセージをパッキングして生成したメッセージパケットを示す図である。
【符号の説明】
【０１８０】
１  システムメモリプール
２，３，４，５，６，７，８  サブメモリプール
９,１０，１１，１２，１３，１４，１５，５１，５２，５３，５６，５７，６１，６２，６３，６５，６６  メモリブロック
２０  メモリ割当処理部
２１  メモリ割当部
２２，９１  サブメモリプール切替部
２３  メモリプール判定部
２４  メモリ分割部
２５，９５  メモリプール部
２６  メモリブロック要求部
３０  情報テーブル
３１，３１ａ，３１ｂ  サイズ管理テーブル
３２，３２ａ，３２ｂ  サブメモリプール管理テーブル
４０，４０ａ，４０ｂ  メモリ
７０  メモリ連結処理部
７１，９３  ペアメモリブロック検出処理部
７２，９４  ペアメモリブロック連結判定部
７３  ペアメモリブロック連結部
８０  メモリ解放処理部
８１  メモリブロックプール処理部
９２  サブメモリプール切替判定部
９６  次サブメモリプール・プール部
９６  対象サブメモリプール・プール部
１００  基準チック
１０１，１０２，１０３，１１１ａ，１１１ｂ，１１２ａ，１１２ｂ  タスク
１０４  アイドルタスク
１０９，１１０，１１１，１１２  残ＧＣ可能時間
１１０ａ，１１０ｂ，１２１，１２２，１２３，１３１，１３２，１３３，１４１，１４２，１４３  ＣＰＵ
１１３ａ，１１３ｂ  メッセージ管理部
１１４ａ，１１４ｂ  記憶領域管理部
１１５  共有メモリ
１１６  メッセージ
１１８  処理時間
１２０  バス
１３０  スイッチ
１４０  ネットワーク
１５０，１７０  メッセージヘッダ
１５２，１５５，１５６，１７２，１７４，１７６  メッセージブロック
１５１，１５３，１５４，１７１，１７３，１７５，１７７  連結ポインタ
１６０，１６１，１６２，１６３  メッセージ長
１８０，１８１，１８２，１８３  メッセージブロック長
ＴＨ１，ＴＨ２，ＴＨ３，ＴＨ４，ＴＨ５，ＴＨ６  閾値
ＴＨ１０，ＴＨ２０，ＴＨ３０，ＴＨ４０，ＴＨ５０，ＴＨ６０  ＧＣ閾値
ＴＨ１００，ＴＨ１１０，ＴＨ１２０，ＴＨ１３０，ＴＨ１４０，ＴＨ１５０  ＧＣ完了閾値
【図１】
2006126973.tif 000003
【図２】
2006126973.tif 000004
【図３】
2006126973.tif 000005
【図４】
2006126973.tif 000006
【図５】
2006126973.tif 000007
【図６】
2006126973.tif 000008
【図７】
2006126973.tif 000009
【図８】
2006126973.tif 000010
【図９】
2006126973.tif 000011
【図１０】
2006126973.tif 000012
【図１１】
2006126973.tif 000013
【図１２】
2006126973.tif 000014
【図１３】
2006126973.tif 000015
【図１４】
2006126973.tif 000016
【図１５】
2006126973.tif 000017
【図１６】
2006126973.tif 000018
【図１７】
2006126973.tif 000019
【図１８】
2006126973.tif 000020
【図１９】
2006126973.tif 000021
【図２０】
2006126973.tif 000022
【図２１】
2006126973.tif 000023
【図２２】
2006126973.tif 000024
【図２３】
2006126973.tif 000025
【図２４】
2006126973.tif 000026
【図２５】
2006126973.tif 000027
【図２６】
2006126973.tif 000028