(57)【要約】  メモリ割当て要求の処理を向上させるために、データメモリを管理する方法が提供される。メモリセグメントが、そのサイズによって異なるレベルに関連づけられる。２の累乗に相当する異なるグラニュルサイズが、各レベル向けに定義される。グラニュルサイズは、各レベルに関連づけられたセグメントサイズの範囲を定義する。レベルのうち、どれが空きセグメントを含むか、および空きセグメントのサイズを示す多段階ビットマップが提供される。ビットマップは、メモリセグメントが解放され、または割り当てられる度にアップデートされる。そうすることによって、タスクおよび割込みレベル両方でメモリセグメントの割当ておよび解放を許可し、メモリのフラグメント化を低減させる決定論的「最良適合」手法が提供される。【選択図】図６
2007523412.tif 000002
【特許請求の範囲】
【請求項１】
データメモリのメモリブロックの割当てを求める要求を処理する方法であり、前記データメモリのセグメントが、これらのセグメントのサイズに従って異なるレベルに割り当てられる、前記方法であって、
（ａ）メモリブロックの割当てを求める要求を受け取るステップと、
（ｂ）前記要求されたメモリブロックと同じサイズの、またはそれより大きいセグメントを含む、前記レベルのうち最低のものを判定するステップと、
（ｃ）ステップ（ｂ）で判定された前記レベルにおいて、前記要求されたメモリブロックと同じ、またはそれより大きいサイズの空きセグメントの利用可能性を判定するステップと、
（ｄ）ステップ（ｃ）での前記判定に応じて、空きセグメントを割り当てるステップと
を含む方法。
【請求項２】
（ｅ）前記要求されたメモリブロックと同じ、またはそれより大きいサイズの空きセグメントが、ステップ（ｃ）で見つからない場合、次に高いレベルに対して、ステップ（ｃ）および（ｄ）を繰り返すステップと、
（ｆ）空きセグメントが割り当てられ、または次のレベルがなくなるまで、ステップ（ｅ）を繰り返すステップと
をさらに含む、請求項１に記載の方法。
【請求項３】
各レベルが、２の累乗に相当する異なるグラニュルサイズに関連づけられ、あるレベルに割り当てられるメモリセグメントの前記サイズが、前記それぞれのレベルの前記グラニュルサイズに関係している、請求項１または２に記載の方法。
【請求項４】
あるレベルに関連づけられた前記グラニュルサイズが、そのレベルに割り当てられるメモリセグメントの間の前記サイズの差を定義する、請求項３に記載の方法。
【請求項５】
ステップ（ａ）が、ステップ（ｂ）から（ｄ）を実施する前に、前記要求されたメモリブロックを、最低グラニュルサイズに丸めるステップをさらに含む、請求項４に記載の方法。
【請求項６】
各レベルが、前記それぞれのレベルに割り当てられるサイズの空きメモリセグメントのメモリアドレスを示すポインタのテーブルに関連づけられる、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
ステップ（ｄ）が、前記割り当てられる空きセグメントへのポインタを返すステップを含む、請求項１〜６のいずれか一項に記載の方法。
【請求項８】
（ｄ）が、空きセグメントが割り当てられない場合はヌルポインタを返すステップを含む、請求項１〜７のいずれか一項に記載の方法。
【請求項９】
ビットマップが、メモリセグメントの状態（空き、割当て済み）を示し、前記ビットマップが、ルートビットマップを備え、前記ルートビットマップの各ビットが、前記レベルの関連づけられた１つが少なくとも１つの空きセグメントを含むかどうかを示し、ステップ（ｂ）が、前記ルートビットマップから、前記最下位レベルが、前記要求されたメモリブロックと同じ、またはそれより大きいサイズのセグメントを含むかどうか判定するステップをさらに含む、請求項１〜８のいずれか一項に記載の方法。
【請求項１０】
ステップ（ａ）が、前記要求されたメモリブロックの前記サイズの示すバイナリデータセットを受け取るステップを含み、前記バイナリデータセットの各ビットが、前記レベルの１つに関連づけられたルックアップテーブルのエントリに関連づけられ、ステップ（ｂ）が、前記バイナリデータセットの最上位セットビットを判定するステップと、最上位セットビットに関連づけられた前記ルックアップテーブルの前記エントリから、前記要求されたメモリブロックと同じ、またはそれより大きいサイズのセグメントを含む前記レベルのうち最低のものを判定するステップとを含む、請求項１〜９のいずれか一項に記載の方法。
【請求項１１】
１組の所定のマスクの各マスクが、前記レベルの１つに関連づけられ、ステップ（ｅ）が、ステップ（ｂ）で判定された前記最下位レベルに関連づけられた前記マスクおよび前記バイナリデータセットに対する論理演算を実施するステップをさらに含み、前記演算の結果が、前記要求されたメモリブロックと同じ、またはそれより大きいサイズのセグメントの状態を示す前記ビットマップのビットへの索引である、請求項９または１０に記載の方法。
【請求項１２】
前記ビットマップが、複数の第２および第３段階ビットマップを備え、前記ルートビットマップの各ビットが、前記第２段階ビットマップの関連づけられた１つの、前記ビットの状態を示し、前記第２段階ビットマップの各ビットが、前記第３段階ビットマップの１つの、関連づけられた所定の数のビットの状態を示し、前記第３段階ビットマップの各ビットが、関連づけられたセグメントが空いているかどうかを示し、前記演算結果が、前記第２段階ビットマップの１ビット、および前記第２段階ビットマップの前記１ビットに関連づけられた前記第３段階ビットマップのビットの前記所定の数の１ビットへの索引であり、前記第３段階ビットマップの前記１ビットが、前記要求されたメモリブロックと同じ、またはそれより大きいサイズのセグメントの状態を示す、請求項１１に記載の方法。
【請求項１３】
ステップ（ｃ）が、空きセグメントが見つからない場合、空きセグメントが見つかるまで、または前記第３段階ビットマップの前記所定の数のビットのより上位のビットがなくなるまで、前記第３段階ビットマップの前記所定の数のビットの次の上位ビットの前記判定を繰り返すステップをさらに含む、請求項１２に記載の方法。
【請求項１４】
ステップ（ｃ）が、空きセグメントが見つからない場合、空きセグメントが見つかるまで、または前記１つの第２段階ビットマップのより上位のビットがなくなるまで、前記第２段階ビットマップの次の上位セットビットに関連づけられた前記第３段階ビットマップの前記所定の数のビットに対して、前記判定を繰り返すステップをさらに含む、請求項１３に記載の方法。
【請求項１５】
ステップ（ｃ）が、空きセグメントが見つからない場合、空きセグメントが見つかるまで、または前記ルートビットマップのより上位のビットがなくなるまで、前記ルートビットマップの次の上位セットビットに関連づけられた前記第２段階ビットマップに対して、前記判定を繰り返すステップをさらに含む、請求項１４に記載の方法。
【請求項１６】
前記第３段階ビットマップの各ビットが、空きメモリセグメントのメモリアドレスを示すポインタのテーブル中のエントリに関連づけられる、請求項１２または１５に記載の方法。
【請求項１７】
データメモリを管理する方法であって、
前記データメモリのいくつかのレベルを定義するステップと、
各レベル向けに異なるグラニュルサイズを定義するステップと、
各レベル向けに、メモリセグメントの異なる複数のサイズの異なる範囲を定義するステップと
を含み、各メモリセグメントのサイズが、前記それぞれのレベルの前記グラニュルサイズに関係し、メモリブロックの割当てを求める要求が、前記要求されたメモリブロックと同じサイズの、またはそれより大きいセグメントを含むレベルを判定すること、およびそのレベルにある、前記要求されたメモリブロックと同じ、またはそれより大きいサイズの空きセグメントを割り当てることによって処理可能である方法。
【請求項１８】
前記グラニュルサイズが、各レベルでのメモリセグメントの間の前記サイズの差を定義する、請求項１７に記載の方法。
【請求項１９】
各セグメントの状態（空き、割当て済み）およびレベルが少なくとも１つの空きセグメントを含むかどうかを示すビットマップを生成するステップをさらに含む、請求項１７または１８に記載の方法。
【請求項２０】
前記ビットマップが、ルートビットマップを備え、各レベルが、前記セグメントに関連づけられた前記ルートビットマップ、複数の第２および第３段階ビットマップの１ビットに関連づけられ、前記ルートビットマップの各ビットが、前記第２段階ビットマップの関連づけられた１つの、前記ビットの状態を示し、前記第２段階ビットマップの各ビットが、前記第３段階ビットマップの１つの、関連づけられた所定の数のビットの状態を示す、請求項１９に記載の方法。
【請求項２１】
セグメントが割り当てられるとき、前記ビットマップをアップデートするステップ
をさらに含む、請求項１９または２０に記載の方法。
【請求項２２】
セグメントが解放されるとき、前記ビットマップをアップデートするステップ
をさらに含む、請求項１９〜２１のいずれか一項に記載の方法。
【請求項２３】
前記それぞれのレベルに関連づけられたサイズの空きメモリセグメントのメモリアドレスを示す、各レベル向けのポインタのテーブルを生成するステップをさらに含む、請求項１７〜２２のいずれか一項に記載の方法。
【請求項２４】
前記第３段階ビットマップの各ビットが、前記ポインタテーブル中のエントリに関連づけられた、請求項１９〜２２のいずれか一項に従属する、請求項２３に記載の方法。
【請求項２５】
ルックアップテーブルを生成するステップ
をさらに含み、前記ルックアップテーブルの各エントリが、前記要求されたメモリブロックの前記サイズを示し、前記レベルの１つを示すバイナリデータセットのビットに関連づけられた、請求項１７〜２４のいずれか一項に記載の方法。
【請求項２６】
１組のマスクを生成するステップ
をさらに含み、マスクの前記組がそれぞれ、前記レベルの１つに関連づけられ、バイナリデータセットの論理演算が、前記要求されたメモリブロックの前記サイズを示し、前記要求されたメモリブロックと同じサイズの、またはそれより大きいセグメントを含むレベルに関連づけられた前記マスクが、そのレベルでの、前記要求されたメモリブロックと同じ、またはそれより大きいサイズのセグメントへの索引を生じる、請求項１７〜２５のいずれか一項に記載の方法。
【請求項２７】
メモリ割当て要求に応答した割当て用の、異なるサイズのメモリセグメントを備えるデータメモリを管理する方法であって、
サイズおよび状況（空き、割当て済み）に関わらず、連続したメモリセグメントからなる第１の二重連結リストを作成するステップと、
同じサイズの空きメモリセグメントからなる第２の二重連結リストを作成するステップと
を含む方法。
【請求項２８】
前記第１の二重連結リスト中のメモリセグメントが、関連づけられたメモリアドレスの順序で構成される、請求項２７に記載の方法。
【請求項２９】
メモリセグメントを解放する際、
前記第１の二重連結リストを使って、解放されるべき前記メモリセグメントに隣接するメモリセグメントの状態を判定するステップと、
解放されるべき前記メモリセグメントを、隣接する空きメモリセグメントとマージするステップと、
それに従って、前記第１および第２の二重連結リストをアップデートするステップと
をさらに含む、請求項２７または２８に記載の方法。
【請求項３０】
第２の各二重連結リストがＬＩＦＯ（後入れ先出し）リストである、請求項２７〜２９のいずれか一項に記載の方法。
【請求項３１】
要求されてメモリセグメントが割り当てられる際、前記第２の二重連結リストをアップデートするステップを含む、請求項２７〜３０のいずれか一項に記載の方法。
【請求項３２】
要求されて、割当て用に判定されたセグメントが、要求されたメモリブロックより大きい場合、
前記要求を満たす程十分に大きい、前記判定されたセグメントの部分を割り当てるステップと、
残っている部分を、新たな空きメモリセグメントとして提供するステップと、
それに従って、前記第１および第２の二重連結リストをアップデートするステップと
をさらに含む、請求項２７〜３１のいずれか一項に記載の方法。
【請求項３３】
各セグメントが、ヘッダに関連づけられることによって、前記第１の二重連結リストを形成し、各ヘッダが、前記関連づけられたセグメントの前記サイズを示す情報、前記関連づけられたセグメントの状態（空き、割当て済み）を示す情報、および前のセグメントの前記メモリアドレスを示すポインタを含む、請求項２７〜３２のいずれか一項に記載の方法。
【請求項３４】
所与のサイズの各空きセグメントに関連づけられた前記ヘッダが、同じサイズの前および／または後続空きセグメントの利用可能性に応じて、かつ前記ＬＩＦＯリスト中での同じサイズの空きセグメントの順序に従って、同じサイズの前および／または後続空きセグメントの前記メモリアドレスを示すポインタをさらに含む、請求項３０または３３に記載の方法。
【請求項３５】
データメモリを管理する方法であって、
前記データメモリの空きセグメントを、そのサイズに従って異なるレベルに割り当てるステップと、
異なる段階を備えるビットマップを提供するステップと
を含み、ある段階の前記ビットが、前記レベルにある空きセグメントの利用可能性を示し、別の段階の前記ビットが、空きセグメントの状態および／またはサイズおよび／または場所を示す方法。
【請求項３６】
ある段階の前記ビットが、空きセグメントの前記メモリアドレスを示すポインタに関連づけられる、請求項３５に記載の方法。
【請求項３７】
前記ビットマップを、メモリセグメントの割当てまたは解放を反映するようにアップデートするステップ
をさらに含む、請求項３５または３６に記載の方法。
【請求項３８】
前記データメモリのセグメントの解放および割当てを含む、データメモリを管理する方法であって、
メモリセグメントを解放するとき、解放される前記メモリセグメントに隣接するメモリセグメントの状態を判定するステップと、
解放される前記メモリセグメントを、隣接する空きメモリセグメントとマージするステップと
を含む方法。
【請求項３９】
請求項１７〜２６、請求項２７〜３４、請求項３５〜３７および請求項３８のいずれか一項に記載の方法を含む、データメモリを管理する方法。
【請求項４０】
請求項１〜３９のいずれか一項に記載の方法を実施するように適合された、コンピュータ用のオペレーティングシステム。
【請求項４１】
前記オペレーティングシステムがリアルタイムのオペレーティングシステムである、請求項４０に記載のオペレーティングシステム。
【請求項４２】
請求項１〜３９のいずれか一項に記載の方法をタスクレベルで実施するように適合された、請求項４０または４１に記載のオペレーティングシステム。
【請求項４３】
請求項１〜３９のいずれか一項に記載の方法を割込みレベルで実施するように適合された、請求項４０〜４２のいずれか一項に記載のオペレーティングシステム。
【請求項４４】
コンピュータ上で作動されると、請求項１〜３９のいずれか一項に記載の方法を実施するように適合されたコンピュータプログラム。
【請求項４５】
コンピュータによって実行されると、請求項１〜３９のいずれか一項に記載の方法を実施する、１組の命令を格納している記憶媒体。
【請求項４６】
請求項１〜３９のいずれか一項に記載の方法を実施するようにプログラミングされたコンピュータシステム。
【請求項４７】
請求項１〜３９のいずれか一項に記載の方法を実施するように構成されたプロセッサ。
【発明の詳細な説明】
【発明の分野】
【０００１】
本発明は、データメモリのメモリブロックの割当てを求める要求を処理する方法、およびデータメモリを管理する方法に関する。
【背景技術】
【０００２】
アプリケーションからの要求があると、空きメモリを割り当てるのに、メモリアロケータが運用システムによって使用される。ページメモリ管理ユニット（ＰＭＭＵ）を使用するハードウェアにおいて、メモリは、固定サイズのメモリページに分けられる。したがって、メモリの簡単な割当て方は、空いている固定サイズのメモリページの割当てである。この手法の欠点の１つは、特に、小さいメモリブロックおよび大きいメモリブロックの割当てを必要とするアプリケーションにおいて、柔軟性がないことである。その結果、メモリが無駄にされる。
【０００３】
概して、メモリ割当ての問題を扱うための様々な手法がある。１つの手法は、「最初適合」と呼ばれる。この手法は速いが、メモリを無駄にする。一例は、要求されたサイズに最も近い、２の累乗値であるサイズのうち上位のものを、メモリセグメントに割り当てるものである。たとえば、２０４９バイトを求める要求を満たすと、４０９６バイトを割り当てることになる。したがって、２０４７バイトが無駄にされる。この結果、メモリのフラグメント化を引き起こす。数百または数千回のメモリ割当ておよび割当て解除の後、空きセグメントがメモリ中に分散され、十分に大きいセグメントを割り当てることがますます難しくなる。というのは、十分なメモリが残されているのに、空きセグメントが小さく、ばらばらにされているからである。
【０００４】
別の手法は、「最良適合」と呼ばれる。この手法では、メモリの浪費は制限されるが、セグメントの割当ては、要求されたメモリブロックのサイズに最も近いサイズのセグメントを選択するために、すべての空きセグメントが探索されることを必要とする。この手法は、フラグメント化の問題に対処するが、決定論的ではない。
【０００５】
リアルタイムのオペレーティングシステムは、メモリの迅速な割当ておよび低フラグメント化を要する。さらに、メモリの割当ておよび割当て解除は、タスクおよび割込みレベルで実施可能であるべきである。後者のケースでは、応答時間および決定論の両方が重大である。現時点で、従来の「最初適合」および「最良適合」アルゴリズムは、こうした要件を満たしていない。
【０００６】
したがって、メモリ割当て要求を管理する改良型の方法が必要とされる。本発明は、この必要性に対処することを目的とする。
【発明の概要】
【０００７】
本発明の一態様によると、データメモリのメモリブロックの割当てを求める要求を処理する方法が提供され、データメモリのセグメントが、そのサイズに従って異なるレベルに割り当てられ、この方法は、（ａ）メモリブロックの割当てを求める要求を受け取るステップと、（ｂ）要求されたメモリブロックと同じサイズの、またはそれより大きいセグメントを含む、前記レベルのうち最低のものを判定するステップと、（ｃ）ステップ（ｂ）で判定されたレベルにおいて、要求されたメモリブロックと同じ、またはそれより大きいサイズの空きセグメントの利用可能性を判定するステップと、（ｄ）ステップ（ｃ）での判定に応じて、空きセグメントを割り当てるステップとを含む。
【０００８】
本発明の別の態様によると、データメモリを管理する方法が提供され、この方法は、データメモリのいくつかのレベルを定義すること、各レベル向けに異なるグラニュル（granule）サイズを定義すること、各レベル向けに、メモリセグメントの異なる複数のサイズの異なる範囲を定義することを含み、各メモリセグメントのサイズは、それぞれのレベルのグラニュルサイズに関係し、メモリブロックの割当てを求める要求が、要求されたメモリブロックと同じサイズの、またはそれより大きいセグメントを含むレベルを判定すること、およびそのレベルにある、要求されたメモリブロックと同じ、またはそれより大きいサイズの空きセグメントを割り当てることによって処理可能である。
【０００９】
本発明の別の態様によると、メモリ割当て要求に応答した割当て用の、異なるサイズのメモリセグメントを備えるデータメモリを管理する方法が提供され、この方法は、サイズおよび状況（空き、割当て済み）に関わらず、連続したメモリセグメントからなる第１の二重連結リストを作成すること、および同じサイズの空きメモリセグメントからなる第２の二重連結リストを作成することを含む。
【００１０】
本発明の別の態様によると、データメモリを管理する方法が提供され、この方法は、データメモリの空きセグメントを、そのサイズに従って異なるレベルに割り当てること、および異なる段階を備えるビットマップを提供することを含み、ある段階のビットが、前記レベルにある空きセグメントの利用可能性を示し、別の段階のビットが、空きセグメントの状態および／またはサイズおよび／または場所を示す。具体的には、ビットマップの最終段階が、セグメントの状態、ならびに空きセグメントのサイズおよび場所を直接示す。
【００１１】
本発明の別の態様によると、データメモリのセグメントの解放および割当てを含む、データメモリを管理する方法が提供され、この方法は、メモリセグメントを解放するとき、解放されるメモリセグメントに隣接するメモリセグメントの状態を判定すること、および解放されるメモリセグメントを、隣接する空きメモリセグメントとマージすることを含む。
【００１２】
本発明の別の態様によると、上記方法のいずれかを実施するように適合された、コンピュータ用のオペレーティングシステムが提供される。
【００１３】
本発明の別の態様によると、コンピュータ上で作動されると、上記方法のいずれかを実施するように適合されたコンピュータプログラムが提供される。
【００１４】
本発明の別の態様によると、コンピュータによって実行されると、上記方法のいずれかを実施する１組の命令を格納している記憶媒体が提供される。
【００１５】
本発明の別の態様によると、上記方法のいずれかを実施するようにプログラミングされたコンピュータシステムが提供される。
【００１６】
本発明の別の態様によると、上記方法のいずれかを実施するように構成されたプロセッサが提供される。
【００１７】
本発明の一実施形態によるアルゴリズムは、タスクおよび割込みレベル両方でメモリセグメントを割り当て、解放し、そうすることによって、メモリのフラグメント化を低減させ、メモリを管理する際の効率を上げるための決定論的「最良適合」手法を可能にする。具体的には、このアルゴリズムは、空きセグメントを求めてメモリを走査するとき、ループを排除し、そうすることによって、決定論および予測可能性をもたらす。このアルゴリズムは、どのプロセッサを使っても実装することができる。また、このアルゴリズムは、ハードウェアを使っても、ソフトウェアを使っても実装することができる。本発明は、無駄にされるメモリを最小限にすることを目的とする。６４０バイトより大きい要求サイズに対して、無駄にされるメモリの割合は、５％未満である。
【００１８】
本発明の例示的な実施形態を、これ以降で図面を参照して記述する。
【実施形態の詳細な説明】
【００１９】
本発明の実施形態によると、相異なるレベルから、メモリセグメントを、そのサイズに従って割り当てること、各レベルに対して異なるグラニュルサイズ（２の累乗）を使用すること、およびメモリブロックの割当てを求める要求を扱うとき、速度を増すために、多段階ビットマップを使用することを特徴とするアルゴリズムが提供される。
【００２０】
より具体的には、メモリセグメントが、そのサイズに従って７つのレベルから割り当てられる。許容可能なセグメントサイズの範囲が、各レベルごとに定義される。具体的には、グラニュルサイズが各レベルごとに定義され、２５５通りの固定セグメントサイズが、グラニュルサイズの倍数として定義される。所与のレベルに対して、サポートされる最も大きいセグメントサイズは、
ｍａｘＳｅｇＳｉｚｅ＝２Ｎ＝２５６×Ｇ
であり、Ｇは、そのレベルのグラニュルサイズである。
【００２１】
各レベルは、そのレベル向けに定義されたサイズの空きメモリセグメントのリストをポイントするポインタを含むテーブルを表す。したがって、各テーブルには、最大２５５個のポインタがある。
【００２２】
図１は、レベル０向けに定義される、メモリセグメントのサイズを示す。レベル０は、３２バイトのグラニュルサイズを有する。レベル０のセグメントのサイズは、６４バイトより大きく、８１９２バイトより小さい範囲である。２５５通りのセグメントサイズがある。
【００２３】
テーブル１は、各レベル向けのグラニュルサイズおよびメモリセグメントサイズの範囲を示す。
【表１】
2007523412.tif 000003
【００２４】
フラグメント化は、グラニュルサイズに直接関係している。グラニュルサイズが小さい程、フラグメント化は低下する。一方、グラニュルサイズが小さい程、管理可能な最大メモリセグメントサイズが小さくなる。したがって、グラニュルサイズと管理可能な最大メモリセグメントサイズの間には、トレードオフが存在する。したがって、グラニュルサイズは、割り当てられるメモリブロックのサイズに従って選択される。たとえば、要求されたメモリブロックのサイズが４Ｋバイトを超えない場合、レベル０に対する１６バイトのグラニュルにより、１バイト〜４Ｋバイトの範囲の２５５通りのセグメントサイズのサポートが可能になる。こうすることにより、メモリ使用効率がかなり上がる。
【００２５】
上述したように、各レベルは、最大２５５個のポインタからなるテーブルに関連づけられる。ただし、空きメモリセグメントを割り当てるために、あるレベルのポインタからなるテーブルを走査するのではなく、３段階ビットマップが用いられる。そうすることによって、メモリ割当てアルゴリズムの決定論的行動が実現される。この手法も、正しいサイズの空きメモリセグメントの識別をかなり高速化する。
【００２６】
本発明の実施形態において使用するための例示的な３段階ビットマップを、図２に示す。このビットマップは、ルートビットマップ１（第１段階）、第２段階ビットマップ２および第３段階ビットマップ３を備える。ルートビットマップ１は、その各ビットが、第２段階ビットマップ２の関連づけられた８ビットワードを制御する、８ビットワードである。第２段階ビットマップ２の関連づけられた８ビットワードの１つまたは複数のビットが１にセットされると、対応するルートビットマップのビットも１にセットされる。同様に、第２段階ビットマップ２の各ビットは、第３段階ビットマップ３の３２ビットに関連づけられる。第３段階ビットマップ３の３２ビットワードの１つまたは複数のビットがセットされると、関連づけられた第２段階ビットマップ２の対応するビットも１にセットされる。したがって、ルートビットマップ１の各ビットは、第３段階ビットマップ３の２５６ビットを表す。したがって、第３段階ビットマップ３は、それぞれが８つの３２ビットワードからなる２５６ビット列を備える。
【００２７】
第３段階ビットマップ３の各ビットは、ポインタテーブル中のエントリに関連づけられる。３段階ビットマップを使うことによって、空きメモリセグメントを求める、２５６ビットアレイ（すなわち、あるレベルのポインタからなるテーブル）の走査を、これ以降でさらに詳しく説明するように、ルートビットマップの１ビットのみを調べることによって実施することができる。そうすることによって、走査動作は、かなり単純化され、高速化される。
【００２８】
本実施形態では、ルートビットマップ１および第２段階ビットマップ２は、８ビットワードからなる。ただし、異なるアプリケーション向けの代替実施形態では、ルートビットマップおよび第２段階ビットマップは、ルートビットマップの各ビットが第３段階ビットマップの１０２４ビットを表す、３２ビットワードからなるものでもよい。
【００２９】
本実施形態のアルゴリズムは、メモリ割当て要求に応答して、最良適合するメモリセグメントを割り当てる。このアルゴリズムを、図３に示す。要求されるメモリブロックのサイズは、図４に示すように、３２ビットワード１０に含まれる。要求されるメモリブロックサイズは、最低グラニュルサイズ、すなわち本実施形態では、３２バイトに最も近い因数に切り上げられる。
【００３０】
７つの３２ビットワードのマスクの組１１および３１個のエントリを含むルックアップテーブル１２が、一度の動作で、適切なレベルおよび関連づけられたビットマップ（ルート、第２および第３段階ビットマップ）への対応する索引を判定するのに使われる。マスク１１は、予め定められ、それぞれ、レベルの１つに関連づけられる。
【００３１】
ルックアップテーブル１２の内容は、初期化の際に計算される。上述したように、要求されたメモリブロックサイズを、最も小さいグラニュルサイズに従って丸めた後、３２ビットワード１０の最も高位のセットビットは、最上位ビットから始まると判定される。最も高位のセットビットは、要求されたメモリブロックのサイズに対応するレベルを含む、ルックアップテーブル１２中のエントリへの索引を表す。このビットは、そのレベルに関連づけられた、マスク１１の１つにも索引づけを行う。
【００３２】
このように判定されたレベルは、ルートビットマップ１の関連づけられたビットに索引づけを行う。このビットが１にセットされると、第１および第２段階ビットマップ２、３への索引が計算される。第１および第２段階ビットマップ２、３への索引は、３２ビットワード１０の内容と、ルックアップテーブル１２によって索引づけされたマスクとを論理的に結合することによって計算される。この論理結合は、ＡＮＤ／シフト演算である。
【００３３】
第３段階ビットマップ３の索引づけられたビットが１にセットされている場合、必要とされるサイズの空きメモリセグメントが見つかっている。０にセットされている場合、より大きい空きセグメントを見つけ、割り当てなければならない。より大きいセグメントの探索は、図５に示すように、以下のステップを含む。
・第３段階ビットマップ３の現在の３２ビットワード中で、次のセットビットを見つける。
・現在の第３段階３２ビットワード中で他のどのビットもセットされていない場合、第２段階ビットマップ２の現在の８ビットワード中で、次のセットビットを見つける。
・現在の第２段階８ビットワード中で他のビットがセットされていない場合、ルートビットマップ１の中で、次のセットビットを見つける。
【００３４】
ルートビットマップ１の中で他のどのビットもセットされていない場合、メモリ割当て要求を満たすような空きメモリセグメントはなく、ヌルポインタが返される。
【００３５】
［第１の実施例］
第１の実施例では、全体的なメモリは１Ｇバイトであり、そのすべてが空いている。４００バイトの割当てを求める要求が受け取られる。
【００３６】
第１ステップで、要求されたメモリのサイズが、最も小さいグラニュルサイズ、すなわち３２バイト（レベル０のグラニュルサイズ）に従って丸められる。この結果、丸められたサイズは、２進数１１０１０００００に対応する４１６バイトになる。この２進数は、３２ビットワード１０（図４）に含まれる。
【００３７】
続いて、３２ビットワード１０の最も高位のセットビットが判定される。このビットは、８番のビットであり、ルックアップテーブル１２の第８のエントリへの索引に対応する。ルックアップテーブル１２の８つのエントリは、要求されたメモリブロックのサイズに対応するレベル、すなわち本実施例ではレベル０を示す。次のステップで、レベル０に関連づけられたルートビットマップ１のビットの内容が判定される。本実施例において、メモリ全体が空いており、１Ｇバイトのただ１つの空きセグメントがあり、すなわち、ルートビットマップ１の、最上位を除くすべてのビットが０であるので、ルートビットマップ１のレベル０ビットは０である。この結果により、第２および第３段階ビットマップへの索引を計算するためのＡＮＤ／シフト演算は実施されない。
【００３８】
レベル０ビットは０なので、ルートビットマップ１の次のセットビットが判定される。上で説明したように、このビットは、ルートビットマップ１の最上位ビット、すなわち、レベル６に関連づけられたものである。
【００３９】
次いで、第２段階ビットマップ２の最も低位のセットビットが判定される。このビットは、７番のビット、すなわち第２段階ビットマップ２の最も高位の有効ビットである。同様に、第２段階ビットマップ２の７番のビットに関連づけられた、第３段階ビットマップ３の３２ビットワードの最も低位のセットビットが判定される。このビットは、３２ビットワードの最上位ビット、すなわち３１番のビットである。このビットは、割り当てられる空きメモリセグメントの物理メモリアドレスを示すポインタに関連づけられる。
【００４０】
本実施例において、空きメモリセグメントのサイズは、１Ｇバイト−１バイト（テーブル１と比較されたい）であるが、４１６バイトしか要求されていない。したがって、空きセグメントは２つ、すなわち、４４８未満のサイズの割当て済みセグメント（図１を参照）と、１Ｇバイト−（４４８＋１）バイトの新たな空きセグメントとに分割される。ビットマップは、それに従ってアップデートされる。
【００４１】
［第２の実施例］
第２の実施例では、全体的なメモリサイズは、やはり１Ｇバイトである。レベル０の１つのセグメント（たとえば、１０２４バイト未満）およびレベル１の１つのセグメント（たとえば、３２，７６８バイト未満）を除くすべてのメモリが割り当てられている。１８，０３０バイトを求める要求が受け取られる。
【００４２】
第１ステップで、要求は、１８，０４８バイトに丸められる。これは、１０００１１０１０００００００という２進数に対応する。したがって、３２ビットワード１０の最も高位のセットビットは、１５番のビットである。
【００４３】
次のステップで、ルックアップテーブル１２の１５番のエントリが判定される。これは、要求されたメモリのサイズに従った、レベル１への索引である。
【００４４】
続いて、ルートビットマップ１のレベル１ビットの状態が判定される。レベル１には空きメモリセグメントがあるので、このビットは、１にセットされている。
【００４５】
次いで、メモリ要求のサイズに対応する２進数（１０００１１０１０００００００）およびマスク１１のレベル１エントリ（７Ｆ８０に対応する１１１１１１１１００００００）に対して、ＡＮＤ／シフト演算が実施される。演算結果は、１０００１１０１である。
【００４６】
演算結果は、最良適合するメモリセグメントサイズに関連づけられた、第２および第３段階ビットマップのビットに索引をつける。この例では、第２段階ビットマップ２の４番のビット、および第２段階ビットマップ２の４番のビットに関連づけられた第３段階ビットマップ３の３２ビットワードの１３番のビットである。これは、１４１番のポインタ（＝演算結果）に対応し、最良適合するサイズである１８，１７６バイト未満のセグメントの物理メモリアドレスを示す。具体的には、演算結果の３つの上位ビット（１００）が、第２段階ビットマップ２の４番のビットに対応し、演算結果の５つの下位ビットが、第３段階ビットマップ３の１３番のビットに対応する。
【００４７】
しかし、このサイズの空きメモリセグメントで空いているものはないので、第３段階ビットマップの１３番のビットは０である。したがって、上述したように、第３段階ビットマップ３の中のセットビットが見つかるまで、第３および第２段階ビットマップが探索される。本実施例において、このセットビットは、レベル１の第２段階ビットマップ２の最上位ビットに関連づけられた、第３段階ビットマップ３の３２ビットワードの最上位ビットであり、３２，７６８未満のサイズの空きメモリセグメント（２５６番のポインタ）に対応する。
【００４８】
続いて、この空きメモリセグメントは、２つ、すなわち、１８，１７６バイト未満のサイズの割当て済みセグメントと、３２，７６８（１８，１７６＋１）バイトのサイズの新たな空きセグメントとに分割される。ビットマップは、それに従ってアップデートされる。
【００４９】
実施例に示したように、最初に、空きメモリは、単一の空きセグメントを含み、１ビットのみが、ルートビットマップ１、第２段階ビットマップ２および第３段階ビットマップ３のそれぞれにおいてセットされる。
【００５０】
第３段階ビットマップ３は、空きメモリセグメントのアドレスを示すポインタからなるテーブルに関連づけられる。このポインタテーブルは、第３段階ビットマップに従ってアップデートされる。
【００５１】
空きメモリセグメントが割り当てられるべきであり、かつそのセグメントが要求されたメモリより大きい場合、そのセグメントは、要求されたサイズに従って、２つのサブセグメントに分割される。空きサブセグメントが割り当てられるべきであるが、大きすぎる場合、サブセグメントは、再度分割することができ、以下同様である。
【００５２】
アルゴリズムの応答時間は、ビットマップ走査動作にのみ依存する。ルートビットマップ３は、一度の動作で、各レベルにおける空きセグメントの利用可能性を判定することを可能にする。
【００５３】
メモリ割当ておよび解放動作は両方とも、空きまたは割当て済みセグメントの数にも、要求されたメモリのサイズにも依存しないので、決定論的であり対称的である。両方の動作とも、最大時間を超えず、完全に予測可能である。
【００５４】
図６を参照すると、本発明の実施形態で用いられるデータ構造が記述されている。図６は、ルートビットマップ１、７つのレベルそれぞれにおける第２および第３段階ビットマップ２、３、ならびに各レベルの第３段階ビットマップ３に関連づけられたポインタテーブル１５を示す。
【００５５】
メモリ１６は、空きおよび割当て済みメモリセグメントからなる。メモリセグメントは、第１および第２の二重連結リスト１７、１８を用いてリンクされる。第１の二重連結リスト１７は、メモリのすべてのセグメントを、状態（空き、割当て済み）に関わらずリンクする。第２の二重連結リスト１８は、同じサイズの空きメモリセグメントをリンクする。
【００５６】
第１の二重連結リスト１７において、セグメントの順序は、その物理メモリアドレスに一致する。第２の二重連結リスト１８は、同じサイズの空きセグメントをそれぞれがリンクするいくつかのリストを含む。こうしたリストはそれぞれ、ＬＩＦＯ（後入れ先出し）リストとして編成される。
【００５７】
第１の二重連結リスト１７は、（上述したように）空きセグメントが分割され、または（後述するように）空きセグメントがマージされる度にアップデートされる。第２の二重連結リストは、メモリセグメントが解放され、または割り当てられる度に、かつ、空きセグメントが分割され、または空きセグメントがマージされる際にもアップデートされる。セグメントが解放されると、新たな空きセグメントが、空きセグメントのサイズに対応するＬＩＦＯリストに追加される。空きセグメントは、割り当てられると、そのサイズに対応するＬＩＦＯリストから削除される。空きセグメントは、２つのサブセグメントに分割されると、そのＬＩＦＯリストから削除され、新たな空きサブセグメントが、そのサイズに従って、別のＬＩＦＯリストに追加される。空きセグメントは、マージされると、それぞれのＬＩＦＯリストから削除され、マージされた新たな空きセグメントが、そのサイズに従って別のＬＩＦＯリストに追加される。いずれのケースでも、ビットマップは、それに従ってアップデートされる。
【００５８】
図６で、第２の二重連結リスト１８は、レベル０、１、６にそれぞれ関連づけられた３つのリスト１９、２０、２１を含む。
【００５９】
上述したように、メモリセグメントは、解放されると、より大きい１つの空きセグメントを形成するために、隣接空きセグメントとマージされる。基底にあるアルゴリズムを、図７に示す。セグメントが解放されると、隣接セグメントの状態が判定される。隣接セグメントが両方とも空いている場合、３つすべてのセグメントがマージされる。隣接セグメントの１つだけが空いている場合、２つの空きセグメントがマージされる。隣接セグメントがどちらも空いていない場合、マージ動作は実施されない。その結果、セグメントの１つを解放する際にマージが行われるので、隣には空きセグメントがない。
【００６０】
隣接セグメントの状態は、第１の二重連結リストを使って判定される。第１の二重連結リスト１７の構造を、図８に示す。各メモリセグメントは、セグメントの状態（空き、割当て済み）およびセグメントのサイズ、ならびに前のセグメントをポイントするポインタについての情報を含むヘッダ２５を有する。具体的には、セグメントの状態は、ポインタの最も低位の有効ビットによって示される。後続セグメントへのポインタは、セグメントサイズからアドレスを判定することができるので、必要ない。
【００６１】
図９は、第１および第２の二重連結リスト１７、１８を含むデータ構造を示す。具体的には、図９は、第１の二重連結リストがすべてのセグメントをリンクし、第２の二重連結リスト１８が、同じサイズの空きセグメントのみをリンクすることを示す。したがって、空きセグメントのヘッダ２５は、同じサイズの次および前の空きセグメントへの追加ポインタを含む。所与の任意のサイズのただ１つの空きセグメントがある場合、こうしたポインタは、ループを形成し、そのただ１つのセグメントのヘッダ２５をポイントする。
【００６２】
ヘッダ２５は、割当て済みセグメント用には８バイト、空きセグメント用には１２バイトからなる。後者のケースにおいて、追加されているバイトは、同じサイズの他の空きセグメントについての情報を含み、そうすることによって、上述したように、第２の二重連結リスト１８を形成する。
【００６３】
最良適合するメモリセグメントの割当てについての上記説明では、ヘッダ２５を形成するのにさらに必要とされるメモリは、簡単にするために無視されていることに留意されたい。
【００６４】
テーブル２は、各レベルごとのグラニュルサイズが、テーブル１に従って選択された場合の、相異なるメモリプールサイズに対する、ビットマップおよび本メモリ割当てアルゴリズムにおいて用いられるポインタテーブルによって消費されるメモリを示す。
【表２】
2007523412.tif 000004
【００６５】
さらに、２５６バイトからなる２つのテーブルが、それぞれ最下位から、および最上位ビットから始まる最初のセットビットを判定するための計算を実施するのに必要とされる。したがって、追加の５１２バイトが必要とされる。さらに、二重連結リスト１７、１８は、割当て済みセグメントごとに８バイトを、または空きセグメントごとに１２バイトを消費する。
【００６６】
テーブル３は、割当ておよび解放動作を実施する際の、本アルゴリズムの異なるプロセッサにおける応答時間（ナノ秒）を示す。
【表３】
2007523412.tif 000005
【００６７】
テーブル３に示すように、セグメントを割り当てる３つの命令パスがある。
・ＳＣＢＭ（第３段階ビットマップの現在の３２ビットワードを走査する）：この場合、第３段階ビットマップ３の現在の３２ビットワード中に、空きセグメントが見つかる（図５と比較）。
・ＳＵＢＭ（ビットマップの上位レベルを走査する）：この場合、第３段階ビットマップ３の現在の３２ビットワード中に空きセグメントはなく、現在の第２段階ビットマップ２が、空きセグメントを見つけるために走査される（図５も参照）。
・ＳＲＢＭ（ルートビットマップを走査する）：この場合、第３段階ビットマップ３の現在の３２ビットワード中にも、現在の第２段階ビットマップ２の中にも空きセグメントはない。空きセグメントは、ルートビットマップ１を走査することによって見つかる。
【００６８】
セグメントを割当て解除する（解放する）３つの命令パスもある。
・隣接セグメント両方が割り当てられる間に、セグメントを解放する。マージ動作は実施されない。したがって、最も速いパスである。
・隣接セグメントが１つ空いている間に、セグメントを解放する。マージ動作が１回実施される。
・隣接両方のセグメントが空いている間に、セグメントを解放する。マージ動作が２回実施される。したがって、最も遅いパスである。
【００６９】
テーブル３の各応答時間は、１０００回の動作の平均値である。最悪のケースは、それぞれの最良の（すなわち、セグメントを割り当てる際に完全一致し、セグメントを解放する際にマージを行わない）ケースより約２〜３倍遅い。しかし、全体的なメモリが１Ｇバイトを超えない場合、空きまたは割当て済みセグメントの数にも要求されたメモリのサイズにも関わらず、応答時間は、３３ＭＨｚのｉ４８６プロセッサでは１７，０００ｎｓを、３００ＭＨｚのＰｅｎｔｉｕｍプロセッサでは１，１４４ｎｓを、３００ＭＨｚのＰｏｗｅｒＰＣプロセッサでは６００ｎｓを超えることはない。したがって、本アルゴリズムは、決定論的であり予測可能である。
【００７０】
本発明は、上述した例示的な実施形態に限定されないことに留意されたい。様々な修正形態を、特許請求の範囲から確定される保護範囲内で行い得ることが当業者には明らかであろう。
【図面の簡単な説明】
【００７１】
【図１】データメモリの、一次レベルのセグメントサイズの範囲を示す図である。
【図２】メモリセグメントの状態を示す３段階ビットマップを示す図である。
【図３】決定論的「最良適合」メモリセグメント割当てアルゴリズムを示す図である。
【図４】ビットマップ索引を判定するためのアルゴリズムを示す図である。
【図５】空きセグメントを示すビットマップのセットビットを見つけるためのアルゴリズムを示す図である。
【図６】「最良適合」メモリ割当てアルゴリズムにおいて使われるデータ構造を示す図である。
【図７】決定論的「最良適合」メモリセグメント解放アルゴリズムを示す図である。
【図８】メモリセグメントをリンクする第１の二重連結リストを示す図である。
【図９】同じサイズのメモリセグメントおよび空きメモリセグメントをそれぞれリンクする第１および第２の二重連結リストを示す図である。
【図１】
2007523412.tif 000006
【図２】
2007523412.tif 000007
【図３】
2007523412.tif 000008
【図４】
2007523412.tif 000009
【図５】
2007523412.tif 000010
【図６】
2007523412.tif 000011
【図７】
2007523412.tif 000012
【図８】
2007523412.tif 000013
【図９】
2007523412.tif 000014
【国際調査報告】
2007523412.tif 000015
2007523412.tif 000016
2007523412.tif 000017