(57)【要約】【課題】獲得メモリ領域が特定の位置にアラインメントされることのないメモリ領域獲得機能を容易な方法で提供する。【解決手段】メモリ管理システムは、獲得メモリ領域の先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段と、メモリ獲得要求に応じて前記第１のメモリ領域獲得手段を用いて獲得した獲得メモリ領域において前記先頭アドレスから始まる先頭部分にサイズが変動する第１の領域を割り当て、前記第１の領域を除いた前記獲得メモリ領域の残りの第２の領域を獲得メモリ領域として提供する第２のメモリ領域獲得手段とを含む。【選択図】図３
2010134558.tif 000002
【特許請求の範囲】
【請求項１】
先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段と、
メモリ獲得要求に応じて前記第１のメモリ領域獲得手段を用いて獲得したメモリ領域において前記先頭アドレスから始まる先頭部分から第１の領域を割り当て、前記第１の領域を除いた前記メモリ領域の残りの第２の領域を他のメモリ領域とする第２のメモリ領域獲得手段と、
を含むことを特徴とするメモリ管理システム。
【請求項２】
前記第１のメモリ領域獲得手段はシステムコールであり、前記第２のメモリ領域獲得手段はライブラリ関数であり、プログラムから前記ライブラリ関数を介して前記システムコールを呼び出して実行するように制御する制御手段を更に含むことを特徴とする請求項１記載のメモリ管理システム。
【請求項３】
前記制御手段は、前記プログラムをリンクする際に前記ライブラリ関数をリンクさせ、メモリ領域獲得用の他のライブラリ関数に対して優先的に前記ライブラリ関数を実行するように設定することを特徴とする請求項２記載のメモリ管理システム。
【請求項４】
前記第１の領域のサイズをメモリ獲得要求毎に変動させることを特徴とする請求項１乃至３いずれか一項記載のメモリ管理システム。
【請求項５】
処理ユニットにより実行することによりメモリ装置のメモリ空間を管理するメモリ管理プログラムであって、
メモリ獲得要求に応じて、先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段を用いて獲得したメモリ領域において、前記先頭アドレスから始まる先頭部分から第１の領域を割り当て、前記第１の領域を除いた前記メモリ領域の残りの第２の領域を他のメモリ領域とする第２のメモリ領域獲得手段を含むことを特徴とするメモリ管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本願開示は、一般にメモリ管理システム及びメモリ管理プログラムに関し、詳しくはキャッシュメモリシステムにおけるメモリ管理システム及びメモリ管理プログラムに関する。
【背景技術】
【０００２】
組込み向けＬｉｎｕｘ等のＯＳ（Operating System）には、メモリ管理システムの処理を簡易化するために、特定のサイズ以上のメモリ領域の獲得要求に対しては、ある程度大きなサイズの単位毎にメモリ領域を割りつける構成のものがある。このような構成では、例えば、４０９６バイト（４Ｋバイト）以上のメモリ領域を動的に獲得すると、メモリ空間内での各セグメント（４Ｋバイト）の配置に従って、メモリ領域がセグメント単位で獲得される。その結果、獲得したメモリ領域の先頭アドレスが４０９６バイトにアラインメントされる。つまり、獲得したメモリ領域の先頭アドレスは、１６進表示した場合にその下位３桁が常にゼロとなる。このような構成となっている理由の１つは、組込み向けＯＳではメモリ制約が厳しいために、汎用システムとは異なり、プログラムコードの効率を追求してメモリ管理等の処理を単純化しているからである。
【０００３】
一方、キャシュメモリは複数のキャッシュラインを含むが、キャッシュメモリの容量は主記憶メモリの容量よりも小さいので、主記憶メモリのメモリ領域を繰り返して同一のキャッシュラインに割当てることになる。即ち、キャッシュライン単位で分割した外部メモリのメモリ領域を先頭のキャッシュラインから順番にキャッシュラインに割当てていき、キャッシュラインが一巡すると、先頭のキャッシュラインに戻って外部メモリのメモリ領域を割り当てている。
【０００４】
プログラムの実行において、異なるアドレスに配置された異なるデータや関数が同一のキャッシュラインに割当てられている場合、これらのデータや関数が交互に読み出されるたびに、主記憶メモリからキャシュにデータや関数をコピーする必要が生じる。これをキャシュ競合という。キャシュ競合が頻繁に起こるとプログラムの実行速度が遅くなるという問題がある。
【０００５】
前述のように、各獲得要求に対して獲得されたメモリ領域の先頭アドレスが４０９６バイトにアラインメントされると、メモリ空間のキャッシュラインへの分割の仕方によっては、獲得メモリ領域の先頭アドレスが常に同一のキャッシュラインになってしまう場合がある。その場合、頻繁にデータアクセスするプログラムでは、キャッシュ競合多発による性能劣化が発生してしまう。
【０００６】
獲得メモリ領域の先頭アドレスが特定の位置にアラインメントされてしまうという問題は、例えば、メモリ獲得に関するシステムプログラムを修正することにより解決できる。しかしながら、ＯＳのシステムプログラムを変更することは容易ではなく、またユーザの立場では不可能な場合も多い。また別の解決方法として、ユーザプログラムを修正するという対応もあり得る。即ち、メモリ領域獲得用にシステム側から用意されているルーチンを用いて、ユーザプログラム側でメモリ獲得時の獲得領域の管理を行なうことが考えられる。しかしこの方法では、メモリ管理の処理のオーバーヘットが大きくて効率的でなく、またメモリプロテクト機能がない場合にはメモリ破壊による影響が大きいという問題がある。
【特許文献１】特開２００１−１５４８６０号公報
【特許文献２】特開平５−２６５８６４号公報
【特許文献３】特開平９−１２０３７２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
以上を鑑みると、獲得メモリ領域が特定の位置にアラインメントされることのないメモリ領域獲得機能を容易な方法で提供することが望まれる。
【課題を解決するための手段】
【０００８】
メモリ管理システムは、先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段と、メモリ獲得要求に応じて前記第１のメモリ領域獲得手段を用いて獲得したメモリ領域において前記先頭アドレスから始まる先頭部分から第１の領域を割り当て、前記第１の領域を除いた前記メモリ領域の残りの第２の領域を他のメモリ領域とする第２のメモリ領域獲得手段と、を含むことを特徴とする。
【０００９】
処理ユニットにより実行することによりメモリ装置のメモリ空間を管理するメモリ管理プログラムは、メモリ獲得要求に応じて、先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段を用いて獲得したメモリ領域において、前記先頭アドレスから始まる先頭部分から第１の領域を割り当て、前記第１の領域を除いた前記メモリ領域の残りの第２の領域を他のメモリ領域とする第２のメモリ領域獲得手段を含むことを特徴とする。
【発明の効果】
【００１０】
本願開示の少なくとも１つの実施例によれば、獲得メモリ領域において先頭アドレスから始まる先頭部分にサイズが変動する第１の領域を割り当てる。そして、獲得メモリ領域の開始アドレスを示す値として、獲得したメモリ領域から第１の領域を除いた第２の領域の開始アドレスの値を返す。これにより、獲得メモリ領域の先頭アドレスは、セグメントの境界から第１の領域のサイズの分だけずれた位置にあることになる。従って、セグメントの境界が同一のキャッシュラインに対応しているような場合であっても、獲得メモリ領域の先頭はこのキャッシュラインには配置されないことになり、データアクセス時のキャッシュ競合を避けることが可能となる。
【発明を実施するための最良の形態】
【００１１】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。
【００１２】
メモリ管理システムは言語に依存するものではなく、所望のプログラミング言語を用いて実現することができる。以下に説明する例では、Ｃ言語を使用してメモリ管理システムを構築する場合について説明するが、本発明はＣ言語に限らず他の言語システムを用いて実現してもよい。またメモリ獲得ルーチン及びメモリ解放ルーチンとして、標準Ｃライブラリであるｍａｌｌｏｃ及びｆｒｅｅを例として用いて説明するが、言語によらず他のメモリ獲得ルーチン及びメモリ解放ルーチンを用いてもよい。またメモリ獲得機能には、新規にメモリ領域を獲得する機能だけでなく、例えば標準Ｃライブラリにおける関数ｒｅａｌｌｏｃ等のように一度獲得したメモリ領域を拡張する機能があるが、そのような機能にも同様に本発明を適用できる。以下の説明においては、オペレーティングシステムとしてＬｉｎｕｘを用いているが、特定のオペレーティングシステムに限られるものではなく、他の任意のオペレーティングシステムを用いてよい。
【００１３】
本実施例のメモリ管理システムは、第１のメモリ領域獲得手段と第２のメモリ領域獲得手段とを含む。第１のメモリ領域獲得手段は、獲得メモリ領域の先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する。例えば、組込み向けＯＳ等のように単純化したメモリ管理システムを採用している場合には、ｍａｌｌｏｃを実行すると、ｍａｌｌｏｃはシステムコールｍｍａｐを呼び出してメモリ領域を獲得する。このｍｍａｐは、通常、セグメント単位にメモリ領域を獲得する。例えば、獲得メモリ領域の先頭アドレスはすべて４Ｋバイトのセグメントの境界に位置され、１６進表示した場合にその下位３桁が常にゼロとなる。即ちこの例の場合には、このｍｍａｐが、先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する上記第１のメモリ領域獲得手段に対応する。
【００１４】
第２のメモリ領域獲得手段は、メモリ獲得要求に応じて第１のメモリ領域獲得手段を用いて獲得した獲得メモリ領域において先頭アドレスから始まる先頭部分にサイズが変動する第１の領域を割り当てる。更に第２のメモリ領域獲得手段は、第１の領域を除いた獲得メモリ領域の残りの第２の領域を獲得メモリ領域として提供する。例えば、標準Ｃライブラリ関数のｍａｌｌｏｃを置き換える形で実行できる新規のメモリ獲得関数ｍａｌｌｏｃを用意する。この新規ｍａｌｌｏｃは、システムコールｍｍａｐを呼び出してメモリ領域を獲得し、この獲得メモリ領域において先頭アドレスから始まる先頭部分にサイズが変動する第１の領域を割り当てる。そして、新規ｍａｌｌｏｃは、獲得メモリ領域の開始アドレスを示す値（開始アドレスへのポインタ変数）として、システムコールｍｍａｐが獲得したメモリ領域から第１の領域を除いた第２の領域の開始アドレスの値を返す。これにより、新規ｍａｌｌｏｃが返す獲得メモリ領域の先頭アドレスは、４Ｋバイトのセグメントの境界から第１の領域のサイズの分だけずれた位置にあることになる。従って、４Ｋバイトのセグメントの境界が同一のキャッシュラインに対応しているような場合であっても、獲得メモリ領域の先頭はこのキャッシュラインには配置されないことになり、データアクセス時のキャッシュ競合を避けることが可能となる。
【００１５】
以下に、組込み向けＯＳ等のように単純化したメモリ管理システムを採用している場合の標準ライブラリ関数ｍａｌｌｏｃの動作について説明する。標準ライブラリ関数ｍａｌｌｏｃでは、上記の新規ｍａｌｌｏｃとは異なり、獲得メモリ領域の先頭位置をずらす処理は行なわれない。
【００１６】
図１は、標準ライブラリ関数ｍａｌｌｏｃの動作について説明するための図である。ユーザプログラム１０の実行時にメモリ獲得関数ｍａｌｌｏｃが実行されると、標準Ｃライブラリ（ｌｉｂｃ）１１中に用意されているｍａｌｌｏｃのコードが実行される。このｍａｌｌｏｃのコード中にはシステムコールｍｍａｐを呼び出すコードが含まれており、これに応じてｍｍａｐシステムコール１２が実行される。メモリ獲得関数ｍａｌｌｏｃの呼び出し時には、獲得したいメモリ領域のサイズｌｅｎが指定されており、このサイズに応じてｍｍａｐシステムコール１２がメモリ領域１３を獲得する。このｍｍａｐシステムコール１２が獲得した獲得メモリ領域１３は、領域サイズｌｅｎ（獲得したいメモリ領域のサイズ）に依存して、セグメント単位にアラインメントされている。
【００１７】
図２は、ｍｍａｐシステムコール１２の獲得する獲得メモリ領域１３と標準ライブラリ関数ｍａｌｌｏｃの返す復帰値とを説明する図である。標準ライブラリ関数ｍａｌｌｏｃ呼び出し時に指定した獲得したいメモリ領域のサイズがｌｅｎであるとき、ｍｍａｐシステムコール１２はｌｅｎ＋４のサイズの獲得メモリ領域１３を割り当てる。獲得メモリ領域１３の先頭４バイトは、上記のｌｅｎの値（獲得メモリ長）を格納する管理領域１４として確保される。獲得メモリ領域１３のうち管理領域１４を除いた残りの領域は、そのメモリ長がｌｅｎであり、ｍａｌｌｏｃの取得領域１５となる。標準ライブラリ関数ｍａｌｌｏｃの返す復帰値は、取得領域１５の先頭位置のアドレス値である。
【００１８】
実際には、ｍｍａｐシステムコール１２が獲得する獲得メモリ領域１３のサイズがｌｅｎ＋４に等しくなることはまれであり、所定のセグメント長の倍数となる。具体的には、４０９２バイト未満のサイズｌｅｎを標準ライブラリ関数ｍａｌｌｏｃにより獲得しようとすると、ｍｍａｐシステムコール１２は、少なくともｌｅｎ＋４のメモリ領域を確保するような、６４バイト単位で計ったメモリ領域を獲得する。また４０９２バイト以上のサイズｌｅｎを標準ライブラリ関数ｍａｌｌｏｃにより獲得しようとすると、ｍｍａｐシステムコール１２は、ｌｅｎ＋４のメモリ領域を確保するような、４０９６バイト単位で計ったメモリ領域を獲得する。この場合、獲得メモリ領域１３の先頭アドレスは、４Ｋバイトのセグメントの境界にアラインメントされることになる。従って、ｍａｌｌｏｃの取得領域１５の先頭アドレスは、１６進表示したときの下位３桁が常に「００４」になる。
【００１９】
キャッシュライン数が１２８であり、キャッシュライン長が６４バイトであるとすると、同一キャッシュラインは、メモリ空間上で８１９２バイト（８Ｋバイト）毎に現れることになる。従って、標準ライブラリ関数ｍａｌｌｏｃにより４０９２バイト以上のサイズのデータ領域を複数獲得し、これら複数のデータに並列的にアクセスする場合、同一キャシュラインへのアクセスとなりキャシュ競合が発生してしまう。
【００２０】
図３は、新規ｍａｌｌｏｃによるメモリ領域獲得について説明するための図である。新規ｍａｌｌｏｃは、標準Ｃライブラリ関数のｍａｌｌｏｃを置き換える形で実行される。即ち、ユーザプログラム１０の実行時にメモリ獲得関数ｍａｌｌｏｃが実行されると、標準Ｃライブラリ１１のｍａｌｌｏｃのコードが実行されるのではなく、新規ｍａｌｌｏｃのコードが実行される。この新規ｍａｌｌｏｃのコード中にはシステムコールｍｍａｐを呼び出すコードが含まれており、これに応じてｍｍａｐシステムコール１２が実行される。メモリ獲得関数ｍａｌｌｏｃの呼び出し時には、獲得したいメモリ領域のサイズｌｅｎが指定されており、このサイズに応じてｍｍａｐシステムコール１２がメモリ領域２０を獲得する。このｍｍａｐシステムコール１２が獲得した獲得メモリ領域２０は、領域サイズｌｅｎに依存して、セグメント単位にアラインメントされている。
【００２１】
標準ライブラリ関数ｍａｌｌｏｃ呼び出し時に指定した獲得したいメモリ領域のサイズがｌｅｎであるとき、ｍｍａｐシステムコール１２はＡｌｅｎ＋８＋ｌｅｎのサイズの獲得メモリ領域２０を割り当てる。ここでＡｌｅｎは、後述するアルゴリズムにより計算されるメモリ長であり、メモリ獲得要求毎に変動する値をとる。獲得メモリ領域２０の先頭Ａｌｅｎバイトは、使用されることのない可変長の遊び領域２１として確保される。また遊び領域２１に続く８バイトは、Ａｌｅｎの値（遊び領域値長）及びｌｅｎの値（獲得メモリ長）を格納する管理領域２２として確保される。前述の第１の領域は、遊び領域２１と管理領域２２とを合わせたものと考えてよい。
【００２２】
獲得メモリ領域２０のうち遊び領域２１及び管理領域１４を除いた残りの領域は、そのメモリ長がｌｅｎであり、新規ｍａｌｌｏｃ取得領域２３となる。新規ｍａｌｌｏｃの返す復帰値は、取得領域２３の先頭位置のアドレス値である。
【００２３】
前述のように４０９６バイト以上のサイズをｍｍａｐシステムコール１２で獲得すると、獲得メモリ領域２０の先頭アドレスは、４Ｋバイトのセグメントの境界にアラインメントされる。しかしながら新規ｍａｌｌｏｃを用いた場合には、新規ｍａｌｌｏｃ取得領域２３の先頭アドレスは、４Ｋバイトのセグメントの境界位置からＡｌｅｎ＋８だけずれた位置にある。Ａｌｅｎの値はメモリ空間獲得要求毎に変動するので、新規ｍａｌｌｏｃ取得領域２３により獲得したデータ領域の先頭アドレスは、それぞれのデータ毎に異なった量だけセグメントの境界位置からずれることになる。
【００２４】
キャッシュライン数が１２８であり、キャッシュライン長が６４バイトであるとすると、同一キャッシュラインは、メモリ空間上で８１９２バイト（８Ｋバイト）毎に現れる。しかしながら新規ｍａｌｌｏｃによりデータ領域を複数獲得し、これら複数のデータに並列的にアクセスする場合であっても、データ毎にその先頭アドレスと４Ｋバイトのセグメントの境界位置との距離が異なる。従って、同一キャシュラインへのアクセスが発生する頻度は大幅に減少し、頻繁なキャシュ競合の発生を避けることができる。
【００２５】
図４は、標準Ｃライブラリ関数のｍａｌｌｏｃを置き換える形で新規ｍａｌｌｏｃを実行するシステム構成を示す図である。図４に示すシステム構成では、リンク処理により、標準Ｃライブラリ関数のｍａｌｌｏｃではなく新規ｍａｌｌｏｃをリンクすることにより、標準Ｃライブラリ関数のｍａｌｌｏｃに対して優先的に新規ｍａｌｌｏｃを実行する。ユーザプログラムのオブジェクトコード３１としてｏ１．ｏ、ｏ２．ｏ、・・・、ｏｎ．ｏが与えられると、これらのオブジェクトコード３１をリンカによりリンク処理することにより、実行可能形式ファイル（ｍａｉｎ）３３が生成される。このリンク処理においては、オブジェクトコード３１と、オブジェクトコード３１内で参照しているライブラリ関数とを結合し、また変数の参照を絶対アドレスに変更する等の処理が行なわれる。
【００２６】
上記のリンク処理において、図４の構成では、標準Ｃライブラリ（ｌｉｂｃ．ａ）１１中のｍａｌｌｏｃではなく、ラッパ関数ライブラリ（ｌｉｂｎｅｗ．ａ）３２中のｍａｌｌｏｃがリンクされる。これにより、オブジェクトコード３１中でｍａｌｌｏｃ関数を呼び出すコードが実行されると、標準Ｃライブラリ１１のｍａｌｌｏｃではなくラッパ関数ライブラリ３２のｍａｌｌｏｃ（新規ｍａｌｌｏｃ）が実行されることになる。なおリンク処理を実行するリンカのコマンドを実行する際に、標準Ｃライブラリ１１のリンクを指定するオプション“−ｌｃ”の前に、ラッパ関数ライブラリ３２のリンクを指定するオプション“−ｌｎｅｗ”を記載する。これにより、標準Ｃライブラリ１１のｍａｌｌｏｃではなくラッパ関数ライブラリ３２のｍａｌｌｏｃをリンク対象とすることができる。
【００２７】
図５は、メモリ管理システムの構成を概略的に示す図である。ユーザプログラム４０中では、メモリ領域を獲得するメモリ獲得関数ｍａｌｌｏｃや獲得メモリ領域を開放するメモリ解放関数ｆｒｅｅが呼び出されている。これらの関数の呼び出しに応じて、ｍｍａｐシステムコールを用いてメモリ領域を獲得するラッパ関数４１のｍａｌｌｏｃや、ｍｕｎｍａｐシステムコールを用いてメモリ領域を解放するラッパ関数４１のｆｒｅｅが実行される。ｍｍａｐシステムコールやｍｕｎｍａｐシステムコールの呼び出しにより、オペレーティングシステム４２に備えられている一群のシステムコール４３のうち、ｍｍａｐシステムコールやｍｕｎｍａｐシステムコールが実行される。これらのシステムコールの実行により、オペレーティングシステム４２のカーネル中のメモリ管理機能４４が、メモリ領域を獲得したり、メモリ領域を開放したりする。
【００２８】
図６は、新規ｍａｌｌｏｃの処理の流れを示すフローチャートである。図７は、新規ｍａｌｌｏｃのソースコードの一例を示す図である。以下に、図６と図７とを参照して、新規ｍａｌｌｏｃで実行する処理について説明する。
【００２９】
まず、獲得したいメモリ領域のサイズを変数ｌｅｎとして指定して新規ｍａｌｌｏｃを呼び出すと、ステップＳ１で、ｌｅｎ＋８が４０９２バイト以上であるか否かを判定する。これは図７のｍａｌｌｏｃのソースコードにおいて、行５１に示すｉｆ文の実行に相当する。ここで定数ＡＬＩＧＮはソースコードの先頭に示すように“４０９２”に定義されている。
【００３０】
ステップＳ１の判定の結果、ｌｅｎ＋８が４０９２バイト以上でない場合、ステップＳ２で、遊び領域の長さＡｌｅｎとして０を設定する。またステップＳ１の判定の結果、ｌｅｎ＋８が４０９２バイト以上である場合、ステップＳ３で、遊び領域の長さＡｌｅｎを所定の規則に基づいて計算する。
【００３１】
遊び領域の長さＡｌｅｎの計算方法としては、例えば、以下の式を用いてよい。
【００３２】
Ａｌｅｎ＝（Ｎ  ｍｏｄ  Ｓ）×Ｌｉｎｅ＿ｓｉｚｅ                    （１）
ここで、Ｎは関数ｍａｌｌｏｃを呼び出した順番を示すｍａｌｌｏｃ呼び出し連番であり、Ｓはキャッシュメモリに設けられたキャッシュラインの総数（例えば１２８）であり、Ｌｉｎｅ＿ｓｉｚｅは各キャッシュラインのサイズ（例えば６４バイト）である。Ｎは、最初の関数ｍａｌｌｏｃの呼び出しでは１となり、２番目の関数ｍａｌｌｏｃの呼び出しでは２となり、以下同様にして、ｎ番目の関数ｍａｌｌｏｃの呼び出しではｎとなる。なおｍｏｄはモジュロ演算であり、ＮをＳで除算した剰余を計算する。上記の式（１）の計算により、各メモリ獲得要求毎に変動するようなサイズをＡｌｅｎに設定することができる。なお上式（１）の計算は、図７のｍａｌｌｏｃのソースコードにおいて、行５２に示す“６４＊ｌ”の計算に相当する。ここでｌは“（Ｎ  ｍｏｄ  Ｓ）”に相当する項であり、行５３において、“ｃｏｕｎｔｅｒ％１２８”として計算されている。
【００３３】
図６においてステップＳ２又はＳ３の後は、ステップＳ４において、ｍｍａｐシステムコール呼び出し時に指定する獲得領域サイズを設定する。前述のように、このサイズはＡｌｅｎ＋８＋ｌｅｎである。これは図７のｍａｌｌｏｃのソースコードにおいて、行５２に示すａｌｌｏｃ＿ｌｅｎの計算に相当する。なおｌｅｎ＋８が４０９２バイト以上でなく、ステップＳ２で遊び領域の長さＡｌｅｎとして０を設定した場合は、行５３に示すａｌｌｏｃ＿ｌｅｎの計算が実行される。
【００３４】
ステップＳ５で、ｍｍａｐシステムコールを実行することにより獲得メモリ領域２０（図３参照）を獲得し、その先頭アドレスαを取得する。これは図７のｍａｌｌｏｃのソースコードにおいて、行５４に示すｍｍａｐの呼び出しに相当する。ｍｍａｐの関数値として返される整数値が先頭アドレスαであり、ａｄｄｒに代入されている。
【００３５】
ステップＳ６で、ｍａｌｌｏｃの復帰アドレスβ（図３参照）を計算する。これは以下のようにして計算される。
【００３６】
β＝α＋８＋Ａｌｅｎ                                                （２）
即ち、獲得メモリ領域２０のうち遊び領域２１（長さＡｌｅｎ）及び管理領域１４（長さ８）を除いた残りの領域が、新規ｍａｌｌｏｃ取得領域２３となる。新規ｍａｌｌｏｃの返す復帰値βは、取得領域２３の先頭位置のアドレス値である。上式（２）の計算は、図７のｍａｌｌｏｃのソースコードにおいて、行５５に示す“ａｄｄｒ＋８＋６４＊ｌ”の復帰に相当する。以上で新規ｍａｌｌｏｃの処理を終了する。
【００３７】
図８は、新規ｍａｌｌｏｃによるメモリ領域獲得の例を示す図である。前述の例と同様に、キャッシュライン数が１２８であり、キャッシュライン長が６４バイトであるとする。（ａ）は、１３０回目の新規ｍａｌｌｏｃ呼び出しにおいて、獲得サイズｌｅｎとして４０００を指定した場合を示す図である。この場合、ｌｅｎが４０９２バイト未満であるので、遊び領域２１は確保されない。管理領域２２のうちＡｌｅｎの値を示す４バイトは値“０”を示している。この場合、新規ｍａｌｌｏｃ取得領域２３の先頭アドレスβは、第１番目のキャッシュラインに割り当てられる。
【００３８】
（ｂ）は、１３１回目の新規ｍａｌｌｏｃ呼び出しにおいて、獲得サイズｌｅｎとして４０９２を指定した場合を示す図である。この場合、ｌｅｎが４０９２バイトであるので、遊び領域２１が確保される。遊び領域２１の長さＡｌｅｎは、（１３１ｍｏｄ１２８）×６４で１９２バイトとなる。管理領域２２のうちＡｌｅｎの値を示す４バイトは値“３”を示している。この値“３”は、実際の遊び領域２１のサイズのバイト値を６４で割った値であり、Ａｌｅｎの値を６４バイト単位（キャッシュラインの長さ）で表記したものと考えればよい。この場合、新規ｍａｌｌｏｃ取得領域２３の先頭アドレスβは、第４番目のキャッシュラインに割り当てられる。
【００３９】
（ｃ）は、１３２回目の新規ｍａｌｌｏｃ呼び出しにおいて、獲得サイズｌｅｎとして４０９２を指定した場合を示す図である。この場合、ｌｅｎが４０９２バイトであるので、遊び領域２１が確保される。遊び領域２１の長さＡｌｅｎは、（１３２ｍｏｄ１２８）×６４で２５６バイトとなる。管理領域２２のうちＡｌｅｎの値を示す４バイトは値“４”を示している。この場合、新規ｍａｌｌｏｃ取得領域２３の先頭アドレスβは、第５番目のキャッシュラインに割り当てられる。
【００４０】
図９は、標準Ｃライブラリの関数ｒｅａｌｌｏｃを置き換えるラッパ関数として提供する新規ｒｅａｌｌｏｃのソースコードの一例を示す図である。ここで関数ｒｅａｌｌｏｃは、一度獲得したメモリ領域を拡張する機能を実行する。この新規ｒｅａｌｌｏｃでは、行６１においてｍａｌｌｏｃを呼び出すことにより、ラッパ関数４１として提供される新規ｍａｌｌｏｃが実行される。これにより、上記説明したようなセグメント境界へのアラインメントを避けたメモリ領域の獲得が可能となる。
【００４１】
図１０は、新規ｆｒｅｅの処理の流れを示すフローチャートである。図１１は、新規ｆｒｅｅのソースコードの一例を示す図である。以下に、図１０と図１１とを参照して、新規ｆｒｅｅで実行する処理について説明する。なおこの新規ｆｒｅｅは、新規ｍａｌｌｏｃと同様に、標準Ｃライブラリの対応する関数に対して優先的に実行されるものである。
【００４２】
まず、解放したいメモリ領域の先頭アドレスを変数ａｄｄｒとして指定して新規ｆｒｅｅを呼び出すと、ステップＳ１で、システムコールｍｕｎｍａｐ呼び出し時に指定する解放アドレスを算出する。この解放アドレスは、ａｄｄｒ−８−Ａｌｅｎにより計算される。ここで８は管理領域２２のサイズ、Ａｌｅｎは遊び領域２１のサイズである。この解放アドレスの計算は、図１１のｆｒｅｅのソースコードにおいて、行７１に示す計算式及び行７２に示す計算式の実行に相当する。なおこれらの計算式に現れるｌは、管理領域２２のうちＡｌｅｎの値を示す４バイトに格納されている値である。
【００４３】
ステップＳ２で、ｍｕｎｍａｐシステムコールを実行することにより解放アドレスから始まる獲得メモリ領域を解放する。これは図１１のｆｒｅｅのソースコードにおいて、行７３に示すｍｕｎｍａｐの呼び出しに相当する。このｕｎｍａｐシステムコールの呼び出しでは、解放アドレスｍｅｍ＿ａｄｄｒ（解放すべき領域の先頭アドレス）と、解放すべきメモリ領域のサイズｓｉｚｅとを指定している。以上で新規ｆｒｅｅの処理を終了する。
【００４４】
図１２は、メモリ管理プログラムを実行する装置の構成を示す図である。図１２に示されるように、メモリ管理プログラムを実行する装置は、例えばパーソナルコンピュータやエンジニアリングワークステーション等のコンピュータにより実現される。図１２の装置は、コンピュータ５１０と、コンピュータ５１０に接続されるディスプレイ装置５２０、通信装置５２３、及び入力装置よりなる。入力装置は、例えばキーボード５２１及びマウス５２２を含む。コンピュータ５１０は、ＣＰＵ５１１、キャッシュ５１１Ａ、ＲＡＭ５１２、ＲＯＭ５１３、ハードディスク等の二次記憶装置５１４、可換媒体記憶装置５１５、及びインターフェース５１６を含む。
【００４５】
キーボード５２１及びマウス５２２は、ユーザとのインターフェースを提供するものであり、コンピュータ５１０を操作するための各種コマンドや要求されたデータに対するユーザ応答等が入力される。ディスプレイ装置５２０は、コンピュータ５１０で処理された結果等を表示すると共に、コンピュータ５１０を操作する際にユーザとの対話を可能にするために様々なデータ表示を行う。通信装置５２３は、遠隔地との通信を行なうためのものであり、例えばモデムやネットワークインターフェース等よりなる。
【００４６】
本発明によるメモリ管理プログラムは、コンピュータ５１０が実行可能なコンピュータプログラムとして提供される。このコンピュータプログラムは、可換媒体記憶装置５１５に装着可能な記憶媒体Ｍに記憶されており、記憶媒体Ｍから可換媒体記憶装置５１５を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。或いは、このコンピュータプログラムは、遠隔地にある記憶媒体（図示せず）に記憶されており、この記憶媒体から通信装置５２３及びインターフェース５１６を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。
【００４７】
キーボード５２１及び／又はマウス５２２を介してユーザからプログラム実行指示があると、ＣＰＵ５１１は、記憶媒体Ｍ、遠隔地記憶媒体、或いは二次記憶装置５１４からプログラムをＲＡＭ５１２にロードする。ＣＰＵ５１１は、ＲＡＭ５１２の空き記憶空間をワークエリアとして使用して、ＲＡＭ５１２にロードされたプログラムを実行し、適宜ユーザと対話しながら処理を進める。なおＣＰＵ５１１がアクセスするメモリ空間は階層構造となっており、キャッシュ５１１Ａが設けられている。なおＲＯＭ５１３は、コンピュータ５１０の基本動作を制御するための制御プログラムが格納されている。
【００４８】
上記コンピュータプログラムを実行することにより、コンピュータ５１０が、上記各実施例で説明されたようにメモリ管理プログラムを実行する。上記コンピュータプログラムには、前述のラッパ関数ライブラリ、標準Ｃライブラリ、システムコールを含むＯＳ等が含まれてよい。ここでラッパ関数ライブラリは、システムコールを含むＯＳやそれに付随する標準Ｃライブラリとは別個の媒体を介して提供されてよい。
【００４９】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【００５０】
なお本発明は、以下の内容を含むものである。
（付記１）
先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段と、
メモリ獲得要求に応じて前記第１のメモリ領域獲得手段を用いて獲得したメモリ領域において前記先頭アドレスから始まる先頭部分から第１の領域を割り当て、前記第１の領域を除いた前記メモリ領域の残りの第２の領域を他のメモリ領域とする第２のメモリ領域獲得手段と、
を含むことを特徴とするメモリ管理システム。
（付記２）
前記第１の領域はサイズが変動することを特徴とする付記１に記載のメモリ管理システム。
（付記３）
前記第１のメモリ領域獲得手段はシステムコールであり、前記第２のメモリ領域獲得手段はライブラリ関数であり、プログラムから前記ライブラリ関数を介して前記システムコールを呼び出して実行するように制御する制御手段を更に含むことを特徴とする付記１記載のメモリ管理システム。
（付記４）
前記制御手段は、前記プログラムをリンクする際に前記ライブラリ関数をリンクさせ、メモリ領域獲得用の他のライブラリ関数に対して優先的に前記ライブラリ関数を実行するように設定することを特徴とする付記３記載のメモリ管理システム。
（付記５）
前記第１の領域のサイズをメモリ獲得要求毎に変動させることを特徴とする付記２乃至４いずれか一項記載のメモリ管理システム。
（付記６）
処理ユニットにより実行することによりメモリ装置のメモリ空間を管理するメモリ管理プログラムであって、
メモリ獲得要求に応じて、先頭アドレスが所定のアドレス位置にアラインメントされるようにメモリ領域を獲得する第１のメモリ領域獲得手段を用いて獲得したメモリ領域において、前記先頭アドレスから始まる先頭部分から第１の領域を割り当て、前記第１の領域を除いた前記メモリ領域の残りの第２の領域を他のメモリ領域とする第２のメモリ領域獲得手段を含むことを特徴とするメモリ管理プログラム。
（付記７）
前記第１のメモリ領域獲得手段はシステムコールであり、前記第２のメモリ領域獲得手段はライブラリ関数であり、プログラムから前記ライブラリ関数を介して前記システムコールを呼び出して実行するように制御する制御手段を更に含むことを特徴とする付記５記載のメモリ管理プログラム。
（付記８）
前記制御手段は、前記プログラムをリンクする際に前記ライブラリ関数をリンクさせ、メモリ領域獲得用の他のライブラリ関数に対して優先的に前記ライブラリ関数を実行するように設定することを特徴とする付記７記載のメモリ管理プログラム。
（付記９）
前記第１の領域のサイズをメモリ獲得要求毎に変動させることを特徴とする付記６乃至８いずれか一項記載のメモリ管理プログラム。
【図面の簡単な説明】
【００５１】
【図１】標準ライブラリ関数ｍａｌｌｏｃの動作について説明するための図である。
【図２】システムコールの獲得する獲得メモリ領域と標準ライブラリ関数の返す復帰値とを説明する図である。
【図３】新規ｍａｌｌｏｃによるメモリ領域獲得について説明するための図である。
【図４】標準Ｃライブラリ関数のｍａｌｌｏｃを置き換える形で新規ｍａｌｌｏｃを実行するシステム構成を示す図である。
【図５】メモリ管理システムの構成を概略的に示す図である。
【図６】新規ｍａｌｌｏｃの処理の流れを示すフローチャートである。
【図７】新規ｍａｌｌｏｃのソースコードの一例を示す図である。
【図８】新規ｍａｌｌｏｃによるメモリ領域獲得の例を示す図である。
【図９】標準Ｃライブラリの関数ｒｅａｌｌｏｃを置き換えるラッパ関数として提供する新規ｒｅａｌｌｏｃのソースコードの一例を示す図である。
【図１０】新規ｆｒｅｅの処理の流れを示すフローチャートである。
【図１１】新規ｆｒｅｅのソースコードの一例を示す図である。
【図１２】メモリ管理プログラムを実行する装置の構成を示す図である。
【符号の説明】
【００５２】
１１  標準Ｃライブラリ
１２  ｍｍａｐシステムコール
１３  獲得メモリ領域
１４  管理領域
１５  取得領域
２０  獲得メモリ領域
２１  遊び領域
２２  管理領域
２３  新規ｍａｌｌｏｃ取得領域
３１  オブジェクトコード
３２  ラッパ関数ライブラリ
３３  実行可能ファイル
５１０  コンピュータ
５１１  ＣＰＵ
５１２  ＲＡＭ
５１３  ＲＯＭ
５１４  二次記憶装置
５１５  可換媒体記憶装置
５１６  インターフェース
５２０  ディスプレイ装置
５２１  キーボード
５２２  マウス
５２３  通信装置
【図１】
2010134558.tif 000003
【図２】
2010134558.tif 000004
【図３】
2010134558.tif 000005
【図４】
2010134558.tif 000006
【図５】
2010134558.tif 000007
【図６】
2010134558.tif 000008
【図７】
2010134558.tif 000009
【図８】
2010134558.tif 000010
【図９】
2010134558.tif 000011
【図１０】
2010134558.tif 000012
【図１１】
2010134558.tif 000013
【図１２】
2010134558.tif 000014