(57)【要約】【課題】  チェーンメモリ管理（メモリブロック、ＦＡＸ用）と、ヒープメモリ（一般的なメモリプール）を同時管理し、ＦＡＸメモリ搭載機のメモリ増加量を最小限に抑える。【解決手段】  ヒープメモリ要求に対して、ヒープメモリを確保する手段と、チェーンメモリ要求に対して、固定長メモリブロックを必要数ヒープメモリとして確保し、それらをチェーン管理する手段からなることを特徴とする、メモリ管理方法。【選択図】  図１
2007109083.tif 000002
【特許請求の範囲】
【請求項１】
可変長で独立したメモリブロックを管理するヒープメモリ管理手法と、固定長のメモリブロックをチェーンでつなげて管理するチェーンメモリ管理手法を混在させる方法であって、
通常のヒープメモリ要求に対して、ヒープメモリを確保する手段と、
チェーンメモリ要求に対して、固定長メモリブロックを必要数ヒープメモリとして確保し、それらをチェーン管理する手段からなることを特徴とする、メモリ管理方法。
【請求項２】
請求項１記載のメモリ管理方法であって、
先述の通常のヒープメモリ要求に対してヒープメモリを先頭よりのアドレスから確保した場合は、先述のチェーンメモリ要求のためのヒープメモリ確保を行う際には後端側のアドレスから、
先述の通常のヒープメモリ要求に対してヒープメモリを後端よりのアドレスから確保した場合は、先述のチェーンメモリ要求のためのヒープメモリ確保を行う際には先頭側のアドレスから、メモリブロックを確保することを特徴とする、メモリ管理方法。
【請求項３】
請求項１，２記載のメモリ管理方法であって、
先述の各要求に対してヒープメモリの確保を行う際には、空きメモリブロックの中で容量を満たす範囲内で最も小さいブロックを用いる事を特徴とする、メモリ管理方法。
【請求項４】
請求項１，２，３記載のメモリ管理方法であって、
先述の各要求に対してヒープメモリの確保を行う際には、空きメモリブロックの中で容量を満たす範囲内で最も小さいブロックを用いる事を特徴とする、メモリ管理方法。
【請求項５】
請求項１〜４記載のメモリ管理方法であって、
先述の各要求に対してヒープメモリの確保を行う際に、空きメモリブロックにそれより小さいサイズのメモリブロックを確保する際には、
先述空きブロックを要求サイズと、そのあまりサイズの２つのブロックに分割する事を特徴とする、メモリ管理方法。
【請求項６】
請求項１〜５記載のメモリ管理方法であって、
先述の各要求に対してヒープメモリの確保を行う際で、空きメモリブロックにそれより小さいサイズのメモリブロックを確保するとき、ブロックを２つに分割したとき、
ヒープメモリ要求に対してアドレス先頭側ブロックを割り当てる場合には、チェーンメモリ要求に対してはアドレス後端側のブロックを割り当て、
ヒープメモリ要求に対してアドレス後端側ブロックを割り当てる場合には、チェーンメモリ要求に対してはアドレス先頭側のブロックを割り当てることを特徴とする、メモリ管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ方法に関する。
【背景技術】
【０００２】
まず、本発明で取り扱う一般的なメモリ管理の方法を２つ紹介する。
【０００３】
１つは（図２）のように、メモリを要求するタスクなどから、メモリ管理タスクなどへ、連続的で、１つのブロックで、必要サイズのメモリを要求する。メモリ管理タスクはメモリ全体の中から必要なメモリサイズをそのタスクへ割り当て、メモリ開始アドレス、サイズ、必要ならＩＤや相手タスクＩＤなども一緒にテーブルに保存する。このようなメモリ管理方法を本明細書ではヒープメモリ管理と呼ぶ。
【０００４】
２つ目は（図４）のように、ある決まったサイズのブロックでメモリを分割してしまう。たとえば０ｈからＦＦＦＦｈまでの１００００ｈ分のメモリを１０００ｈのブロックで割り当てるなら１６（１０ｈ）ブロック取ることが出来、これらをブロック単位で扱う。そして１ブロックで足りない場合はそれらをつなげて使う（図５）。そのため、ブロックの数だけテーブルを持ち、そのテーブルには１０００ｈブロックのうちどれだけ実際に使われているか、またつながる次のブロック番号を持つことによって管理する。このようなメモリ管理方法を本明細書ではチェーンメモリ管理と呼ぶことにする。
【０００５】
この２つの方法はそれぞれ一長一短である。
【０００６】
ヒープメモリ管理は、確保されるメモリが連続で、それぞれ必要なサイズだけ確保しているので無駄がない。反面、確保した順と逆順に解放しないと、メモリが虫食い状態となる。図３の例では、合計でＢ０００ｈ空きがあるのに、連続的に使えるサイズは合計サイズより少い６０００ｈとなっているように、メモリ効率が悪くなる。
【０００７】
チェーンメモリ管理は、ブロックごとに次のブロック番号を持っているので、メモリが連続的である必要はない。どの順にメモリを解放しようが、また途中のメモリだけを解放しようが、空きメモリは無駄なく使うことが出来る。反面、ブロック単位のため、図５のようにブロックが１０００ｈ単位のとき、チェーンメモリブロック１を２８００ｈ確保しようとしたとき、３ブロック３０００ｈ占領する。結果８００ｈは無駄である。またチェーンメモリブロック３のように、ブロック同士が連続で内場合もあり、メモリ全体でアドレスが連続である保証はない。メモリを使用する側では、ブロックサイズ分処理するごとにごとに次にアクセスするアドレスを調査するなど、プログラムを作成する上で制約が出来る。
【０００８】
このように一長一短なので、従来は用途に応じて使い分けられていた。
【０００９】
従来例としては、例えば特許文献１と特許文献２と特許文献３と特許文献４をあげることが出来る。
【特許文献１】特開平６−１１０７７３号公報
【特許文献２】特開２００３−１５０４０４号公報
【特許文献３】特開平７−２１０８１号公報
【特許文献４】特開平６−４３９５号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしそれぞれ違うメモリ管理方法をしていたアプリを、同じデバイスで動作させようとした場合、これらの管理方法は全く違うのでヒープメモリ管理用領域と、チェーンメモリ管理領域をそれぞれ別に持つ必要があった。そしてそれらは相互には使うことが出来ないので、極端な言い方をすればメモリを２倍持つ必要があることになる。
【００１１】
先願で、いいとこどりしたほうしきもあるが・・・、それぞれのソフトの修正が必要となる。ここではメモリ効率より、従来のアプリをそのまま使うことを主眼とする。
【課題を解決するための手段】
【００１２】
上記目的を達成するため本発明は、基本的にはヒープメモリ管理を踏襲する。しかしチェーンメモリ要求が来た場合は、必要な数だけチェーンメモリ用メモリブロックをヒープメモリとして確保する。そしてその部分だけのためにチェーンメモリ用管理テーブルを持つ。
【００１３】
この方法では、ヒープメモリが細分化され、ヒープメモリ管理の不連続状態が発生しやすい欠点がさらに悪化するので、通常のヒープメモリは前方アドレスから、チェーンメモリ用のメモリブロックは後方アドレスから確保するようにする。
【００１４】
また空きブロックにさらに小さいメモリを確保する場合、メモリを空きメモリと確保メモリの２つに分割することになるが、それについても通常のヒープメモリは前方アドレス側のブロックを、チェーンメモリ用のメモリブロックは後方アドレス側のブロックを割り当てるように分割する。
【００１５】
さらにメモリを確保する際は、メモリ要求サイズを満たす範囲内で最小のものを用い、なるべく連続で大きいサイズのメモリブロックを温存し、メモリ使用効率も配慮する。
【発明の効果】
【００１６】
以上説明したように、本発明によれば、ヒープメモリ管理方法と、チェーンメモリ管理手法を、同じメモリ空間内で用いることが出来る。
【００１７】
メモリ空間を２倍持つ必要が無く、メモリの節約になる。
【００１８】
アプリケーションからのメモリの扱い方は変わらないので、どちらのメモリ管理方法を用いるアプリケーションも修正すること無く使うことが出来、開発工数を減らすことが出来る。
【００１９】
ヒープメモリ管理手法に起きがちな、メモリ不連続化による使用効率の悪化も低減出来る。
【発明を実施するための最良の形態】
【００２０】
以下メモリ管理方法の手順について詳細に述べるが、手順はヒープメモリ管理方法を期待するアプリケーションからのメモリブロック操作と、チェーンメモリ管理方法を期待するアプリケーションからのメモリブロック操作で異なる。またそれぞれについて、確保・解放・空き容量の調査の手順が必要になる。それらをすべて以下に述べる。
【００２１】
図１は本発明のメモリ管理方法で用いる各テーブルと、それらが表すメモリ状態の例を示す。では、各テーブルについて説明する。
【００２２】
まず、図１のヒープメモリブロックテーブル１００の構造について述べる。
【００２３】
本発明のメモリ管理方法ではすべてのメモリはヒープメモリのブロックからなる。もしすべてのメモリが未使用であれば大きな未使用ブロックが１つあるとする。これらのヒープメモリブロックの情報を保持するテーブルを本発明ではヒープメモリブロックテーブルと呼ぶ、図１のヒープメモリブロックテーブル１００がそのテーブルの例である。
【００２４】
ヒープメモリブロックごとにブロックのステータス１１０、先頭アドレス１２０、サイズ１３０のパラメータを持つ。ブロックのステータス１１０は空き、ヒープメモリブロック、後述のチェーン用メモリブロックなどの状態があり、メモリの使用用途を示す。各メモリ種別ごとの通し番号の情報も同時に持つ。通し番号情報は別なパラメータとして持ってもよい。
【００２５】
次に、図１のメモリブロックテーブル２００の構造について述べる。
【００２６】
本発明においてチェーンメモリ管理手法で扱うメモリの単位であるブロックは、固定長で必要な数だけヒープメモリの形で確保する。これらを本発明では単にメモリブロックもしくは図中などわかりやすいようにチェーンメモリ用メモリブロックと記述する。これらのメモリブロックはヒープメモリとしてヒープメモリブロックテーブル１００に登録されるだけでなく、別にメモリブロックテーブル２００にも登録される。そしてブロックのステータス１１０に同時に登録してある番号に対応するブロック番号でテーブルに登録される。このメモリブロックはチェーン状に接続して使用されるので次に接続されるメモリブロックの番号を持ち、空きブロック２２０に保存される。もしこのブロックがチェーンの最後であればブロック番号の変わりにブロック最後である事を表す数値を保存する。そして本実施例ではメモリブロックサイズを１０００ｈとするが、このうちメモリブロックが実際に使用しているサイズを持つ。
【００２７】
図１のメモリブロックテーブル２００の例の場合は、メモリブロック０〜３までの４つのメモリブロックによって、３８１０ｈのチェーンメモリブロックを表している。
【００２８】
次に図１のチェーンメモリブロックテーブル３００の構造について述べる。図１のようにチェーンメモリブロック番号、開始チェーン用メモリブロック番号３２０、ブロック数３３０、サイズ３４０からなる。
【００２９】
本発明でのチェーンメモリブロックは先に述べたとおりチェーン用メモリブロックのチェーンで表される。チェーンメモリブロックごとに、先頭メモリブロック番号を保持するのがこの表である。先頭メモリブロック番号さえわかれば、ブロック数３３０、サイズ３４０はメモリブロックテーブル２００を検索すればわかるが便宜的にこのテーブルでも保持する。またチェーンメモリブロックごとのステータスなどをこのテーブルに追加してもよい。
【００３０】
図６、図７はヒープメモリ管理方法を期待するアプリケーションからの、ヒープメモリブロック確保を行うシーケンスである。このメモリ確保シーケンスは関数などの形で実装し、メモリ確保要求として関数を呼ぶ。その際に引数として要求メモリサイズ、返値を受け取るためのポインタなどを受け取る。そして返値として割り当てられたメモリブロックのポインタ、エラーなどを返す。
【００３１】
図６はメモリ確保シーケンスのうち空きブロックを探す部分である。Ｓ６００で検索用ポインタをヒープメモリブロックテーブルの先頭側を指す値を代入する。Ｓ６０１で検索用ポインタの指し示すテーブルのブロックのステータス１１０を参照し、空きであるかどうか調べる。空きでない場合はＳ６０２でそのブロックがテーブルの最後尾まで来たか確認する。まだ最後ではない場合、Ａ６０３で検索用ポインタを１ブロックテーブル分加算し後方アドレス側の次のブロックのテーブルを指し示す値にする。そしてＳ６０１の処理に戻る。最後ならＳ６０７の処理を行う。
【００３２】
もしＳ６０１で検索用ポインタの指し示すブロックが空きの場合、Ｓ６０４でそのブロックのサイズが要求メモリサイズと同じかより大きいかチェックし、その場合はＳ６０５へ進む。小さい場合はそのブロックは割り当てることが出来ないのでＳ６０２へ進む。
【００３３】
Ｓ６０５では、後述するが以前に保存した割り当てブロック候補と、今回の検索用ポインタの指すブロックとのサイズを比較する。要求サイズより大きい範囲でぎりぎり小さい空きブロックを用いる方が、メモリの非連続状態を緩和するために望ましい。そのため検索用ポインタの指すメモリブロックの方が大きい場合は、このブロックは使用せずＳ６０２へ進む。検索用ポインタの指すメモリブロックの方が小さいか、もしくはまだ他に割り当てメモリブロック候補がない場合はＳ６０６へ進む。
【００３４】
Ｓ６０６では今回の検索用ポインタの指すメモリブロックを、割り当てメモリブロック候補として、ポインタを一時的に保存する。そのｇＳ６０２の処理に移る。
【００３５】
Ｓ６０７で割り当てメモリブロック候補が存在するか確認する。候補がなければ図７のＳ７００の処理へ、候補があればＳ６０９へ。
【００３６】
Ｓ６０８では空きメモリブロックが帰らなかったことを表すエラーを返値としたり、返値として引数のポインタにセットしたりする。そしてこのシーケンスの処理を終え、関数である場合はリターンする。
【００３７】
図７はメモリ確保シーケンスのうち空きブロックを割り当てる部分である。Ｓ７００で割り当てメモリブロック候補のサイズは、要求サイズと等しいかチェックする。等しいならＳ７０１、等しくなければＳ７０２の処理へ進む。
【００３８】
Ｓ７０１では、その空きブロックをそのまま割り当てブロックとする。まず割り当てメモリブロック候補のステータスを空きブロックからヒープメモリブロックとする。必要ならステータスにヒープメモリとしての通し番号情報を含めてもよい。そしてＳ７０３の処理へ。
【００３９】
Ｓ７０２では、まず割り当て候補のメモリブロックを２つに分割する。その際に先頭アドレス側を要求サイズとし、後方アドレス側を残りのサイズとする。ブロックを分割するのでヒープメモリブロックテーブルをこのブロック以降をすべて１つずらす。そして割り当て候補のメモリブロックのテーブルを、ステータスはヒープメモリブロックとする、先頭アドレスはそのまま、サイズを要求サイズにする。そしてテーブルをずらしたことによって出来た空きテーブルを分割した残りの空きブロックとし、ブロックのステータスを空きブロック、先頭アドレスを割り当て候補ブロックのアドレスに要求サイズを加えたものとする、サイズはもとの割り当て候補ブロックのサイズから要求サイズを引いたものとする。
【００４０】
例を挙げると、割り当て候補のメモリブロックがアドレス１０００ｈ、サイズ８００ｈだったとして、要求サイズが６００ｈであるとする。この場合のブロック分割の方法は、要求されたヒープメモリブロックとして、アドレスを１０００ｈ、サイズを６００ｈとする。もう一つの空きブロックは、アドレスを１６００ｈとし、サイズを２００ｈとする。
【００４１】
そしてＳ７０３の処理に移る。
【００４２】
Ｓ７０３では、割り当て候補ブロックのポインタを、返値として割り当て要求もとへ返す。
【００４３】
以上で、ヒープメモリ管理方法を期待するアプリケーションからの、メモリ確保を行うシーケンスを終了する。
【００４４】
図８はヒープメモリ管理方法を期待するアプリケーションからの、ヒープメモリブロック解放を行うシーケンスである。このメモリ解放シーケンスは関数などの形で実装し、メモリ解放を要求する側のアプリケーションはメモリ解放要求の関数として呼ぶ。その際にこのシーケンスは、解放したいメモリブロックのポインタを引数として受け取り。そして返値として解放の正否を示すエラーなどを返す。
【００４５】
Ｓ８００でアプリケーションから解放を要求されているメモリブロックを探すための検索用ポインタを用意し、その検索用ポインタをヒープメモリブロックテーブルの先頭ブロックのアドレスを代入する。
【００４６】
Ｓ８０１で解放要求ポインタと、現在の検索用ポインタが指すブロックの先頭アドレスが等しいかチェックする。等しければＳ８０４、等しくなければＳ８０２の処理を行う。
【００４７】
Ｓ８０２で検索用ポインタの指すテーブルがテーブル内で最後かどうか確認する。最後ならばＳ８１０の処理、最後でなければＳ８０３の処理へすすむ。
【００４８】
Ｓ８０３で検索用ポインタを、テーブル内の次のブロックを指すアドレスへ加算し、Ｓ８０１へ。
【００４９】
Ｓ８０４では検索用ポインタが指し示すブロックを解放すべきブロックとして、ブロックのステータス１１０を空きとする。先頭アドレス１２０やサイズ１３０はそのままで、Ｓ８０５へ。
【００５０】
Ｓ８０５でそのブロックより１ブロック後方のブロックが空きかテーブルを参照する。後方を先に行わないとポインタの処理が煩雑になる。後方のブロックが空きならＳ８０６、空きでなければＳ８０７の処理を行う。
【００５１】
Ｓ８０６では２つの隣接するブロックが両方空きとなったので結合する。検索用ポインタの指すブロックのサイズ１３０を後方のブロックのサイズ１３０との合計とする。先頭アドレス１２０はそのまま。後方ブロックのテーブルを削除するので、それ以降のブロックのテーブルは１つずつ前方へずらす。このあとＳ８０６の処理へ。
【００５２】
Ｓ８０７で検索用ポインタの指すブロックより前方のブロックのステータス１１０が空きブロックか調査する。あきならＳ８０８、空きでないならＳ８０９の処理を行う。
【００５３】
Ｓ８０８で前方のブロックと結合ずるために、前方のブロックのサイズを検索用ポインタの指すブロックのサイズとの合計とする。前方ブロックの先頭アドレス１２０はそのまま。検索用ポインタの指すブロックのテーブルを削除し、それ以降のテーブルを１つずつ前方にずらし、Ｓ８０９へ。
【００５４】
Ｓ８０９で正常に解放が終わったことを表す値、ＮｏＥｒｒｏｒのようなものを表す値を返値として、解放要求呼び出し側へ返し、処理を終える。
【００５５】
Ｓ８１０で解放要求ブロックに相当するブロックは見つからなかったとして、その旨を表すエラーコードを返値として、解放要求呼び出し側へ返し、処理を終える。
【００５６】
図９は、ヒープメモリ管理方法を期待するアプリケーションからの、空きメモリ容量計算を行うシーケンスである。この空きメモリ容量計算シーケンスは関数などの形で実装し、メモリ容量問い合わせ要求として呼ばれる。その際に特に引数はなく、返値として最大連続空きメモリ長を返す。
【００５７】
Ｓ９００で最大空きブロックを探すための検索用ポインタを用意し、その検索用ポインタをヒープメモリブロックテーブルの先頭ブロックのアドレスを代入する。
【００５８】
Ｓ９０１で現在の検索用ポインタが指すブロックが空きかチェックする。空きならＳ９０４、空きでなければＳ９０２の処理を行う。
【００５９】
Ｓ９０２で検索用ポインタの指すテーブルがテーブル内で最後かどうか確認する。最後ならばＳ９０６の処理、最後でなければＳ９０３の処理へすすむ。
【００６０】
Ｓ９０３で検索用ポインタを、テーブル内の次のブロックを指すアドレスへ加算し、Ｓ９０１へ。
【００６１】
Ｓ９０４では検索用ポインタが指し示すブロックは今までに発見された空きブロックのサイズより、さらに大きいか確認する。さらに大きいならＳ９０５、同じか小さいならＳ９０２の処理へ。
【００６２】
Ｓ９０５で検索用ポインタが指し示すブロックのサイズを、最大空きブロックサイズとして保存し、Ｓ９０２へ。
【００６３】
Ｓ９０６で今までに最大空きブロックサイズが保存されたことがあるか確認する。保存されたことがあればＳ９０７、保存されたことがなければＳ９０８への処理を行う。
【００６４】
Ｓ９０７で最大空きブロックサイズを、連続空きメモリ容量とし、返値として返す。処理を終える。
【００６５】
Ｓ９０８で空きメモリはないので、連続空きメモリ容量０を返値として返し、処理を終える。
【００６６】
図１０はチェーンメモリ管理方法を期待するアプリケーションからの、チェーンメモリ確保を行うシーケンスである。このメモリ確保シーケンスは関数などの形で実装し、メモリ確保要求に関数として呼ばれる。その際に引数として要求メモリサイズ、返値を受け取るためのポインタなどを受け取る。そして返値として割り当てられたメモリブロックのポインタ、エラーなどを返す。要求側のアプリケーションでは、チェーンメモリブロックテーブル３００や、メモリブロックテーブル２００をアクセス出来るものとする。
【００６７】
Ｓ１０００で確保要求サイズをチェーン用メモリブロックのサイズで割り、必要チェーン用メモリブロックの個数を計算する。
【００６８】
Ｓ１００１で必要な個数のチェーン用メモリブロックをヒープメモリとして確保する。確保の手順は図６、図７のヒープメモリ管理方法を期待するアプリケーションからのメモリ確保の手順と同じ処理を行うが、一部違う点については後述する。確保にはメモリブロックテーブル２００を参照し、最後のブロック番号から順にブロックのステータス１１０に割り振れるように引数を与え確保する。
【００６９】
Ｓ１００２では、Ｓ１００１でのヒープメモリ確保の途中で、メモリ不足による確保エラーが帰っているかチェックする。エラーがあったらＳ１００７、エラーが無くすべてのメモリが正常に確保されたらＳ１００３の処理を行う。
【００７０】
Ｓ１００３でメモリブロックテーブル２００を検索し、ブロックの割り当てられていないテーブル空きを探す。
【００７１】
Ｓ１００４で確保されたメモリブロックの数だけメモリブロックテーブル２００を埋める。それらにＳ１００１で用いた通し番号をブロック番号２１０としてテーブルに記録、それらを連結すべくおのおののブロックの次のブロック番号２１０をつぎのブロック２２０として記録する、最後のメモリブロックには最後であることを示すパラメータを入れる。それぞれのブロックのサイズ２３０をチェーン用メモリブロックのサイズとして記録するが、最後のブロックだけはＳ１０００で計算したあまりの値を記録する。
【００７２】
例えば、図１メモリブロックテーブル２００の例では、３８１０のメモリブロックを確保するのに、チェーン用メモリブロックサイズをここでは１０００ｈとし、４つのブロックを割り当てている。順にブロック番号２１０を０，１，２，３とし、それぞれの次のブロック番号２２０を１，２，３とし、最後のブロック番号３番のテーブルはブロック後端であることを表すパラメータが入っている。そしてサイズ２３０はブロック番号０〜２までは１０００ｈだが、最後のブロックだけは８１０ｈとしている。
【００７３】
そしてＳ１００５の処理に移る。
【００７４】
Ｓ１００５ではチェーンメモリブロックテーブル３００に記録する。チェーンメモリブロックとしての連番をどうテーブルを参照して重ならないように割り当て、その番号をテーブル中チェーンメモリブロック番号３１０に記録する。先ほどのメモリブロックテーブル２００で割り当てたブロックの先頭ブロック番号２１０を開始チェーン用メモリブロック番号３２０に記録する。Ｓ１００１で計算した割り当てたブロック数を３３０に書き込む。そして要求されたサイズをサイズ３４０のテーブルに記録して、Ｓ１００６へ。
【００７５】
Ｓ１００６で正常にチェーンメモリが確保されたとして、返値をエラー無しとし、同じく返値にＳ１００５で割り当てたチェーンメモリブロック番号３１０を返し、処理を終える。
【００７６】
Ｓ１００７では、Ｓ１００１でエラーが出るまで確保できてしまったヒープメモリをすべて解放する。その上でメモリ空き無しを意味するエラーコードを返値として、処理を終える。
【００７７】
ところで、Ｓ１００１でふれた図６、図７のヒープメモリ確保シーケンスだが、チェーンメモリはヒープメモリと使われ方・使われるアプリケーションが違い、確保・解放されるタイミングが違うことが考えられるので、本発明ではヒープメモリはアドレス前方寄りから、チェーンメモリはアドレス後方寄りから確保する。そのため、チェーンメモリ管理でのシーケンスは、図７の手順を以下に示すように変更する。
【００７８】
Ｓ６００を検索用ポインタの初期値はテーブルの最後から始める。
【００７９】
Ｓ６０２で検索用ポインタがテーブルの最初であるかチェックする。
【００８０】
Ｓ６０３で検索用ポインタを減算する。
【００８１】
Ｓ７０２で空きブロックを２つに分割する際に、後方アドレス側を要求サイズとし要求メモリブロックとする、そして前方側を空きブロックとする。
【００８２】
図１１はチェーンメモリ管理方法を期待するアプリケーションからの、メモリの解放を行うシーケンスである。このメモリ解放シーケンスは関数などの形で実装し、メモリ解放要求に関数として呼ばれる。その際に引数として解放チェーンメモリブロック番号を受け取る。そして返値として正否を示すエラーなどを返す。要求側のアプリケーションでは、チェーンメモリブロックテーブル３００や、メモリブロックテーブル２００をアクセス出来るものとする。
【００８３】
Ｓ１１００で解放要求チェーンメモリブロック番号を、チェーンメモリブロックテーブル３００のチェーンメモリブロック番号３１０から参照し、該当するブロックを表すテーブルを探す。そのテーブルの開始チェーン用メモリブロック番号３２０を参照し、メモリブロックテーブル２００内でのその番号を検索し、そのテーブルを検索用ポインタに代入する。Ｓ１１０１へ。
【００８４】
Ｓ１１０１でメモリブロックテーブル２００の検索用ポインタの指すテーブルのブロックを図８のシーケンスで解放する。その関数をコールする形でもよい。Ｓ１１０２の処理へ。
【００８５】
Ｓ１００２でそのテーブルがチェーンメモリブロックの後端であるか、次のブロック２２０を参照してチェック。後端であればＳ１１０４、後端でなければＳ１１０３の処理に移る。
【００８６】
Ｓ１１０３で、検索用ポインタを加算し、次のテーブルを参照させる。Ｓ１１０１の処理へ。
【００８７】
Ｓ１１０４で、メモリブロックテーブル２００のうち、先述の妻子チェーン用メモリブロック番号が指すテーブルから、検索用ポインタが最後に指し示しているブロック後端のテーブルまで削除し、それいこうのテーブルを前方に移動して詰める。実際のメモリは不連続であっても、メモリブロックテーブルは連続で作られるのでこの方法で問題ない。Ｓ１１０５の処理へ。
【００８８】
Ｓ１１０５では正常に解放できたものとして、返値をエラー無しとして、処理を終了する。
【００８９】
図１２はチェーンメモリ管理方法を期待するアプリケーションからの、空きチェーンメモリ計算を行うシーケンスである。このメモリ空き容量計算シーケンスは関数などの形で実装し、空きメモリ容量要求に対して関数として呼ばれる。その際に引数は特になく、返値として計算されたチェーンメモリブロックとしての空き容量を返す。
【００９０】
Ｓ１２００で、検索用ポインタと空きメモリ容量レジスタを用意する。検索用ポインタはヒープメモリブロックテーブル１００の先頭ブロックを示すテーブルを指す値を代入し、空きメモリ容量レジスタは０にクリアする。
【００９１】
Ｓ１２０１で検索用ポインタの指すブロックのブロックステータス１１０をチェックする。空きならＳ１２０２、空きでなければＳ１２０３の処理へ進む。
【００９２】
Ｓ１２０２で、そのブロックのサイズ１３０のうち、チェーン用メモリブロックの単位サイズで割り切れる分を、空きメモリ容量レジスタに加算する。
【００９３】
例えば図１のテーブル１００の例では、空きブロックはサイズが５０００ｈ、チェーン用メモリブロックサイズ単位が１０００ｈなので、５０００ｈを空きメモリ容量レジスタに加算する。もし空きブロックサイズが５８００ｈだったとしても、１０００ｈ単位なので５０００ｈを、空きメモリ容量レジスタに加算する。
【００９４】
そしてＳ１２０３の処理へ移る。
【００９５】
Ｓ１２０３で、検索用ポインタの指すブロックはテーブル内で後端のブロックであるかチェックする。後端だったらＳ１２０５、後端でなければＳ１２０４へ。
【００９６】
Ｓ１２０４で検索用ポインタをテーブル内の次のブロックを指し示すように加算して、Ｓ１２０１の処理に移る。
【００９７】
Ｓ１２０５で空きメモリ容量レジスタの値を、空きメモリ容量として呼び出し元へ返値として渡し、処理を終了する。
【図面の簡単な説明】
【００９８】
【図１】本発明のメモリ管理例
【図２】ヒープメモリ管理の利用例１
【図３】ヒープメモリ管理の利用例２
【図４】チェーンメモリ管理の利用例１
【図５】チェーンメモリ管理の利用例２
【図６】ヒープメモリ管理方法を期待するアプリケーションからのメモリ確保１
【図７】ヒープメモリ管理方法を期待するアプリケーションからのメモリ確保２
【図８】ヒープメモリ管理方法を期待するアプリケーションからのメモリ解放
【図９】ヒープメモリ管理方法を期待するアプリケーションからの空きメモリ容量計算
【図１０】チェーンメモリ管理方法を期待するアプリケーションからのメモリ確保
【図１１】チェーンメモリ管理方法を期待するアプリケーションからのメモリ解放
【図１２】チェーンメモリ管理方法を期待するアプリケーションからの空きメモリ容量計算
【符号の説明】
【００９９】
１００  ヒープメモリブロックテーブル
１１０  ブロックのステータス
１２０  先頭アドレス
１３０  サイズ
２００  メモリブロックテーブル
２１０  ブロック番号
２２０  次のブロック
２３０  サイズ
３００  チェーンメモリブロックテーブル３００
３１０  チェーンメモリブロック番号
３２０  開始チェーン用メモリブロック番号
３３０  ブロック数
３４０  サイズ
【図１】
2007109083.tif 000003
【図２】
2007109083.tif 000004
【図３】
2007109083.tif 000005
【図４】
2007109083.tif 000006
【図５】
2007109083.tif 000007
【図６】
2007109083.tif 000008
【図７】
2007109083.tif 000009
【図８】
2007109083.tif 000010
【図９】
2007109083.tif 000011
【図１０】
2007109083.tif 000012
【図１１】
2007109083.tif 000013
【図１２】
2007109083.tif 000014