(57)【要約】【課題】限られたメモリ空間を効率的に活用しつつ、より高速なアクセスを実現する。【解決手段】データを確保するためのメモリ確保領域１２Ｅと、メモリ確保領域１２Ｅに確保されたデータに関するアクセス単位の情報をテーブル化して保持するメモリ確保情報テーブルレジスタ１２Ｂと、メモリ確保領域１２Ｅで直前に確保したデータの情報を保持する前のメモリ確保情報レジスタ１２Ｃと、メモリ確保領域１２Ｅで直前に解放したデータの情報を保持する前のメモリ解放情報レジスタ１２Ｄと、メモリ確保情報テーブルレジスタ１２Ｂの保持テーブルを参照し、前のメモリ確保情報レジスタ１２Ｃ及び前のメモリ解放情報レジスタ１２Ｄの各保持内容に基づいて、次にメモリ確保領域１２Ｅにデータを確保する領域を探索するＣＰＵ１１とを備える。【選択図】図１
2014238767.tif 000002
【特許請求の範囲】
【請求項１】
データを確保するための領域を有するメモリと、
上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持する情報テーブル保持手段と、
上記メモリで直前に確保したデータの情報を保持する前確保情報保持手段と、
上記メモリで直前に解放したデータの情報を保持する前解放情報保持手段と、
上記情報テーブル保持手段の保持するテーブルを参照し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御手段と
を具備したことを特徴とするメモリ制御装置。
【請求項２】
上記メモリ制御手段は、確保しようとする領域が予め設定したサイズより大きいか否かを判断し、予め設定したサイズより大きくないと判断した場合には、上記メモリの一方の端部から所定の範囲内を優先し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて次にデータを確保する領域を探索し、予め設定したサイズより大きいと判断した場合には、上記メモリの他方の端部から次にデータを確保する領域を探索することを特徴とする請求項１記載のメモリ制御装置。
【請求項３】
上記情報テーブル保持手段は、上記メモリ内においてデータを確保した領域の先頭アドレスと、確保したデータのサイズと、当該確保したデータの前に確保した情報テーブルの番号と、当該確保したデータの次に確保した情報テーブルの番号とを保持することを特徴とする請求項１または２記載のメモリ制御装置。
【請求項４】
上記前確保情報保持手段は、上記メモリで直前に確保したデータの情報をテーブル化して保持する上記情報テーブル保持手段のテーブル番号を保持することを特徴とする請求項１または２記載のメモリ制御装置。
【請求項５】
上記前解放情報保持手段は、上記メモリで直前に解放したデータの情報をテーブル化して保持していた上記情報テーブル保持手段のテーブル番号の前に確保した情報テーブルの番号、または次に確保した情報テーブルの番号のいずれか一方と、解放したデータの最大サイズとを保持することを特徴とする請求項１または２記載のメモリ制御装置。
【請求項６】
データを確保するための領域を有するメモリを備えた装置でのメモリ制御方法であって、
上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持させる情報テーブル保持工程と、
上記メモリで直前に確保したデータの情報を保持させる前確保情報保持工程と、
上記メモリで直前に解放したデータの情報を保持させる前解放情報保持工程と、
上記情報テーブル保持工程で保持したテーブルを参照し、上記前確保情報保持工程及び上記前解放情報保持工程での各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御工程と
を有したことを特徴とするメモリ制御方法。
【請求項７】
上記メモリ制御工程は、確保しようとする領域が予め設定したサイズより大きいか否かを判断し、予め設定したサイズより大きくないと判断した場合には、上記メモリの一方の端部から所定の範囲内を優先し、上記前確保情報保持工程及び上記前解放情報保持工程での各保持内容に基づいて次にデータを確保する領域を探索し、予め設定したサイズより大きいと判断した場合には、上記メモリの他方の端部から次にデータを確保する領域を探索することを特徴とする請求項６記載のメモリ制御方法。
【請求項８】
データを確保するための領域を有するメモリを備えた装置が内蔵したコンピュータが実行するプログラムであって、
上記コンピュータを、
上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持する情報テーブル保持手段、
上記メモリで直前に確保したデータの情報を保持する前確保情報保持手段、
上記メモリで直前に解放したデータの情報を保持する前解放情報保持手段、及び
上記情報テーブル保持手段の保持するテーブルを参照し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御手段
として機能させることを特徴とするプログラム。
【請求項９】
上記メモリ制御手段は、確保しようとする領域が予め設定したサイズより大きいか否かを判断し、予め設定したサイズより大きくないと判断した場合には、上記メモリの一方の端部から所定の範囲内を優先し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて次にデータを確保する領域を探索し、予め設定したサイズより大きいと判断した場合には、上記メモリの他方の端部から次にデータを確保する領域を探索することを特徴とする請求項８記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、限られたメモリ空間を有効に活用することが可能なメモリ制御装置、メモリ制御方法及びプログラムに関する。
【背景技術】
【０００２】
メモリ領域の空き領域に対象情報を割り当てるメモリ領域制御装置において、要求の対象となる対象情報に空き領域を効率良く割り当てるべく、閾値アドレスを超えない範囲の領域についてベストフィット方式により空き領域を検索し、該検索した領域に空き領域がなければ該閾値アドレス以降の領域をファーストフィット方式で検索し、その検索された空き領域に対象情報を割り当て、割り当て後の対象情報の格納領域の最終アドレスを閾値アドレスとして設定するようにした技術が考えられている。（例えば、特許文献１）
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００７−２４９７０８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
上記特許文献に記載された技術では、常にメモリ領域の最上位アドレス位置または最下位アドレス位置からベストフィット方式またはファーストフィット方式で空き領域の検索を開始するため、結果的に検索効率が低下する可能性があり得る。
【０００５】
本発明は上記のような実情に鑑みてなされたもので、その目的とするところは、限られたメモリ空間を効率的に活用しつつ、より高速なアクセスを実現することが可能なメモリ制御装置、メモリ制御方法及びプログラムを提供することにある。
【課題を解決するための手段】
【０００６】
本発明の一態様は、データを確保するための領域を有するメモリと、上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持する情報テーブル保持手段と、上記メモリで直前に確保したデータの情報を保持する前確保情報保持手段と、上記メモリで直前に解放したデータの情報を保持する前解放情報保持手段と、上記情報テーブル保持手段の保持するテーブルを参照し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御手段とを具備したことを特徴とする。
【発明の効果】
【０００７】
本発明によれば、限られたメモリ空間を効率的に活用しつつ、より高速なアクセスを実現することが可能となる。
【図面の簡単な説明】
【０００８】
【図１】本発明の第１の実施形態に係るＣＰＵとメモリの構成を示すブロック図。
【図２】同実施形態に係るメモリに設定される先頭メモリ確保番号レジスタの構成を示す図。
【図３】同実施形態に係るメモリに設定されるメモリ確保情報テーブルレジスタの構成を示す図。
【図４】同実施形態に係るメモリに設定される前のメモリ確保情報レジスタの構成を示す図。
【図５】同実施形態に係るメモリに設定される前のメモリ解放情報レジスタの構成を示す図。
【図６】同実施形態に係るＣＰＵが実行するメモリに対する処理内容を示すフローチャート。
【図７】同実施形態に係るＣＰＵがメモリ領域を確保する際の処理内容を示すフローチャート。
【図８】同実施形態に係るＣＰＵがメモリ領域を解放する際の処理内容を示すフローチャート。
【図９】同実施形態に係るメモリの確保と解放に伴う各領域の遷移状態を示す図。
【図１０】同実施形態に係るメモリの確保と解放に伴う各領域の遷移状態を示す図。
【図１１】本発明の第２の実施形態に係るＣＰＵとメモリの構成を示すブロック図。
【図１２】同実施形態に係る先頭メモリ確保番号レジスタ、第２先頭メモリ確保番号レジスタ及び最後尾メモリ確保情報レジスタの構成を示す図。
【図１３】同実施形態に係るメモリ確保情報テーブルレジスタの構成を示す図。
【図１４】同実施形態に係る前のメモリ確保情報レジスタの構成を示す図。
【図１５】同実施形態に係る前のメモリ解放情報レジスタの構成を示す図。
【図１６】同実施形態に係るメモリ確保領域での探索走査の順序を示す図。
【図１７】同実施形態に係るＣＰＵが実行するメモリに対する処理内容を示すフローチャート。
【図１８】同実施形態に係るＣＰＵが小サイズのメモリ領域を確保する際の処理内容を示すフローチャート。
【図１９】同実施形態に係るＣＰＵが小サイズのメモリ領域を確保する際の処理内容を示すフローチャート。
【図２０】同実施形態に係るＣＰＵが大サイズのメモリ領域を確保する際の処理内容を示すフローチャート。
【図２１】同実施形態に係るＣＰＵがメモリ領域を解放する際の処理内容を示すフローチャート。
【発明を実施するための形態】
【０００９】
（第１の実施形態）  
以下、本発明を各種電子機器に組み込まれる汎用のマイクロコンピュータシステムの一部に適用した第１の実施形態について図面を参照して詳細に説明する。
【００１０】
図１は、同実施形態に係るＣＰＵ１１と接続されたデータ記憶用のメモリ１２の構成を示す図である。同図で、メモリ１２には、先頭メモリ確保番号レジスタ１２Ａ、メモリ確保情報テーブルレジスタ１２Ｂ、前のメモリ確保情報レジスタ１２Ｃ、前のメモリ解放情報レジスタ１２Ｄ、及びメモリ確保領域１２ＥがＣＰＵ１１により設定される。
【００１１】
図２に示すように上記先頭メモリ確保番号レジスタ１２Ａは、先頭に位置するメモリ確保番号を保持する。
【００１２】
図３に示すように上記メモリ確保情報テーブルレジスタ１２Ｂは、メモリ確保番号１〜Ｎに関してそれぞれ、メモリのアドレス、サイズ、前のメモリ確保番号（１〜Ｎ）、次のメモリ確保番号（１〜Ｎ）をテーブル化して保持する。
【００１３】
図４に示すように上記前のメモリ確保情報レジスタ１２Ｃは、直前に確保したメモリ確保番号を保持する。
【００１４】
図５に示すように上記前のメモリ解放情報レジスタ１２Ｄは、直前に解放したメモリ確保番号と、その確保番号に対応する最大の空き容量とを保持する。
【００１５】
メモリ確保領域１２Ｅは、メモリ確保領域開始アドレスＡから、メモリ確保領域サイズＷ分の範囲を有し、後述するように領域の確保と解放とをＣＰＵ１１に制御されて、ワークメモリとしてデータの書込み／読出しを行なう領域である。
【００１６】
次に上記実施形態の動作について説明する。  
以下図６乃至図８に示す処理は、ＣＰＵ１１がここでは図示しないプログラムメモリに記憶されている動作プログラムを読出し、上記メモリ１２をワークメモリとして使用することで実行する内容である。
【００１７】
図６に示すようにＣＰＵ１１は、動作プログラムによりメモリ１２のメモリ確保領域１２Ｅに対する確保または解放の要求があると、それがいずれの要求であるかを判断する（ステップＳ１０１）。
【００１８】
例えば初期状態から例えば２０ＫＢのサイズの確保を行なう場合、確保の要求であったと判断した時点でＣＰＵ１１は図７に示すメモリ確保の処理を開始する。  
図７においては、処理当初にメモリ確保情報テーブルレジスタ１２Ｂで空いているものがあるか否かを判断する（ステップＳ２０１）。サイズが「０」となっているテーブルは、使用していないテーブルとして取扱う。  
図９（１）はメモリ１２の初期状態を示し、各レジスタ１２Ａ〜１２Ｄが揃ってクリアされている状態を示す。
【００１９】
なお、上記ステップＳ２０１でメモリ確保情報テーブルレジスタ１２Ｂでサイズ「０」となっている、空いているテーブルがないと判断した場合には、メモリ確保の数が多すぎてあらたな確保を行なうことができず、確保の失敗（エラー）として、この図７の処理を終了する。
【００２０】
上記ステップＳ２０１でメモリ確保情報テーブルレジスタ１２Ｂの内容から空いているものがある（サイズが「０」のテーブルがある）と判断した場合、ＣＰＵ１１は次いで空いているメモリ確保番号の中から、例えば最も小さい値「１」を変数ａに設定する（ステップＳ２０２）。
【００２１】
またＣＰＵ１１は先頭メモリ確保番号レジスタ１２Ａの内容が「０」であるか否かを判断する（ステップＳ２０３）。
【００２２】
ここで先頭メモリ確保番号レジスタ１２Ａの保持内容が「０」であった場合、ＣＰＵ１１はメモリの確保情報が全く保持されていない状態であるとして、探索番号を示す変数ｍに「１」を、次の探索番号を示す変数ｎに「０」を、そして探索開始番号を示す変数Ｚに「１」を設定する（ステップＳ２０４）。
【００２３】
その後にＣＰＵ１１は、探索番号を示す変数ｍの値「１」に基づく、図９（Ｄ）に示すメモリ確保情報テーブルレジスタ１２Ｂの「１」番目のテーブルにおいて、メモリ領域の空き容量Δがすなわちメモリ確保領域１２ＥのサイズＷであるとして、今回のメモリ確保サイズＳより大きいか否かにより、当該位置を確保できるかどうかを判断する（ステップＳ２０５）。
【００２４】
ここでメモリ領域の空き容量Δが今回のメモリ確保サイズＳより小さいと判断した場合には、ＣＰＵ１１は空き容量がないものとして、確保の失敗（エラー）として、この図７の処理を終了する。
【００２５】
また空き容量Δが今回のメモリ確保サイズＳより大きいと判断すると、ＣＰＵ１１はメモリ確保情報を示す変数ｍの値と、先頭メモリ確保番号レジスタ１２Ａの値とを書き換える（ステップＳ２０６）。
【００２６】
併せて、前のメモリ確保情報レジスタ１２Ｃのメモリ確保番号に「１」を設定し（ステップＳ２０７）、今回確保したアドレス（メモリ確保番号「１」（＝ａ）のアドレス）をＣＰＵ１１に返して、実際のメモリ確保が実行される。
【００２７】
図９（２）がこのときのメモリ１２の内容を例示する。メモリ確保領域１２Ｅの開始アドレスＡである「０ｘ００００」番地から２０ＫＢ分が確保された状態となる。  
次に１０ＫＢのメモリ領域を確保する場合、ＣＰＵ１１は図７の上記ステップＳ２０１を介して上記ステップＳ２０２で空きのメモリ確保情報番号を示す変数ａに空いているテーブルの番号「２」を設定する。
【００２８】
次にＣＰＵ１１は、上記ステップＳ２０３で先頭メモリ確保番号レジスタ１２Ａの保持内容が「０」ではなく「１」であると判断し、前のメモリ解放情報レジスタ１２Ｄの保持内容のサイズを参照し、今回のメモリ確保サイズＳの方が大きいか否かにより、当該位置を確保できるかどうかを判断する（ステップＳ２０８）。
【００２９】
ここで前のメモリ解放情報レジスタ１２Ｄの最大の空き容量を参照し、今回のメモリ確保サイズＳの方が大きいと判断すると、探索番号を示す変数ｍに前のメモリ確保情報レジスタ１２Ｃの保持値「１」を設定すると共に、探索開始番号を示す変数Ｚに上記変数ｍの値「１」を設定する（ステップＳ２１１）。
【００３０】
また上記ステップＳ２０８で前のメモリ解放情報レジスタ１２Ｄの保持内容のサイズを参照し、今回のメモリ確保サイズＳの方が小さいと判断した場合には、上記ステップＳ２０９と同様に、探索番号を示す変数ｍに前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号を設定すると共に、この探索開始番号を示す変数Ｚに上記変数ｍの値を設定する（ステップＳ２０９）。
【００３１】
さらにＣＰＵ１１は、前のメモリ解放情報レジスタ１２Ｄのメモリ番号を「０」とすることで、今回使用したことによるクリア設定を行なう（ステップＳ２１０）。
【００３２】
上記ステップＳ２１０またはＳ２１１の処理後、探索番号を示す変数ｍより、メモリ確保情報テーブルレジスタ１２Ｂのメモリ確保番号ｍの次のメモリ確保番号を、変数ｎとして設定する（ステップＳ２１２）。
【００３３】
そして、探索番号ｍと次のｎまでの空き容量Δを、次式  
空き容量Δ＝メモリ確保番号ｎのメモリアドレス−メモリ確保番号ｍのメモリアドレス  
−メモリ確保番号ｍのサイズ      …(1)  
として算出する（ステップＳ２１３）。
【００３４】
但し、上記次のメモリ確保番号ｎが０の時、すなわちデータがなく、メモリ番号ｍが最後尾である場合は、  
空き容量Δa＝メモリ確保領域開始アドレスＡ＋メモリ領域サイズＷ  
−メモリ確保番号ｍのメモリアドレス−メモリ確保番号ｍのサイズ  …(2)  
空き容量Δb＝先頭メモリ確保情報のメモリ確保番号のメモリアドレス  
−メモリ確保領域開始アドレスＡ    …(3)  
として、ΔaとΔbのより大きい方を空き容量Δとする。
【００３５】
その後にＣＰＵ１１は、算出した空き容量Δが、今回確保するメモリのサイズＳよりも大きいか否かを判断する（ステップＳ２１４）。
【００３６】
ここで算出した空き容量Δが今回確保するメモリのサイズＳよりも大きいと判断すると、ＣＰＵ１１はメモリ確保情報を示す変数ａ，ｍ，ｎの値を書き換える（ステップＳ２１５）。すなわち、  
メモリ確保情報テーブルレジスタ１２Ｂのｍ番目のテーブルの次のメモリ確保番号（本来はｎ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ１２Ｂのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝ｎ  
とし、さらにメモリ確保情報テーブルレジスタ１２Ｂのｎ番目のテーブルの前のメモリ確保番号（本来はｍ）に変数ａの値を設定する。
【００３７】
これにより、メモリ確保領域の物理的な順序は、  
「メモリ確保領域ｍ→メモリ確保領域ｎ」の状態から、  
「メモリ確保領域ｍ→メモリ確保領域ａ→メモリ確保領域ｎ」の状態となる。
【００３８】
併せて、ＣＰＵ１１は、前のメモリ確保情報レジスタ１２Ｃのメモリ確保番号に、上記変数ａの値を設定する（ステップＳ２１６）。
【００３９】
さらにＣＰＵ１１は、このあらたに設定した変数ａで示されるメモリ確保番号の前に位置するメモリ確保番号が「０」であるか否か、を判断する（ステップＳ２１７）。
【００４０】
ここで変数ａで示されるメモリ確保番号の前に位置するメモリ確保番号が「０」であると判断した場合にのみ、先頭メモリ確保番号レジスタ１２Ａに変数ａの値を設定した上で（ステップＳ２１８）、今回確保したアドレス（メモリ確保番号＝ａのアドレス）をＣＰＵ１１に返して、実際のメモリ確保が実行される。
【００４１】
図９（３）がこのときのメモリ１２の内容を例示する。メモリ確保領域１２Ｅのアドレス「０ｘ０５０００」番地から１０ＫＢ分が確保された状態となる。  
上記と同様にして図９（４）、図９（５）、図１０（１）で示すようにメモリ確保領域１２Ｅのアドレス位置を順次更新しながら３０ＫＢ分、４０ＫＢ分、１０ＫＢ分の領域を順次確保していく。
【００４２】
なお、上記ステップＳ２１４において、算出した空き容量Δが今回確保するメモリのサイズＳよりも大きくないと判断した場合、その時点の変数ｎの値が「０」であるか否かにより、次のメモリ確保番号でのメモリ領域を用いることが可能か否かを判断する（ステップＳ２１９）。
【００４３】
ここで変数ｎの値が「０」であると判断した場合、データがなく、メモリ確保番号ｍ自体がメモリ確保領域１２Ｅの最後尾であるため、ＣＰＵ１１は先頭メモリ確保番号レジスタ１２Ａの保持内容を探索番号の変数ｍの値としてあらためて設定する（ステップＳ２２０）。
【００４４】
但し、上記式（２）の空き容量Δaを選択した場合、ＣＰＵ１１はメモリ確保番号に探索番号の変数ｍを設定し、次のメモリ確保番号の変数をａ（元はｎ）とすると共に、メモリ確保情報テーブルレジスタ１２Ｂのメモリ確保番号ａのテーブルに関し、  
アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
サイズ  ＝今回のメモリ確保サイズＳ  
前のメモリ確保番号＝ｍ  
次のメモリ確保番号＝０（メモリ確保領域１２Ｅの最後尾）  
として設定する。
【００４５】
また上記式（３）の空き容量Δｂを選択した場合、メモリ確保番号に探索番号の次の変数ｎ、すなわち先頭メモリ確保番号を設定し、前のメモリ確保番号の変数をａ（元はｍ）とすると共に、メモリ確保情報テーブルレジスタ１２Ｂのメモリ確保番号ａのテーブルに関し、  
アドレス＝メモリ確保領域開始アドレスＡ  
サイズ  ＝今回のメモリ確保サイズＳ  
前のメモリ確保番号＝０（先頭）  
次のメモリ確保番号＝ｎ  
とし、さらにメモリ確保情報テーブルレジスタ１２Ｂのｎ番目のテーブルの前のメモリ確保番号（本来は０）に変数ａの値を設定する。
【００４６】
さらに上記ステップＳ２１９において、変数ｎの値が「０」ではないと判断した場合、ＣＰＵ１１はその時点で次のメモリ確保番号として保持している変数ｎの値を探索番号の変数ｍの値としてあらためて設定する（ステップＳ２２１）。
【００４７】
上記ステップＳ２２０またはＳ２２１の処理後、ＣＰＵ１１は探索開始番号を示す変数Ｚの値が上記探索番号の変数ｍの値と等しいか否かを判断する（ステップＳ２２２）。
【００４８】
ここで変数Ｚの値が上記探索番号の変数ｍの値とが等しいと判断した場合には、あらたな確保を行なうことができず、確保の失敗（エラー）として、この図７の処理を終了する。
【００４９】
また上記ステップＳ２２２で変数Ｚの値が上記探索番号の変数ｍの値とが等しくないと判断した場合には、上記ステップＳ２１２からの処理に戻り、メモリ確保の探索番号の変数ｍに基づいて次の番号ｎの再設定処理を行なった上で、再度のメモリ確保に関する処理を続行する。
【００５０】
次に図１０（２）に示すようにメモリ確保領域１２Ｅのアドレス「０ｘ０５０００」番地から１０ＫＢ分を解放する場合、ＣＰＵ１１は上記図６のステップＳ１０１でメモリ確保ではなくメモリ解放の要求があったと判断すると、ＣＰＵ１１は図８に示すメモリ解放の処理を開始する。  
図８においては、処理当初にメモリ確保情報テーブルレジスタ１２Ｂでメモリアドレスを検索し、与えられたメモリ解放アドレスに該当するメモリ確保番号ｒを取得する（ステップＳ３０１）。ここでは、メモリ確保領域１２Ｅのアドレス「０ｘ０５０００」番地に関するメモリ確保情報テーブルレジスタ１２Ｂの「２」番目のテーブルが該当するため、メモリ確保番号を示す変数ｒは「２」となる。  
その後、前のメモリ解放情報レジスタ１２Ｄの内容を参照し、メモリ確保番号ｒで示される領域のサイズの方が大きいか否かを判断する（ステップＳ３０２）。
【００５１】
メモリ確保番号ｒで示される領域のサイズの方が大きいと判断した場合にのみ、ＣＰＵ１１は、メモリ確保番号ｒの領域のサイズを用いて前のメモリ解放情報レジスタ１２Ｄの内容を書き換える（ステップＳ３０３）。
【００５２】
ここでは、前のメモリ解放情報レジスタ１２Ｄの最大の空き容量は「０」であり、ＣＰＵ１１はメモリ確保番号「２」で示される領域のサイズ１０ＫＢの方が大きいと判断し、上記ステップＳ３０３の処理により、前のメモリ解放情報レジスタ１２Ｄの最大の空き容量をメモリ確保番号「２」の領域のサイズ１０ＫＢに書き換える。
【００５３】
次に、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号が「０」であるか否かを判断する（ステップＳ３０４ａ）。
【００５４】
前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号が「０」ではなかった場合、その後、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号に該当するアドレス値より、メモリ確保番号ｒのアドレス値の方が小さいか否かを判断する（ステップＳ３０４ｂ）。
【００５５】
また上記ステップＳ３０４ａにおいて、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号が「０」であった場合、ＣＰＵ１１は上記ステップＳ３０４ｂの処理をスキップして、ステップＳ３０５へ飛ぶ。
【００５６】
前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号に該当するアドレス値より、メモリ確保番号ｒのアドレス値の方が小さいと判断した場合、ＣＰＵ１１はさらにメモリ確保番号ｒの前のメモリ確保番号が「０」であるか否かを判断する（ステップＳ３０５）。
【００５７】
メモリ確保番号ｒの前のメモリ確保番号が「０」ではなかった場合、ＣＰＵ１１はメモリ確保番号ｒの前のメモリ確保番号を用いて、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号を書き換える（ステップＳ３０６）。
【００５８】
また上記ステップＳ３０５において、メモリ確保番号ｒの前のメモリ確保番号が「０」であった場合、次にＣＰＵ１１はメモリ確保番号ｒの次のメモリ確保番号が「０」であるか否かを判断する（ステップＳ３０７）。
【００５９】
メモリ確保番号ｒの次のメモリ確保番号が「０」ではなかった場合、ＣＰＵ１１は次のメモリ解放情報のメモリ確保番号を用いて、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号を書き換える（ステップＳ３０８）。
【００６０】
また上記ステップＳ３０７において、メモリ確保番号ｒの次のメモリ確保番号が「０」であった場合、ＣＰＵ１１はメモリ確保されている残りがないものとして、前のメモリ解放情報レジスタ１２Ｄに関する内容をすべてクリアする（ステップＳ３０９）。
【００６１】
上記ステップＳ３０４ｂで前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号のアドレス値が、メモリ確保番号ｒのアドレス値以上であると判断した場合、または上記ステップＳ３０６またはステップＳ３０８またはステップＳ３０９での処理実行後、ＣＰＵ１１はメモリ確保番号ｒの前のメモリ確保番号をｔ、次のメモリ確保番号をｕとすると、以下のように書き換えて、メモリ確保情報テーブルレジスタ１２Ｂからメモリ確保番号ｒのデータを削除する（ステップＳ３１０）。すなわち、  
・メモリ確保番号ｒの前のメモリ確保番号をｔ、次のメモリ確保番号をｕとして、  
・メモリ確保番号ｒのテーブルのクリア  
・メモリ確保番号ｔの次のメモリ加来真穂番号＝ｕ  
・メモリ確保番号ｕの前のメモリ確保番号＝ｔ  
の各処理を一括して実行し、メモリ確保領域１２Ｅのアドレス「０ｘ０５０００」番地から１０ＫＢ分のメモリ解放が実行される。
【００６２】
この時点で、図１０（Ｊ）に示すようにメモリ確保領域１２Ｅのアドレス「０ｘ０５０００」から１０ＫＢ分が解放されていると共に、図１０（Ｃ）に示すように前のメモリ解放情報レジスタ１２Ｄにはメモリ確保番号「１」及び最大の空き容量１０ＫＢの情報が保持され、図１０（Ｅ）に示すようにメモリ確保情報テーブルレジスタ１２Ｂの２番目のテーブルがクリアされている。
【００６３】
その後、さらに図１０（３）に示すようにメモリ確保領域１２Ｅのアドレス「０ｘ０Ｆ０００」番地から４０ＫＢ分を解放する場合、ＣＰＵ１１は上記図６のステップＳ１０１でメモリ確保ではなくメモリ解放の要求があったと判断すると、ＣＰＵ１１は図８に示すメモリ解放の処理を開始する。  
図８においては、処理当初にメモリ確保情報テーブルレジスタ１２Ｂでメモリアドレスを検索し、与えられたメモリ解放アドレスに該当するメモリ確保番号ｒとして「４」を取得する（ステップＳ３０１）。
【００６４】
次にＣＰＵ１１は、上記ステップＳ３０２で前のメモリ解放情報レジスタ１２Ｄの内容から、今回解放しようとしているメモリ確保番号「４」の領域のサイズの方が大きいと判断すると、上記ステップＳ３０３でメモリ確保番号「４」の領域のサイズ４０ＫＢを用いて前のメモリ解放情報レジスタ１２Ｄの最大の空き容量を書き換える。
【００６５】
次に、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号が「０」であるか否かを判断し（ステップＳ３０４ａ）、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号が「１」であるので、その後にＣＰＵ１１は、上記ステップＳ３０４ｂにおいて、前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号「１」に該当するアドレス「０ｘ０００００」番地より、メモリ確保番号「４」のアドレス「０ｘ０Ｆ０００」番地の方が大きいと判断し、上記ステップＳ３１０に進む。
【００６６】
その後にＣＰＵ１１は、上記ステップＳ３１０において、メモリ確保情報テーブルレジスタ１２Ｂからメモリ確保番号「４」のデータを削除する。すなわち、  
・メモリ確保番号「４」の前のメモリ確保番号を３、次のメモリ確保番号を５として、  
・メモリ確保番号「４」のテーブルのクリア  
・メモリ確保番号３の次のメモリ確保番号＝５  
・メモリ確保番号５の前のメモリ確保番号＝３  
の各処理を一括して実行し、メモリ確保領域１２Ｅのアドレス「０ｘ０Ｆ０００」番地から４０ＫＢ分のメモリ解放が実行される。
【００６７】
この時点で、図１０（Ｊ）に示すようにメモリ確保領域１２Ｅのアドレス「０ｘ０Ｆ０００」から４０ＫＢ分が解放されていると共に、図１０（Ｃ）に示すように前のメモリ解放情報レジスタ１２Ｄにはメモリ確保番号「１」及び最大の空き容量４０ＫＢの情報が保持され、図１０（Ｇ）に示すようにメモリ確保情報テーブルレジスタ１２Ｂの４番目のテーブルがクリアされている。
【００６８】
その後に１０ＫＢのサイズの確保を行なう場合、確保の要求であったと判断した時点でＣＰＵ１１は図７に示すメモリ確保の処理を開始する。  
図７において、上記ステップＳ２０１でメモリ確保情報テーブルレジスタ１２Ｂで空いているテーブルがあると判断すると、ＣＰＵ１１は次いで上記ステップＳ２０２で空きのメモリ確保情報番号を示す変数ａに例えば先頭側の空いているテーブルの番号「２」を設定する。
【００６９】
続く上記ステップＳ２０３で、ＣＰＵ１１は先頭メモリ確保番号レジスタ１２Ａの内容が「０」ではないことを判断し、上記ステップＳ２０８に進んで前のメモリ解放情報レジスタ１２Ｄの保持内容のサイズ４０ＫＢを参照し、今回のメモリ確保サイズＳ（＝１０ＫＢ）の方が小さいと判断すると、上記ステップＳ２０９で探索番号を示す変数ｍに前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号「１」を設定すると共に、探索開始番号を示す変数Ｚに上記変数ｍの値「１」を設定する。
【００７０】
さらにＣＰＵ１１は、上記ステップＳ２１０で前のメモリ解放情報レジスタ１２Ｄのメモリ確保番号を「０」とすることで、今回使用したことによるクリア設定を行なう。
【００７１】
上記ステップＳ２１０の処理後、ＣＰＵ１１は上記ステップＳ２１２で探索番号を示す変数「１」に該当するメモリ確保情報テーブル１の次のメモリ確保番号「３」を変数ｎとして設定する。
【００７２】
そして、ＣＰＵ１１は上記ステップＳ２１３で探索番号ｍ（＝「１」）と次のｎ（＝「３」）までの空き容量Δが１０ＫＢであることを上記式（１）を用いて算出する。
【００７３】
その後にＣＰＵ１１は、上記ステップＳ２１４で算出した空き容量１０ＫＢが、今回確保するメモリのサイズ１０ＫＢ以内であると判断すると、上記ステップＳ２１５でメモリ確保を行なうために上記変数ａ，ｍ，ｎの値を書き換える。
【００７４】
ここでは、上記ステップＳ２０２で設定した変数ａの値「２」が、メモリ確保情報テーブルレジスタ１２Ｂのｍ（＝「１」）番目のテーブルの次のメモリ確保番号となるように設定すると共に、メモリ確保番号ａの値「２」に基づくメモリ確保情報テーブルレジスタ１２Ｂの２番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍ（＝「１」）のアドレス  
＋メモリ確保番号ｍ（＝「１」）のサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ（＝「１」）  
・次のメモリ確保番号＝ｎ（＝「３」）  
とし、さらにメモリ確保情報テーブルレジスタ１２Ｂのｎ（＝「３」）番目のテーブルの前のメモリ確保番号に変数ａの値「２」を設定する。
【００７５】
続く上記ステップＳ２１６でＣＰＵ１１は、前のメモリ確保情報レジスタ１２Ｃの保持内容を変数ａの値「２」に設定し、続く上記ステップＳ２１７で変数ａの値「２」で示されるメモリ確保番号の前に位置するメモリ確保番号「１」が「０」ではないことを確認すると、今回確保したアドレス「０ｘ０５０００」をＣＰＵ１１に返して、実際のメモリ確保を実行する。
【００７６】
この時点で、図１０（Ｊ）に示すようにメモリ確保領域１２Ｅのアドレス「０ｘ０５０００」から１０ＫＢ分が再度確保されると共に、図１０（Ｃ）に示すように前のメモリ解放情報レジスタ１２Ｄはメモリ確保番号、最大の空き容量共にクリアされて「０」とされ、図１０（Ｅ）に示すようにメモリ確保情報テーブルレジスタ１２Ｂの２番目のテーブルが上記ステップＳ２１５での処理により設定されている。
【００７７】
その後に２０ＫＢのサイズの確保を行なう場合、確保の要求であったと判断した時点でＣＰＵ１１は図７に示すメモリ確保の処理を開始する。  
図７において、上記ステップＳ２０１でメモリ確保情報テーブルレジスタ１２Ｂで空いているテーブルがあると判断すると、ＣＰＵ１１は次いで上記ステップＳ２０２で空きのメモリ確保情報番号を示す変数ａに例えば先頭側の空いているテーブルの番号「４」を設定する。
【００７８】
続く上記ステップＳ２０３で、ＣＰＵ１１は先頭メモリ確保番号レジスタ１２Ａの内容が「０」ではないことを判断し、上記ステップＳ２０８に進んで前のメモリ解放情報レジスタ１２Ｄの保持内容のサイズ「０」を参照し、今回のメモリ確保サイズＳ（＝２０ＫＢ）の方が大きいと判断すると、上記ステップＳ２１１で探索番号を示す変数ｍに前のメモリ確保情報レジスタ１２Ｃのメモリ確保番号の保持値「２」を設定すると共に、探索開始番号を示す変数Ｚに上記変数ｍの値「２」を設定する。
【００７９】
上記ステップＳ２１１の処理後、ＣＰＵ１１は上記ステップＳ２１２で探索番号を示す変数「２」の次のメモリ確保番号「３」を変数ｎとして設定する。
【００８０】
そして、ＣＰＵ１１は上記ステップＳ２１３で探索番号ｍと次のｎまでの空き容量Δが０ＫＢであることを上記式（１）により算出する。
【００８１】
その後にＣＰＵ１１は、上記ステップＳ２１４で算出した空き容量０ＫＢが、今回確保するメモリのサイズ２０ＫＢに足りないことを判断すると、続くステップＳ２１０で変数ｎの値が「０」ではないことを確認した上で、上記ステップＳ２２１において探索番号ｍの値を同変数ｎの値「３」により更新設定する。
【００８２】
次いでＣＰＵ１１は、上記ステップＳ２２２において変数Ｚの値「２」が探索番号の変数ｍの値「３」とが等しくないと判断し、上記ステップＳ２１２からの処理に戻る。
【００８３】
こうして上記ステップＳ２１２〜Ｓ２１４，Ｓ２１９，Ｓ２２１，Ｓ２２２の処理を繰返し実行することで、探索に用いる変数ｍ，ｎの値を順次「＋１」更新設定しながら、２０ＫＢの空き容量が確保可能なメモリ確保番号を探索する。
【００８４】
そして、変数ｍの値が「３」、ｎの値が「５」となった時点で、対応するメモリ確保領域１２Ｅのアドレス「０ｘ０Ｆ０００」からの４０ＫＢ分が空き容量として確保可能であることを上記ステップＳ２１４で判断すると、ＣＰＵ１１は上記ステップＳ２１５でメモリ確保を行なうために上記変数ａ，ｍ，ｎの値を書き換える。
【００８５】
ここでは、上記ステップＳ２０２で設定した変数ａの値「４」が、メモリ確保情報テーブルレジスタ１２Ｂのｍ（＝「３」）番目のテーブルの次のメモリ確保番号となるように設定すると共に、メモリ確保番号ａの値「４」に基づくメモリ確保情報テーブルレジスタ１２Ｂの４番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍ（＝「３」）のアドレス  
＋メモリ確保番号ｍ（＝「３」）のサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ（＝２０ＫＢ）  
・前のメモリ確保番号＝ｍ（＝「３」）  
・次のメモリ確保番号＝ｎ（＝「５」）  
とし、さらにメモリ確保情報テーブルレジスタ１２Ｂのｎ（＝「５」）番目のテーブルの前のメモリ確保番号に変数ａの値「４」を設定する。
【００８６】
続く上記ステップＳ２１６でＣＰＵ１１は、前のメモリ確保情報レジスタ１２Ｃの保持内容を変数ａの値「４」に設定し、続く上記ステップＳ２１７で変数ａの値「４」で示されるメモリ確保番号の前に位置するメモリ確保番号「３」が「０」ではないことを確認すると、今回確保したアドレス「０ｘ０Ｆ０００」をＣＰＵ１１に返して、実際のメモリ確保を実行する。
【００８７】
この時点で、図１０（Ｊ）に示すようにメモリ確保領域１２Ｅのアドレス「０ｘ０Ｆ０００」から２０ＫＢ分が再度確保されると共に、図１０（Ｃ）に示すように前のメモリ解放情報レジスタ１２Ｄはメモリ確保番号、最大の空き容量が共にクリアされて「０」とされ、図１０（Ｇ）に示すようにメモリ確保情報テーブルレジスタ１２Ｂの４番目のテーブルが上記ステップＳ２１５での処理により設定されている。
【００８８】
以上詳述した如く本実施形態によれば、先頭メモリ確保番号レジスタ１２Ａと、各メモリ確保領域毎の情報をテーブル化して保持するメモリ確保情報テーブルレジスタ１２Ｂ、前のメモリ確保情報レジスタ１２Ｃ、及び前のメモリ解放情報レジスタ１２Ｄを用い、直前に確保または解放したメモリ確保領域の位置を参照して、次に確保または解放の処理を開始する位置を制御するようにしたので、限られたメモリ空間を効率的に活用しつつ、より高速なアクセスを実現することが可能となる。
【００８９】
（第２の実施形態）  
以下、本発明を各種電子機器に組み込まれる汎用のマイクロコンピュータシステムの一部に適用した第２の実施形態について図面を参照して詳細に説明する。
【００９０】
図１１は、同実施形態に係るＣＰＵ２１と接続されたデータ記憶用のメモリ２２の構成を示す図である。同図で、メモリ２２には、先頭メモリ確保番号レジスタ２２Ａ、探索方向変更アドレス以降の先頭メモリ確保番号レジスタ（以下文中では「第２先頭メモリ確保番号レジスタ」と称する）２２Ｂ、最後尾メモリ確保情報レジスタ２２Ｃ、メモリ確保情報テーブルレジスタ２２Ｄ、前のメモリ確保情報レジスタ２２Ｅ、前のメモリ解放情報レジスタ２２Ｆ、及びメモリ確保領域２２ＧがＣＰＵ２１により設定される。
【００９１】
図１２（Ａ）に示すように上記先頭メモリ確保番号レジスタ２２Ａは、先頭に位置するメモリ確保番号を保持する。  
図１２（Ｂ）に示すように上記第２先頭メモリ確保番号レジスタ２２Ｂは、探索方向変更アドレス以降の先頭メモリ確保番号を保持する。  
図１２（Ｃ）に示すように上記最後尾メモリ確保情報レジスタ２２Ｃは、最後尾のメモリ確保番号を保持する。
【００９２】
図１３に示すように上記メモリ確保情報テーブルレジスタ２２Ｄは、メモリ確保番号１〜Ｎに関してそれぞれ、メモリのアドレス、サイズ、前のメモリ確保番号（１〜Ｎ）、次のメモリ確保番号（１〜Ｎ）をテーブル化して保持する。
【００９３】
図１４に示すように上記前のメモリ確保情報レジスタ２２Ｅは、直前に確保したメモリ確保番号を保持する。
【００９４】
図１５に示すように上記前のメモリ解放情報レジスタ２２Ｆは、直前に解放したメモリ確保番号と、その確保番号に対応する最大の空き容量とを保持する。
【００９５】
図１６に示すように上記メモリ確保領域２２Ｇは、メモリ確保領域開始アドレスＡから、メモリ確保領域サイズＷ分の範囲を有し、後述するように領域の確保と解放とをＣＰＵ２１に制御されて、ワークメモリとしてデータの書込み／読出しを行なう領域である。
【００９６】
加えてメモリ確保領域２２Ｇは、上記メモリ確保領域開始アドレスＡから、確保サイズが小さい場合に優先して検索する領域として探索方向変更アドレスＢを設定する。この探索方向変更アドレスＢ補設定することにより、確保サイズが大きい場合と小さい場合とでメモリ領域を確保する場合の検索を後述する動作のように切り換える。
【００９７】
次に上記実施形態の動作について説明する。  
以下図１７乃至図２１に示す処理は、ＣＰＵ２１がここでは図示しないプログラムメモリに記憶されている動作プログラムを読出し、上記メモリ２２をワークメモリとして使用することで実行する内容である。
【００９８】
図１７に示すようにＣＰＵ２１は、動作プログラムによりメモリ２２のメモリ確保領域２２Ｇに対する確保または解放の要求があると、それがいずれの要求であるかを判断する（ステップＳ４０１）。
【００９９】
ここで確保の要求であると判断した場合、ＣＰＵ２１はさらにそのメモリ確保の要求に対して、確保しようとするデータの領域サイズが予め設定された容量より大きいか否かを判断する（ステップＳ４０２）。
【０１００】
確保しようとするデータの領域サイズが予め設定された容量以下であると判断した場合、ＣＰＵ２１は小サイズ用のメモリ確保処理を開始する一方で、確保しようとするデータの領域サイズが予め設定された容量より大きいと判断した場合には、ＣＰＵ２１は大サイズ用のメモリ確保処理を開始する。
【０１０１】
また上記ステップＳ４０１でメモリ確保の要求ではないと判断した場合、ＣＰＵ２１はメモリ確保領域２２Ｇのアドレスを指定した上で当該アドレス以下の領域のメモリ解放の処理を開始する。
【０１０２】
図１８及び図１９は、小さいサイズ用のメモリ確保の処理内容を示すフローチャートである。その処理当初に、ＣＰＵ２１はメモリ確保情報テーブルレジスタ２２Ｄで空いているものがあるか否かを判断する（ステップＳ５０１）。サイズが「０」となっているテーブルは、使用していないテーブルとして取扱う。  
ここで空いているテーブルがないと判断した場合には、メモリ確保の数が多すぎてあらたな確保を行なうことができず、確保の失敗（エラー）として、この図１８及び図１９の処理を終了する。
【０１０３】
上記ステップＳ５０１でメモリ確保情報テーブルレジスタ２２Ｄの内容から空いているものがある（サイズが「０」のテーブルがある）と判断した場合、ＣＰＵ２１は次いで空いているメモリ確保番号の中から、例えば最も小さい値「１」を変数ａに設定する（ステップＳ５０２）。
【０１０４】
またＣＰＵ２１は先頭メモリ確保番号レジスタ２２Ａの内容が「０」であるか否かを判断する（ステップＳ５０３）。
【０１０５】
ここで先頭メモリ確保番号レジスタ２２Ａの保持内容が「０」であった場合、ＣＰＵ２１はメモリの確保情報が全く保持されていない状態であるとして、探索番号を示す変数ｍに「１」を、次の探索番号を示す変数ｎに「０」を、そして探索開始番号を示す変数Ｚに「１」を設定する（ステップＳ５０４）。
【０１０６】
その後にＣＰＵ２１は、探索番号を示す変数ｍの値「１」に基づき、メモリ確保情報テーブルレジスタ２２Ｄの「１」番目のテーブルにおいて、メモリ領域の空き容量Δがすなわちメモリ確保領域１２ＥのサイズＷであるとして、今回のメモリ確保サイズＳより大きいか否かにより、当該位置を確保できるかどうかを判断する（ステップＳ５０５）。
【０１０７】
ここでメモリ領域の空き容量Δが今回のメモリ確保サイズＳより小さいと判断した場合には、ＣＰＵ２１は空き容量がないものとして、確保の失敗（エラー）として、この図７の処理を終了する。
【０１０８】
また上記ステップＳ５０５で空き容量Δが今回のメモリ確保サイズＳより大きいと判断すると、ＣＰＵ２１はメモリ確保情報を示す変数ｍの値、先頭メモリ確保番号レジスタ２２Ａの値、及び最後尾メモリ確保情報レジスタ２２Ｃの値を書き換える（ステップＳ５０６）。すなわち、  
メモリ確保情報テーブルレジスタ２２Ｄの１番目のテーブルについて、  
・アドレス＝メモリ確保領域２２Ｇの先頭アドレスＡ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０  
・次のメモリ確保番号＝０  
とすると共に、前のメモリ確保情報レジスタ２２Ｅの値、先頭メモリ確保番号レジスタ２２Ａの値、及び最後尾メモリ確保情報レジスタ２２Ｃの値をいずれも「１」とする。
【０１０９】
併せて、前のメモリ確保情報レジスタ２２Ｅのメモリ確保番号に「１」を設定し（ステップＳ５０７）、今回確保したアドレス（メモリ確保番号「１」（＝ａ）のアドレス）をＣＰＵ２１に返して、実際のメモリ確保が実行される。
【０１１０】
また上記ステップＳ５０３で先頭メモリ確保番号レジスタ２２Ａの保持内容が「０」ではないと判断した場合、すなわちメモリ２２が初期化直後ではなく、すでにメモリ確保された領域が存在するものとして、ＣＰＵ２１は次に前のメモリ解放情報レジスタ２２Ｆに保持されている最大の空き容量を参照し、今回のメモリ確保サイズＳの方が大きいか否かにより、当該位置を確保できるかどうかを判断する（ステップＳ５０８）。
【０１１１】
ここで今回のメモリ確保サイズＳの方が小さいと判断すると、探索番号を示す変数ｍに前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号を設定すると共に、探索開始番号を示す変数Ｚに上記変数ｍの値を設定する（ステップＳ５０９）。
【０１１２】
さらにＣＰＵ２１は、前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号を「０」とすることで、今回使用したことによるクリア設定を行なう（ステップＳ５１０）。
【０１１３】
また上記ステップＳ５０８で前のメモリ解放情報レジスタ２２Ｆの保持内容の最大の空き容量を参照し、今回のメモリ確保サイズＳの方が大きいと判断した場合には、上記ステップＳ５０９と同様に、探索番号を示す変数ｍに前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号を設定すると共に、この探索開始番号を示す変数Ｚに上記変数ｍの値を設定する（ステップＳ５１１）。
【０１１４】
上記ステップＳ５１０またはＳ５１１の処理後、探索番号を示す変数ｍの次のメモリ確保番号を変数ｎとして設定する（ステップＳ５１２）。
【０１１５】
そして、探索番号ｍと次のｎまでの空き容量Δを、次式  
(I:メモリ確保番号ｍのメモリアドレスが探索変更アドレスＢよりも小さい場合)  
(I-1:次のメモリ確保番号ｎが「０」(データがなく、メモリ番号ｍが最後尾)の場合)  
空き容量Δ＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−メモリ確保番号ｍのメモリアドレス−メモリ確保番号ｍのサイズ  
…(4-1)  
(I-2:次のメモリ確保番号ｎが探索方向変更アドレスＢよりも大きい場合)  
空き容量Δa＝探索方向変更アドレスＢ−メモリ確保番号ｍのメモリアドレス  
−メモリ確保番号ｍのサイズ  
空き容量Δb＝先頭メモリ確保番号のメモリアドレス−メモリ確保領域開始アドレスＡ  
上記ΔaとΔbのうちの大きい方を空き容量Δとする                        …(4-2)  
(I-3:上記以外)  
空き容量Δ＝メモリ確保番号ｎのメモリアドレス−メモリ確保番号ｍのメモリアドレス  
−メモリ確保番号ｍのサイズ                                …(4-3)  
(II:メモリ確保番号ｍのメモリアドレスが探索変更アドレスＢ以上の場合)  
(II-1:次のメモリ確保番号ｎが「０」(データがなく、メモリ番号ｍが最後尾)の場合)  
空き容量Δ＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−メモリ確保番号ｍのメモリアドレス−メモリ確保番号ｍのサイズ  
…(4-4)  
(II-2:上記以外)  
空き容量Δ＝メモリ確保番号ｎのメモリアドレス−メモリ確保番号ｍのメモリアドレス  
−メモリ確保番号ｍのサイズ                                …(4-5)  
として算出する（ステップＳ５１３）。
【０１１６】
その後にＣＰＵ２１は、算出した空き容量Δが、今回確保するメモリのサイズＳよりも大きいか否かを判断する（ステップＳ５１４）。
【０１１７】
ここで算出した空き容量Δが今回確保するメモリのサイズＳよりも大きいと判断すると、ＣＰＵ２１はメモリ確保情報を示す変数ａ，ｍ，ｎの値を書き換える（ステップＳ５１５）。すなわち、  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来はｎ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝ｎ  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄのｎ番目の前のメモリ確保番号（本来はｍ）に変数ａの値を設定する。
【０１１８】
これにより、メモリ確保領域の物理的な順序は、  
「メモリ確保領域ｍ→メモリ確保領域ｎ」の状態から、  
「メモリ確保領域ｍ→メモリ確保領域ａ→メモリ確保領域ｎ」の状態となる。
【０１１９】
但し、次のメモリ確保番号ｎが「０」（データなし）であり、メモリ確保番号ｍが前のメモリ確保情報レジスタ２２Ｅの最後尾である場合には、以下のようにする。すなわち  
(III:上記式（４−１）、（４−４）の場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来はｎ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝０(最後尾)  
とする。
【０１２０】
(IV:上記式（４−２）で空き容量Δbを選択した場合)  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保領域開始アドレスＡ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０(先頭)  
・次のメモリ確保番号＝先頭メモリ確保番号レジスタ２２Ａのメモリ確保番号  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄの番号を先頭メモリ確保番号レジスタ２２Ａのメモリ確保番号とした情報の前のメモリ確保番号（本来は０）に変数ａの値を設定する。
【０１２１】
(VI:次のメモリ確保番号ｎのメモリアドレスが探索変更アドレスＢ以上の場合)  
(VI-1:上記空き容量Δaの方が同Δbより大きい場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来はｎ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝ｎ  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄのｎ番目の前のメモリ確保番号（本来はｍ）に変数ａの値を設定する。
【０１２２】
(VI-2:上記空き容量Δbの方が同Δaより大きい場合)  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保領域開始アドレスＡ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０  
・次のメモリ確保番号＝先頭メモリ確保番号レジスタ２２Ａの値  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄの番号を先頭メモリ確保番号レジスタ２２Ａのメモリ確保番号とした情報の前のメモリ確保番号（本来は０）に変数ａの値を設定する。
【０１２３】
(VI-3:上記以外の場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来はｎ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝ｎ  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄのｎ番目の前のメモリ確保番号（本来はｍ）に変数ａの値を設定する。
【０１２４】
(VII:メモリ確保番号ｍのメモリアドレスが探索変更アドレスＢ以上の場合)  
(VII-1:次のメモリ確保番号ｎが「０」(データがなく、メモリ番号ｍが最後尾)の場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来は０）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝０  
とする。
【０１２５】
(VII-2:上記以外の場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来はｎ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス＋メモリ確保番号ｍのサイズ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝ｎ  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄのｎ番目の前のメモリ確保番号（本来はｍ）に変数ａの値を設定する。
【０１２６】
また、ＣＰＵ２１は、メモリ確保番号ａのアドレスと、探索方向変更アドレスＢ以降の先頭メモリ確保番号のアドレスとを比較し、メモリ確保番号ａのアドレスの方が小さい場合で、かつ、メモリ確保番号ａのアドレスと、探索方向変更アドレスＢと比較し、メモリ確保番号ａのアドレスが大きい場合には、探索方向変更アドレスＢ以降の先頭メモリ確保番号を変数ａの値に書き換える。
【０１２７】
上記ステップＳ５１５の処理後、ＣＰＵ２１は、メモリ確保が成功したものとして、前のメモリ確保情報レジスタ２２Ｅの保持内容を書き換えると共に、メモリ確保番号に上記変数ａの値を設定する（ステップＳ５１６）。
【０１２８】
さらにＣＰＵ２１は、このあらたに設定した変数ａで示されるメモリ確保番号の前に位置するメモリ確保番号が「０」であるか否かを判断する（ステップＳ２１７）。
【０１２９】
ここで変数ａで示されるメモリ確保番号の前に位置するメモリ確保番号が「０」となると判断した場合にのみ、先頭メモリ確保番号レジスタ２２Ａに変数ａの値を設定した上で（ステップＳ５１８）、今回確保したアドレスをＣＰＵ２１に返して、実際のメモリ確保が実行される。
【０１３０】
また上記ステップＳ５１４において、算出した空き容量Δが今回確保するメモリのサイズＳよりも大きくないと判断した場合、その時点の次のメモリ確保番号を示す変数ｎの値が「０」であるか否かにより、次のメモリ確保番号でのメモリ領域を用いることが可能か否かを判断する（ステップＳ５１９）。
【０１３１】
ここで変数ｎの値が「０」であると判断した場合、データがなく、メモリ確保番号ｍ自体がメモリ確保領域２２Ｇの最後尾であるため、ＣＰＵ２１はあらたな確保を行なうことができないと判断し、確保の失敗（エラー）として、この図１８及び図１９の処理を終了する。
【０１３２】
また上記ステップＳ５１９で変数ｎの値が「０」ではないと判断した場合、次にＣＰＵ２１は、探索番号の変数ｍに対応するメモリ確保領域のアドレスが探索方向変更アドレスＢより小さく、且つ変数ｎで示される次のメモリ確保領域のアドレスが探索方向変更アドレスＢより大きいか否かを判断する（ステップＳ５２０）。
【０１３３】
ここで探索番号の変数ｍに対応するメモリ確保領域のアドレスが探索方向変更アドレスＢより小さく、且つ変数ｎで示される次のメモリ確保領域のアドレスが探索方向変更アドレスＢより大きいと判断した場合、ＣＰＵ２１は先頭メモリ確保番号レジスタ２２Ａの保持内容を探索番号の変数ｍの値としてあらためて設定する（ステップＳ５２１）。
【０１３４】
また上記ステップＳ５２０で探索番号の変数ｍに対応するメモリ確保領域のアドレスが探索方向変更アドレスＢ以上であるか、または変数ｎで示される次のメモリ確保領域のアドレスが探索方向変更アドレスＢより小さいと判断した場合、ＣＰＵ２１はその時点で次のメモリ確保番号として保持している変数ｎの値を探索番号の変数ｍの値としてあらためて設定する（ステップＳ５２２）。
【０１３５】
上記ステップＳ５２１またはＳ５２２の処理後、ＣＰＵ２１は探索開始番号を示す変数Ｚの値が上記探索番号の変数ｍの値と等しいか否かを判断する（ステップＳ５２３）。
【０１３６】
ここで変数Ｚの値が上記探索番号の変数ｍの値とが等しくないと判断した場合には、上記ステップＳ５１２からの処理に戻り、メモリ確保の探索番号の変数ｍに基づいて次の番号ｎの再設定処理を行なった上で、再度のメモリ確保に関する処理を続行する。
【０１３７】
また上記ステップＳ５２３において変数Ｚの値が上記探索番号の変数ｍの値とが等しいと判断した場合、探索方向変更アドレスＢ以降の先頭メモリ確保番号情報レジスタ２２Ｂを確認し、当該番号が「０」であるか否かを判断する（ステップＳ５２４）。
【０１３８】
ここで探索方向変更アドレスＢ以降の先頭メモリ確保番号情報レジスタ２２Ｂが「０」であった場合、あらたな確保を行なうことができず、確保の失敗（エラー）として、この図１８及び図１９の処理を終了する。
【０１３９】
また上記ステップＳ５２４において、先頭メモリ確保番号情報レジスタ２２Ｂが「０」ではなかった場合、ＣＰＵ２１は、現在の探索位置から先頭メモリ確保番号情報レジスタ２２Ｂを上記探索番号の変数ｍに設定した上で（ステップＳ５２５）、上記ステップＳ５１２からの処理に戻り、メモリ確保の探索番号の変数ｍに基づいて次の番号ｎの再設定処理を行なった上で、再度のメモリ確保に関する処理を続行する。
【０１４０】
次に上記図１７のステップＳ４０２において、確保しようとするデータの領域サイズが予め設定された容量より大きいと判断した場合の処理について説明する。  
図２０は、大きいサイズ用のメモリ確保の処理内容を示すフローチャートである。その処理当初に、ＣＰＵ２１はメモリ確保情報テーブルレジスタ２２Ｄで空いているものがあるか否かを判断する（ステップＳ６０１）。サイズが「０」となっているテーブルは、使用していないテーブルとして取扱う。  
ここで空いているテーブルがないと判断した場合には、メモリ確保の数が多すぎてあらたな確保を行なうことができないため、確保の失敗（エラー）として、この図２０の処理を終了する。
【０１４１】
上記ステップＳ６０１でメモリ確保情報テーブルレジスタ２２Ｄの内容から空いているものがある（サイズが「０」のテーブルがある）と判断した場合、ＣＰＵ２１は次いで空いているメモリ確保番号の中から、例えば最も小さい値「１」を変数ａに設定する（ステップＳ６０２）。
【０１４２】
次にＣＰＵ２１は、最後尾メモリ確保情報レジスタ２２Ｃの内容を確認し、その内容が「０」であるか否かを判断する（ステップＳ６０３）。ここで最後尾メモリ確保情報レジスタ２２Ｃの内容が「０」であると判断した場合、メモリ確保が１つも残っていないものとして、探索番号を示す変数ｍを「１」、次の探索番号を示す変数ｎを「０」（有効データなし）、メモリ探察開始番号の変数Ｚを「１」として設定する（ステップＳ６０４）。
【０１４３】
その後にＣＰＵ２１は、メモリ確保領域２２ＧのサイズＷを空き容量Δとして、その空き容量Δが、今回確保しようとしているメモリサイズＳより大きいか否かを判断する（ステップＳ６０５）。
【０１４４】
ここで空き容量Δが今回確保しようとしているメモリサイズＳ以下であると判断した場合には、メモリ確保が困難であるため、確保の失敗（エラー）として、この図２０の処理を終了する。
【０１４５】
また上記ステップＳ６０５で空き容量Δが今回確保しようとしているメモリサイズＳより大きいと判断した場合、ＣＰＵ２１はメモリ確保番号１（＝ａ）の値、前のメモリ確保情報レジスタ２２Ｅの値、先頭メモリ確保番号レジスタ２２Ａの値、最後尾メモリ確保情報レジスタ２２Ｃの値、探索方向変更アドレス以降の先頭メモリ確保番号の値を以下のように書き換える（ステップＳ６０６）。すなわち  
メモリ確保情報テーブルレジスタ２２Ｄの１番目のテーブルについて、  
・アドレス＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０  
・次のメモリ確保番号＝０  
とすると共に、  
前のメモリ確保番号＝１  
先頭メモリ確保番号＝１  
最後尾メモリ確保番号＝１  
探索方向変更アドレス以降の先頭メモリ確保番号＝１  
とした上で、今回確保したアドレスをＣＰＵ２１に返して、実際のメモリ確保を実行する。
【０１４６】
また上記ステップＳ６０３において、最後尾メモリ確保情報レジスタ２２Ｃの内容が「０」ではないと判断した場合、少なくとも１つはメモリ確保がなされているものとして、ＣＰＵ２１はその時点で最後尾メモリ確保情報レジスタ２２Ｃに保持されている値を読出して探索番号の値ｍに設定する（ステップＳ６０７）。
【０１４７】
その上でＣＰＵ２１は、探索するテーブルのメモリ確保情報番号をｍとして、前のメモリ確保情報番号ｐまでの空き容量Δを、以下のようにして求める。すなわち、  
(VIII:最後尾メモリ確保番号が「０」の(１つも確保していない)場合)  
空き容量Δ＝メモリ確保領域のサイズＷとする。
【０１４８】
(IX:探索するメモリ確保番号ｍが最後尾メモリ確保番号の(１回目の探索である)場合)  
(IX-1:前のメモリ確保情報ｐが「０」ではない場合)  
空き容量Δa＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−メモリ確保番号ｍのアドレス−メモリ確保番号ｍのサイズ  
Δb＝メモリ確保番号ｍのアドレス−メモリ確保番号ｐのアドレス  
−メモリ確保番号ｐのサイズ  
としてΔaとΔbの大きい方を空き容量Δとする。
【０１４９】
(IX-2:前のメモリ確保情報ｐが「０」の場合)  
空き容量Δa＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−メモリ確保番号ｍのアドレス−メモリ確保番号ｍのサイズ  
Δb＝メモリ確保番号ｍのアドレス−メモリ確保領域開始アドレスＡ  
としてΔaとΔbの大きい方を空き容量Δとする。
【０１５０】
(X:上記VIII〜IX以外で、前のメモリ確保番号ｐが「０」の場合)  
空き容量Δ＝メモリ確保番号ｍのアドレス−メモリ確保領域開始アドレスＡ  
とする。
【０１５１】
(XI:上記VIII〜X以外の場合)  
空き容量Δ＝メモリ確保番号ｍのアドレス−メモリ確保番号ｐのアドレス  
−メモリ確保番号ｐのサイズ  
とする。
【０１５２】
上記のようにして求めた空き容量Δを用い、ＣＰＵ２１は空き容量Δが今回のメモリ確保サイズＳより大きいか否か、すなわちメモリ確保が可能か否かを判断する（ステップＳ６１０）。
【０１５３】
ここで空き容量Δが今回のメモリ確保サイズＳより大きく、メモリ確保が可能であると判断した場合、ＣＰＵ２１は今回のメモリ確保サイズＳのメモリ確保を実行するために、上記ステップＳ６０２で設定したメモリ確保番号ａ、メモリ確保番号ｍ、メモリ確保番号ｐの各変数を以下のように書き換える（ステップＳ６１１）。すなわち、  
(XII:最後尾メモリ確保番号が「０」の(１つも確保していない)場合)  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
・          −今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０  
・次のメモリ確保番号＝０  
とする。
【０１５４】
(XIII:探索するメモリ確保番号ｍが最後尾メモリ確保番号である場合)  
(XIII-1:メモリ確保番号ｐが「０」ではない場合)  
(XIII-1-1:上記IX-1で空き容量Δaの方が空き容量Δbよりも大きい場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来は０）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝０  
とする。
【０１５５】
(XIII-1-2:上記IX-1で空き容量Δbの方が空き容量Δaよりも大きい場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｐ番目のテーブルの次のメモリ確保番号（本来はｍ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｐ  
・次のメモリ確保番号＝ｍ  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄのｍ番目の前のメモリ確保番号（本来はｐ）に変数ａの値を設定する。
【０１５６】
(XIII-2:前のメモリ確保番号ｐが「０」の場合)  
(XIII-2-1:上記IX-1で空き容量Δaの方が空き容量Δbよりも大きい場合)  
メモリ確保情報テーブルレジスタ２２Ｄのｍ番目のテーブルの次のメモリ確保番号（本来は０）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保領域開始アドレスＡ＋メモリ確保領域のサイズＷ  
−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｍ  
・次のメモリ確保番号＝０  
とする。
【０１５７】
(XIII-2-2:上記IX-1で空き容量Δbの方が空き容量Δaよりも大きい場合)  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０  
・次のメモリ確保番号＝ｍ  
とし、メモリ確保情報テーブルレジスタ２２Ｄのｍ番目の前のメモリ確保番号（本来は０）に変数ａの値を設定する。
【０１５８】
(XIV:前のメモリ確保番号ｐが「０」の場合)  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝０  
・次のメモリ確保番号＝ｍ  
とし、メモリ確保情報テーブルレジスタ２２Ｄのｍ番目の前のメモリ確保番号（本来は０）に変数ａの値を設定する。
【０１５９】
(XV:上記以外の場合)  
空き容量Δ＝メモリ確保番号ｍのアドレス−メモリ確保番号ｐのアドレス  
−メモリ確保番号ｐのサイズ  
とし、メモリ確保情報テーブルレジスタ２２Ｄのｐ番目のテーブルの次のメモリ確保番号（本来はｍ）に変数ａの値を設定し、  
メモリ確保情報テーブルレジスタ２２Ｄのａ番目のテーブルについて、  
・アドレス＝メモリ確保番号ｍのアドレス−今回のメモリ確保サイズＳ  
・サイズ  ＝今回のメモリ確保サイズＳ  
・前のメモリ確保番号＝ｐ  
・次のメモリ確保番号＝ｍ  
とし、さらにメモリ確保情報テーブルレジスタ２２Ｄのｍ番目の前のメモリ確保番号（本来はｐ）に変数ａの値を設定する。
【０１６０】
上記ステップＳ６１１での処理により、メモリ確保領域の物理的な確保順序は、それ以前の  
「メモリ確保番号ｐ→メモリ確保番号ｍ」から、  
「メモリ確保番号ｐ→メモリ確保番号ａ→メモリ確保番号ｍ」となる。
【０１６１】
その後、上記ステップＳ６０６の処理に進んで、ＣＰＵ２１はメモリ確保番号１（＝ａ）の値、前のメモリ確保情報レジスタ２２Ｅの値、先頭メモリ確保番号レジスタ２２Ａの値、最後尾メモリ確保情報レジスタ２２Ｃの値、探索方向変更アドレス以降の先頭メモリ確保番号の値を書き換え、今回確保したアドレスをＣＰＵ２１に返して、実際のメモリ確保を実行する。
【０１６２】
また上記ステップＳ６１０において、空き容量Δが今回のメモリ確保サイズＳ以下であり、メモリ確保ができないと判断した場合、ＣＰＵ２１は次いでその時点で前のメモリ確保情報番号ｐが「０」であるか否かを判断する（ステップＳ６１２）。
【０１６３】
ここで前のメモリ確保情報番号ｐが「０」であった場合、それ以上の確保を行なうことができないため、確保の失敗（エラー）として、この図２０の処理を終了する。
【０１６４】
また上記ステップＳ６１２において前のメモリ確保情報番号ｐが「０」ではないと判断した場合、ＣＰＵ２１はその探索する前のメモリ確保情報番号ｐを用い、テーブルの探索番号ｍを前側に移動するよう設定した上で（ステップＳ６１３）、再び上記ステップＳ６０８からの処理を繰返し実行する。  
上述した如く、確保しようとするデータの領域サイズが予め設定された容量より大きいと判断した場合には、常にメモリ確保領域２２Ｇの最後尾から検索することで、小さい容量で確保されたメモリ領域から離れたアドレス位置から探索できるため、迅速にメモリ確保できる可能性を高めることができる。
【０１６５】
なお上記動作では示さなかったが、別途さらにサイズが大きい場合用の第２の「前のメモリ確保情報」を設定してその内容を利用することも考えられる。
【０１６６】
次に上記図１７のステップＳ４０１において、メモリ２２のメモリ確保領域２２Ｇに対する解放の要求があると判断した場合、ＣＰＵ２１は図２１に処理を実行する。  
図２１においては、処理当初にメモリ確保情報テーブルレジスタ２２Ｄでメモリアドレスを検索し、与えられたメモリ解放アドレスに該当するメモリ確保番号ｒを取得する（ステップＳ７０１）。
【０１６７】
次にＣＰＵ２１は、上記ステップＳ７０１で得たメモリ確保番号ｒにより、メモリ確保情報テーブルレジスタ２２Ｄのｒ番目のテーブルのアドレスが、探索方向変更アドレスＢより小さいか否かを判断する（ステップＳ７０２）。
【０１６８】
ここでｒ番目のテーブルのアドレスが、探索方向変更アドレスＢより小さく、メモリ確保領域開始アドレスＡと探索方向変更アドレスＢで規定される範囲内にあると判断した場合、次にＣＰＵ２１は前のメモリ解放情報レジスタ２２Ｆに保持される、前に解放したメモリ領域のサイズ（最大の空き容量）より、今回のｒ番目のテーブルで保持するサイズの方が大きいか否かを判断する（ステップＳ７０３）。
【０１６９】
このときに今回解放しようとしているメモリ確保番号ｒの領域のサイズの方が大きいと判断した場合にのみ、ＣＰＵ２１はメモリ確保番号ｒの領域のサイズを用いて前のメモリ解放情報レジスタ２２Ｆの最大の空き容量を書き換える（ステップＳ７０４）。
【０１７０】
次に、前のメモリ解放情報レジスタ２２Ｄのメモリ確保番号が「０」であるか否かを判断する（ステップＳ７０５ａ）。
【０１７１】
前のメモリ解放情報レジスタ２２Ｄのメモリ確保番号が「０」ではなかった場合、その後にＣＰＵ２１は、前のメモリ解放情報レジスタ２２Ｄのメモリ確保番号に該当するアドレス値より、メモリ確保番号ｒのアドレス値の方が小さいか否かを判断する（ステップＳ７０５ｂ）。
【０１７２】
また上記ステップＳ７０５ａにおいて、前のメモリ解放情報レジスタ２２Ｄのメモリ確保番号が「０」であった場合、ＣＰＵ２１は上記ステップＳ７０５ｂの処理をスキップして、ステップＳ７０６へ飛ぶ。
【０１７３】
前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号に該当するアドレス値より、メモリ確保番号ｒのアドレス値の方が小さいと判断した場合、ＣＰＵ２１はさらにメモリ確保番号ｒの前のメモリ確保番号が「０」であるか否かを判断する（ステップＳ７０６）。
【０１７４】
メモリ確保番号ｒの前のメモリ確保番号が「０」ではなかった場合、ＣＰＵ２１はメモリ確保番号ｒの前のメモリ確保番号を用いて、前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号を書き換える（ステップＳ７１０）。
【０１７５】
また上記ステップＳ７０６において、メモリ確保番号ｒの前のメモリ確保番号が「０」であった場合、次にＣＰＵ２１はメモリ確保番号ｒの次のメモリ確保番号が「０」であるか否かを判断する（ステップＳ７０７）。
【０１７６】
メモリ確保番号ｒの次のメモリ確保番号が「０」ではなかった場合、ＣＰＵ２１は次のメモリ解放情報のメモリ確保番号を用いて、前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号を書き換える（ステップＳ７０９）。
【０１７７】
また上記ステップＳ７０７において、メモリ確保番号ｒの次のメモリ確保番号が「０」であった場合、ＣＰＵ２１はメモリ確保されている残りがないものとして、前のメモリ解放情報レジスタ２２Ｆに関する内容をすべてクリアする（ステップＳ７０８）。
【０１７８】
上記ステップＳ７０２でｒ番目のテーブルのアドレスが探索方向変更アドレスＢ以上であり、メモリ確保領域開始アドレスＡと探索方向変更アドレスＢで規定される範囲外にｒ番目のメモリ確保領域があると判断した場合、上記ステップＳ７０５で前のメモリ解放情報レジスタ２２Ｆのメモリ確保番号のアドレス値がメモリ確保番号ｒのアドレス値以上であると判断した場合、または上記ステップＳ７１０またはステップＳ７０９またはステップＳ７０８での処理実行後、ＣＰＵ２１はメモリ確保番号ｒの前のメモリ確保番号をｔ、次のメモリ確保番号をｕとすると、以下のように書き換えて、メモリ確保情報テーブルレジスタ２２Ｄからメモリ確保番号ｒのデータを削除する（ステップＳ７１１）。すなわち、  
・メモリ確保番号ｒの前のメモリ確保番号をｔ、次のメモリ確保番号をｕとして、  
・メモリ確保番号ｒのテーブルのクリア  
・メモリ確保番号ｔの次のメモリ確保番号＝ｕ  
・メモリ確保番号ｕの前のメモリ確保番号＝ｔ  
の各処理を一括して実行し、今回のメモリ確保領域２２Ｇのメモリ確保番号ｒに該当するメモリ確保領域の解放が実行される。
【０１７９】
したがって、図１６に示した如く、確保しようとしている領域のサイズが予め設定した値より小さい場合には、メモリ確保領域開始アドレスＡと探索方向変更アドレスＢとで規定される範囲を優先し、その前に解放したメモリ領域の情報を参照して、例えば図中に矢印Ｓ１１で示すように探索開始位置のアドレスから探索方向変更アドレスＢに向けて探索し、適切な解放領域がない場合には、さらに矢印Ｓ１２で示すようにメモリ確保領域開始アドレスＡから上記最初の探索開始位置のアドレスまでを探索する。そして、それでもまだ適切な解放領域がない場合には、矢印Ｓ１３で示すように探索方向変更アドレスＢからメモリ確保領域のサイズＷの最後尾アドレスに向けて探索を行なうものとなる。
【０１８０】
一方で、確保しようとしている領域のサイズが予め設定した値より大きい場合には、図中に矢印Ｓ２１で示すように、上記メモリ確保領域開始アドレスＡと探索方向変更アドレスＢとで規定される範囲とは反対側にある、メモリ確保領域のサイズＷの最後尾側のアドレスから順次探索を行なう。そのため、大きな確保領域が必要である場合でも確実、且つ軸即に確保を行なう領域の情報を取得することができる。
【０１８１】
以上詳述した如く本実施形態によれば、メモリ確保領域２２Ｇをメモリ確保領域開始アドレスＡから探索方向変更アドレスＢまでの領域とそれ以降の領域とに区分設定した上で、確保しようとしているサイズが予め設定したサイズより小さい場合には、上記第１の実施形態と同様に、上記メモリ確保領域開始アドレスＡと探索方向変更アドレスＢで規定される領域の範囲を優先して、直前に確保または解放したメモリ確保領域の位置を参照し、次に確保する位置を探索するよう制御する。
【０１８２】
一方で、確保しようとしているサイズが予め設定したサイズより大きい場合には、メモリ確保領域２２Ｇの上記メモリ確保領域開始アドレスＡと探索方向変更アドレスＢで規定される領域の範囲とは反対側にある、最後尾側から確保する位置を探索するよう制御するようにしたので、限られたメモリ空間を効率的に活用しつつ、確保するデータのサイズに適応してよりさらに高速なアクセスを実現することが可能となる。
【０１８３】
その他、本発明は上述した実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。また、上述した実施形態で実行される機能は可能な限り適宜組み合わせて実施しても良い。上述した実施形態には種々の段階が含まれており、開示される複数の構成要件による適宜の組み合せにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、効果が得られるのであれば、この構成要件が削除された構成が発明として抽出され得る。
【０１８４】
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。  
請求項１記載の発明は、データを確保するための領域を有するメモリと、上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持する情報テーブル保持手段と、上記メモリで直前に確保したデータの情報を保持する前確保情報保持手段と、上記メモリで直前に解放したデータの情報を保持する前解放情報保持手段と、上記情報テーブル保持手段の保持するテーブルを参照し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御手段とを具備したことを特徴とする。
【０１８５】
請求項２記載の発明は、上記請求項１記載の発明において、上記メモリ制御手段は、確保しようとする領域が予め設定したサイズより大きいか否かを判断し、予め設定したサイズより大きくないと判断した場合には、上記メモリの一方の端部から所定の範囲内を優先し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて次にデータを確保する領域を探索し、予め設定したサイズより大きいと判断した場合には、上記メモリの他方の端部から次にデータを確保する領域を探索することを特徴とする。
【０１８６】
請求項３記載の発明は、上記請求項１または２記載の発明において、上記情報テーブル保持手段は、上記メモリ内においてデータを確保した領域の先頭アドレスと、確保したデータのサイズと、当該確保したデータの前に確保した情報テーブルの番号と、当該確保したデータの次に確保した情報テーブルの番号とを保持することを特徴とする。
【０１８７】
請求項４記載の発明は、上記請求項１または２記載の発明において、上記前確保情報保持手段は、上記メモリで直前に確保したデータの情報をテーブル化して保持する上記情報テーブル保持手段のテーブル番号を保持することを特徴とする。
【０１８８】
請求項５記載の発明は、上記請求項１または２記載の発明において、上記前解放情報保持手段は、上記メモリで直前に解放したデータの情報をテーブル化して保持していた上記情報テーブル保持手段のテーブル番号の前に確保した情報テーブルの番号、または次に確保した情報テーブルの番号のいずれか一方と、解放したデータの最大サイズとを保持することを特徴とする。
【０１８９】
請求項６記載の発明は、データを確保するための領域を有するメモリを備えた装置でのメモリ制御方法であって、上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持させる情報テーブル保持工程と、上記メモリで直前に確保したデータの情報を保持させる前確保情報保持工程と、上記メモリで直前に解放したデータの情報を保持させる前解放情報保持工程と、上記情報テーブル保持工程で保持したテーブルを参照し、上記前確保情報保持工程及び上記前解放情報保持工程での各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御工程とを有したことを特徴とする。
【０１９０】
請求項７記載の発明は、上記請求項６記載の発明において、上記メモリ制御工程は、確保しようとする領域が予め設定したサイズより大きいか否かを判断し、予め設定したサイズより大きくないと判断した場合には、上記メモリの一方の端部から所定の範囲内を優先し、上記前確保情報保持工程及び上記前解放情報保持工程での各保持内容に基づいて次にデータを確保する領域を探索し、予め設定したサイズより大きいと判断した場合には、上記メモリの他方の端部から次にデータを確保する領域を探索することを特徴とする。
【０１９１】
請求項８記載の発明は、データを確保するための領域を有するメモリを備えた装置が内蔵したコンピュータが実行するプログラムであって、上記コンピュータを、上記メモリに確保されたデータに関するアクセス単位の情報をテーブル化して保持する情報テーブル保持手段、上記メモリで直前に確保したデータの情報を保持する前確保情報保持手段、上記メモリで直前に解放したデータの情報を保持する前解放情報保持手段、及び上記情報テーブル保持手段の保持するテーブルを参照し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて、次に上記メモリにデータを確保する領域を探索するメモリ制御手段として機能させることを特徴とする。
【０１９２】
請求項９記載の発明は、上記請求項８記載の発明において、上記メモリ制御手段は、確保しようとする領域が予め設定したサイズより大きいか否かを判断し、予め設定したサイズより大きくないと判断した場合には、上記メモリの一方の端部から所定の範囲内を優先し、上記前確保情報保持手段及び上記前解放情報保持手段の各保持内容に基づいて次にデータを確保する領域を探索し、予め設定したサイズより大きいと判断した場合には、上記メモリの他方の端部から次にデータを確保する領域を探索することを特徴とする。
【符号の説明】
【０１９３】
１１…ＣＰＵ、１２…メモリ、１２Ａ…先頭メモリ確保番号レジスタ、１２Ｂ…メモリ確保情報テーブルレジスタ、１２Ｃ…前のメモリ確保情報レジスタ、１２Ｄ…前のメモリ解放情報レジスタ、１２Ｅ…メモリ確保領域、２１…ＣＰＵ、２２…メモリ、２２Ａ…先頭メモリ確保番号レジスタ、２２Ｂ…第２先頭メモリ確保番号レジスタ、２２Ｃ…最後尾メモリ確保情報レジスタ、２２Ｄ…メモリ確保情報テーブルレジスタ、２２Ｅ…前のメモリ確保情報レジスタ、２２Ｆ…前のメモリ解放情報レジスタ、２２Ｇ…メモリ確保領域。
【図１】
2014238767.tif 000003
【図２】
2014238767.tif 000004
【図３】
2014238767.tif 000005
【図４】
2014238767.tif 000006
【図５】
2014238767.tif 000007
【図６】
2014238767.tif 000008
【図７】
2014238767.tif 000009
【図８】
2014238767.tif 000010
【図９】
2014238767.tif 000011
【図１０】
2014238767.tif 000012
【図１１】
2014238767.tif 000013
【図１２】
2014238767.tif 000014
【図１３】
2014238767.tif 000015
【図１４】
2014238767.tif 000016
【図１５】
2014238767.tif 000017
【図１６】
2014238767.tif 000018
【図１７】
2014238767.tif 000019
【図１８】
2014238767.tif 000020
【図１９】
2014238767.tif 000021
【図２０】
2014238767.tif 000022
【図２１】
2014238767.tif 000023