以下に、本発明にかかる記憶領域管理方法、記憶領域割当プログラム、ガベージコレクション処理プログラム、記憶領域管理プログラム、およびメッセージ管理プログラムの実施の形態を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
図1は、この発明にかかる記憶領域管理方法が適用されるメモリプールの構成の一例を示す概念図である。この発明にかかる記憶領域管理方法が適用されるメモリプールは、メモリを共有するシステム内に1つのシステムメモリプール(System Memory Pool)1を備えている。システムメモリプール1はn(1<n,nは自然数)のべき乗のサイズ(この場合は、32バイト、64バイト、128バイト、256バイト、512バイト、1024バイト、2048バイトの7つのサイズ)のサブメモリプール(Sub-Memory Pool)2〜8を備えている。ただし、システムメモリプール数は、本発明において1つに限るものではない。
サブメモリプール2〜8は、32バイト、64バイト、128バイト、256バイト、512バイト、1024バイト、2048バイトのメモリブロックをプールする。図1では、サブメモリプール2には未使用(FREE)の32バイトのメモリブロック(Memory Block)9が2つプールされ、サブメモリプール6には未使用の512バイトのメモリブロック(Memory Block)13が1つプールされ、サブメモリプール7には未使用の1024バイトのメモリブロック(Memory Block)14が2つプールされ、サブメモリプール8には未使用の2048バイトのメモリブロック(Memory Block)15が4つプールされており、サブメモリプール3〜5には未使用の64,128,256バイトのメモリブロックのプールがない状態を示している。
以下に説明する実施の形態では、図1に示したように、システムメモリプール1を2のべき乗(32,64,128,256,512,1024,2048)バイトのメモリブロック単位で管理して、メモリブロックを分割、あるいは組み立てることにより、サブメモリプール2〜8の間でメモリブロックの交換(割り当て・取得)を行う。
実施の形態1.
図1〜図5を用いてこの発明の実施の形態1を説明する。この実施の形態1では、ユーザから要求されたメモリサイズのメモリブロックを提供する(メモリ割り当て)際の記憶領域管理方法について説明する。
図2は、この発明にかかる実施の形態1の記憶領域管理方法が適用される記憶領域管理装置の構成を示すブロック図である。図2に示した記憶領域管理装置は、図1に示したシステムメモリプール1として用いられる物理メモリであるメモリ40(特許請求の範囲でいうところの記憶装置)と、メモリ40の管理に必要な情報を記憶するサイズ管理テーブル31およびサブメモリプール管理テーブル32を有する情報テーブル30と、メモリ割当処理部20とを備えている。
メモリ割当処理部20は、メモリ要求によってユーザから要求されたメモリサイズのメモリブロックがサブメモリプール2〜8にプールされているか否かを判定するとともに、要求されたメモリサイズのメモリブロックをユーザに提供するメモリ割当部21と、サブメモリプール3〜8から処理対象サブメモリプールを選択するサブメモリプール切替部22と、処理対象サブメモリプールにメモリブロックがプールされているか否かを判定するメモリプール判定部23と、処理対象サブメモリプールを切り替えるためのメモリ要求を生成するメモリブロック要求部26と、処理対象サブメモリプールにプールされているメモリブロックを1つメモリサイズの小さいメモリブロックに分割するメモリ分割部24と、メモリ分割部24によって分割されたメモリブロックをサブメモリプール2〜7にプールするメモリプール部25とを備えている。
なお、特許請求の範囲でいうところのサブメモリプール選択処理ステップの機能をサブメモリプール切替部22、メモリプール判定部23、およびメモリブロック要求部26が実現し、特許請求の範囲でいうところのメモリ分割処理ステップの機能をサブメモリプール切替部22、メモリプール判定部23、メモリ分割部24、およびメモリプール部25が実現し、特許請求の範囲でいうところのメモリ割当ステップの機能をメモリ割当部21が実現している。
図3を参照して、サイズ管理テーブル31およびサブメモリプール管理テーブル32に登録される情報と、メモリ40との関係を説明する。メモリ40は、32、64、128、256、512、1024、2048バイトのメモリブロック単位でユーザに提供され、サイズ管理テーブル31およびサブメモリプール管理テーブル32によって管理される。図3では、メモリブロック(フリーメモリ)51〜53が未使用であり、メモリブロック61〜63が使用中となっている。
1024バイトのメモリブロックは2048バイトのメモリブロックを1/2に分割して生成され、512バイトのメモリブロックは1024バイトのメモリブロックを1/2に分割して生成され、256バイトのメモリブロックは512バイトのメモリブロックを1/2に分割して生成され、128バイトのメモリブロックは256バイトのメモリブロックを1/2に分割して生成され、64バイトのメモリブロックは128バイトのメモリブロックを1/2に分割して生成され、32バイトのメモリブロックは64バイトのメモリブロックを1/2に分割して生成される。
サイズ管理テーブル31は、メモリブロックの使用状態を管理するためのテーブルである。使用状態とは、メモリブロックをユーザが使用中(Using)であるのか、未使用(FREE)であるのかを示す利用状態と、何バイトのメモリブロックであるのか(メモリサイズ)を示すサイズ情報である。
サイズ管理テーブル31には、メモリ40のメモリサイズをサブメモリプール2〜8の最小メモリブロックのメモリサイズで割った数のエントリに対応付けてメモリブロックのサイズ情報および利用状態が登録される。先の図1に示したように、サブメモリプール2〜8の最小メモリブロックのメモリサイズは32バイトである。したがって、図3では、32バイトごとにエントリが作られる。なお、図3では、サイズ管理テーブル31とメモリ40の関係を示すためにB1、B9、B10でその対応関係を示しているが、実際には、32バイトブロックの先頭メモリアドレスに対応付けてメモリブロックのサイズ情報および利用状態が登録される。
図3のメモリブロック51の先頭の32バイトブロック(B1)に対応するサイズ管理テーブル31のエントリ(B1)には、メモリブロック51のメモリサイズおよび現在の利用状態が登録される。メモリブロック51は、256バイトのメモリブロックで現在未使用(FREE)であるので、サイズ管理テーブル31のエントリ(B1)のサイズ情報には256バイトを示す値が登録され、利用状態にはFREEであることを示す値が登録される。
また、メモリブロック61の場合、メモリブロック61の先頭の32バイトブロック(B9)に対応するサイズ管理テーブル31のエントリ(B9)のサイズ情報にはメモリブロック61のメモリサイズを示す値が登録され、利用状態には使用中(Using)であることを示す値が登録される。同様にして、サイズ管理テーブル31には、メモリ40に割り当てられている全てのメモリブロックのサイズ情報および利用状態がメモリブロックの先頭の32バイトブロックに対応するエントリに対応付けて登録される。
メモリブロックの先頭以外の32バイトブロック(B10)に対応付けられるサイズ管理テーブル31のエントリ(例えば、B10)のサイズ情報および利用状態は不定値であり、以前そのメモリアドレスがメモリブロックの先頭であった時の値が残っている。
また、256バイトのメモリブロック51を1/2に分割して2つの128バイトのメモリブロックを生成した場合には、メモリアドレス「0xXXXX0000h」に対応する32バイトブロックのエントリ、およびメモリアドレス「0xXXXX0080h」に対応する32バイトブロックのエントリのサイズ情報に128バイトを示す値が登録され、利用状態にFREEであることを示す値が登録される。
サブメモリプール2〜8にプールされるメモリブロックは、リンク構造で管理される。サブメモリプール管理テーブル32は、リンク構造を管理するテーブルであり、サブメモリプール2〜8に対応付けて、サブメモリプール2〜8にプールされているメモリブロックの先頭メモリアドレス(ポインタ)が登録される。
図3は、サブメモリプール管理テーブル32に3つの256バイトの未使用のメモリブロック(フリーメモリ)51〜53が連結されている例を示している。サブメモリプール管理テーブル32の256バイトフリーメモリアドレスにはメモリブロック52の先頭メモリアドレス「0xXXXX0300h」が登録され、メモリブロック52の先頭32バイトには次に連結される256バイトのメモリブロック53の先頭メモリアドレス「0xXXXX0600h」が登録される。同様にメモリブロック53の先頭32バイトには次の256バイトのメモリブロック51の先頭メモリアドレス「0xXXXX0000h」が登録される。メモリブロック51の後にはメモリブロックが連結されていない。そのため、メモリブロック51の先頭32ビットには、連結されるメモリブロックが存在しないことを示す値、たとえば「NULL」が登録される。なお、ここでは、メモリアドレスとして32ビットを基本に説明しているが、メモリアドレスのビット数はこれに限るものではない。
また、図3では、サブメモリプール2〜4,6〜8にプールされる(対応付けられる)メモリブロックが存在しないので、サブメモリプール管理テーブル32の32バイト、64バイト、128バイト、512バイト、1024バイト、2048バイトフリーメモリアドレスには、メモリブロックが連結されていないことを示す値、たとえば「NULL」が登録される。
なお、図3では、単方向リンクによってサブメモリプール管理テーブル32に連結されるメモリブロックを管理しているが、メモリの割り当てや、メモリ解放にともなうメモリブロックの連結を高速に行なうために、双方向リンクによってサブメモリプール2〜8にプールされるメモリブロックを管理するようにしてもよい。
つぎに、図4のフローチャートを参照して、この発明にかかる実施の形態1の記憶領域管理方法が適用される記憶領域管理装置の動作を説明する。ユーザからのメモリ要求を受けると、メモリ割当部21は、サブメモリプール管理テーブル32を検索して要求されたメモリサイズのメモリブロックがサブメモリプール2〜8に存在するか否か(プールされているか否か)、すなわち要求されたメモリサイズのメモリブロックがサブメモリプール管理テーブル32にリンクされているか否かを判定する(ステップS100,S101)。
要求されたメモリサイズのメモリブロックがサブメモリプール2〜8にプールされている場合、メモリ割当部21は、要求されたメモリサイズのメモリブロックを取得してユーザに提供する(ステップS108)。具体的には、メモリ割当部21は、要求されたメモリサイズに対応するサブメモリプール管理テーブル32のフリーメモリアドレスに登録されているリンクの先頭のメモリブロックのメモリアドレスを取得する。メモリ割当部21は、取得したメモリアドレスが示すメモリブロックの先頭32ビットに登録されている次のリンクのメモリブロックのメモリアドレスを、要求されたメモリサイズに対応するサブメモリプール管理テーブル32のフリーメモリアドレスに登録する。メモリ割当部21は、サブメモリプール管理テーブル32から取得したメモリアドレスに対応するサイズ管理テーブル31のエントリの利用状態に使用中(Using)であることを示す値を登録する。メモリ割当部21は、サブメモリプール管理テーブル32のリンクからデキューしたメモリブロックの先頭メモリアドレスをユーザに通知して、要求されたメモリサイズのメモリブロックをユーザに提供する。
一方、要求されたメモリサイズのメモリブロックがサブメモリプール2〜8にプールされていない場合、メモリ割当部21は、ユーザから要求されたメモリサイズよりも1つ大きいメモリサイズのメモリブロックを要求するメモリ要求をサブメモリプール切替部22に出力する(ステップS102)。
サブメモリプール切替部22は、メモリ要求によって要求されたメモリサイズのメモリブロックをプールするサブメモリプール3〜8を選択し、選択したサブメモリプール3〜8を処理対象サブメモリプールに決定する。すなわち、サブメモリプール切替部22は、メモリ要求によって処理対象サブメモリプールを現在の処理対象サブメモリプールよりも1つ大きいサイズ(この場合は、2倍のサイズ)のサブメモリプール3〜8に切り替える。
つぎに、メモリプール判定部23は、処理対象サブメモリプールにメモリブロックがプールされているか否かを判定する(ステップS103)。処理対象サブメモリプールにメモリブロックがプールされていない場合、メモリプール判定部23は、処理対象サブメモリプールを現在の処理対象サブメモリプールよりも1つサイズの大きいサブメモリプール3〜8に切り替えることをメモリブロック要求部26に要求し、メモリブロック要求部26は、処理対象サブメモリプールにプールされるメモリブロックより1つ大きいメモリサイズのメモリブロックを要求するメモリ要求をサブメモリプール切替部22に出力し、サブメモリプール切替部22は、メモリ要求によって要求されたメモリサイズのメモリブロックをプールするサブメモリプール3〜8を選択して処理対象サブメモリプールに決定する動作を、メモリブロックがプールされている処理対象サブメモリプールを検出するまで繰り返す(ステップS102,S103)。
メモリプール判定部23によって処理対象サブメモリプールにメモリブロックがプールされていると判定された場合、メモリ分割部24は、処理対象サブメモリプールからメモリブロックを1つ取得し、取得したメモリブロックを1/2に分割する(ステップS104)。
具体的には、メモリ分割部24は、処理対象サブメモリプールに対応するサブメモリプール管理テーブル32のフリーメモリアドレスに登録されているリンクの先頭のメモリブロックのメモリアドレスを取得する。メモリ分割部24は、取得したメモリアドレスが示すメモリブロックの先頭32ビットに登録されている次のリンクのメモリブロックのメモリアドレスを、処理対象サブメモリプールに対応するサブメモリプール管理テーブル32のフリーメモリアドレスに登録する。メモリ分割部24は、取得したメモリブロックを1/2に分割して、処理対象サブメモリプールにプールされるメモリブロックのメモリサイズより1つメモリサイズの小さいメモリブロックを2つ生成する。
つぎに、メモリプール部25は、処理対象サブメモリプールのサイズより1つサイズの小さいサブメモリプール2〜7に、メモリ分割部24によって生成された2つのメモリブロックをプールする(ステップS105)。
ここで、図5を参照して、128バイトのメモリブロックを分割して生成された2つのメモリブロック56,57をサブメモリプール3にプールする動作を説明する。図5において最初、64バイトのサブメモリプール3には2つメモリブロック65,66がプールされている。すなわち、サブメモリプール管理テーブル32の64バイトフリーメモリアドレスには、メモリブロック65の先頭メモリアドレス「0xXXXX0400h」が登録され、メモリブロック65の先頭32バイトには、メモリブロック「0xXXXX0440h」が登録され、メモリブロック66の先頭32バイトには、つぎに連結されているメモリブロックが存在しないことを示す「NULL」が登録されており、リンク54,50が形成されている。
メモリプール部25は、処理対象サブメモリプールである128バイトのサブメモリプール4より1つサイズの小さい64バイトのサブメモリプール3に対応するサブメモリプール管理テーブル32の64バイトフリーメモリアドレスに登録されているメモリアドレス「0xXXXX0400h」を取得する。
メモリプール部25は、取得したメモリアドレス「0xXXXX0400h」を、メモリ分割部24が生成した2つのメモリブロック56,57の一方のメモリブロックの先頭32ビットに登録する。この場合は、メモリアドレス「0xXXXX0340h」から始まるメモリブロック57の先頭32ビットにメモリアドレス「0xXXXX0400h」を登録してリンク59を形成する。
メモリプール部25は、メモリブロック56,57の一方のメモリブロックの先頭32ビットに、他方のメモリブロックのメモリアドレスを登録する。この場合は、メモリブロック56の先頭32ビットに、メモリブロック57の先頭のメモリアドレス「0xXXXX0340h」を登録してリンク58を形成する。
メモリプール部25は、一方のメモリブロックの先頭メモリアドレスをサブメモリプール4より1つサイズの小さいサブメモリプール3に対応するサブメモリプール管理テーブル32のフリーメモリアドレスに登録する。この場合は、メモリブロック56の先頭メモリアドレス「0xXXXX0300h」をサブメモリプール管理テーブル32の64バイトのフリーメモリアドレスに登録してリンク55を形成する。
これにより、サブメモリプール管理テーブル32によって管理されるサブメモリプール3にプールされるメモリブロックのリンク構造は、リンク54,リンク50から、リンク55,リンク58,リンク59,リンク50となる。すなわち、サブメモリプール管理テーブル32の64バイトフリーメモリアドレスから始まるメモリブロックのリンクに、メモリブロック56,57が追加される。
メモリプール部25は、サイズ管理テーブル31のメモリブロック56,57の先頭32バイトブロックに対応付けられるエントリの利用状態にFREEを示す値を登録し、サイズ情報に64バイトを示す値を登録する。
図4に戻って、メモリプール部25がメモリ分割部24によって1/2に分割された2つのメモリブロックをサブメモリプール2〜7にプールした後、サブメモリプール切替部22は、処理対象サブメモリプールを1つサイズの小さいサブメモリプール2〜7、すなわちメモリプール部25がメモリブロックをプールしたサブメモリプール2〜7に切り替える(ステップS106)。
サブメモリプール切替部22は、処理対象サブメモリプールのサイズがユーザから要求されたメモリサイズのメモリブロックをプールするサブメモリプール2〜7であるか否かを判定する(ステップS107)。処理対象サブメモリプールがプールするメモリブロックのメモリサイズがユーザから要求されたメモリサイズとは異なる場合、メモリ分割部24は処理対象サブメモリプールにプールされているメモリブロックを1/2に分割して、1つメモリサイズの小さいメモリブロックを生成し、メモリプール部25はメモリ分割部24によって生成されたメモリブロックを当該メモリブロックをプールするサブメモリプール2〜7にプールする動作を、処理対象サブメモリプールがプールするメモリブロックのメモリサイズがユーザから要求されたメモリサイズになるまで繰り返す(ステップS103〜S107)。
処理対象サブメモリプールのメモリサイズがユーザから要求されたメモリサイズである場合、メモリ割当部21は、サブメモリプール管理テーブル32を検索して要求されたサイズのメモリブロックがサブメモリプール2〜8にプールされているか否かを判定する(ステップS101)。
上述したように、メモリ要求によってユーザから要求されたメモリサイズのメモリブロックがサブメモリプール2〜7にプールされていない場合でも、サブメモリプール切替部22、メモリプール判定部23、およびメモリブロック要求部26が、ユーザから要求されたメモリブロックのメモリサイズよりも大きいメモリブロックをプールしているサブメモリプール3〜8を検出し、サブメモリプール切替部22、メモリプール判定部23、メモリ分割部24、およびメモリプール部25が、検出されたサブメモリプール3〜8にプールされているメモリブロックを1つメモリサイズの小さいメモリブロックに分割し、分割したメモリブロックを当該メモリブロックをプールするサブメモリプール2〜7にプールするようにしているので、必ずユーザから要求されたメモリブロックのメモリサイズのサブメモリプール2〜7にメモリブロックをプールすることが可能となる。
要求されたサイズのメモリブロックがサブメモリプール2〜8にプールされている場合、メモリ割当部21は、要求されたメモリサイズのメモリブロックを取得してユーザに提供する(ステップS108)。
先の図1のシステムメモリプール1において、たとえば、ユーザがメモリ要求によって128バイトのメモリブロックを要求したとする。128バイトのサブメモリプール4にはメモリブロックがプールされていないため、メモリ割当部21は、要求されたメモリブロックのメモリサイズより1つメモリサイズの大きい256バイトのメモリブロックを要求するメモリ要求をサブメモリプール切替部22に出力する。サブメモリプール切替部22は、256バイトのサブメモリプール5を処理対象サブメモリプールに決定する。メモリプール判定部23は、256バイトのサブメモリプール5にメモリブロックがプールされているか否かを判定する。サブメモリプール5にはメモリブロックがプールされていないので、メモリブロック要求部26がサブメモリプール5にプールされるメモリブロックより1つメモリサイズの大きい512バイトのメモリブロックを要求するメモリ要求をサブメモリプール切替部22に出力する。サブメモリプール切替部22は、256バイトのサブメモリプール5より1つサイズの大きい512バイトのサブメモリプール6に切り替える。
メモリプール判定部23は、512バイトのサブメモリプール6にメモリブロックがプールされているか否かを判定する。サブメモリプール6にはメモリブロック13が1つプールされているので、メモリ分割部24は、サブメモリプール6にプールされているメモリブロック13を取得して1/2に分割して1つサイズの小さい256バイトのメモリブロックを2つ生成する。
メモリプール部25は、メモリ分割部24によって生成された2つの256バイトのメモリブロックを256バイトのサブメモリプール5にプールする。サブメモリプール切替部22は、512バイトのサブメモリプール6より1つサイズの小さい256バイトのサブメモリプール5に切り替える。
ユーザが要求しているメモリブロックのメモリサイズは128バイトであるので、メモリプール判定部23は、256バイトのサブメモリプール5にメモリブロックがプールされているか否かを判定する。256バイトのサブメモリプール5には、メモリプール部25によって2つのメモリブロックがプールされているので、メモリ分割部24は、128バイトのサブメモリプール5にプールされた2つのメモリブロックの1つを取得して1/2に分割して1つサイズの小さい128バイトのメモリブロックを2つ生成する。
メモリプール部25は、メモリ分割部24によって生成された2つの128バイトのメモリブロックを128バイトのサブメモリプール4にプールする。サブメモリプール切替部22は、256バイトのサブメモリプール5より1つサイズの小さい128バイトのサブメモリプール4に切り替える。
ユーザが要求しているメモリブロックのメモリサイズは128バイトであり、128バイトのサブメモリプール4に2つのメモリブロックがプールされているので、メモリ割当部21は、128バイトのサブメモリプール4にプールされているメモリブロックを取得してユーザに提供する。
このようにこの実施の形態1では、nのべき乗サイズのメモリブロックをメモリサイズ毎にサブメモリプール2〜8にプールするようにしているので、要求されたメモリサイズのメモリブロックがサブメモリプール2〜8にプールされている場合には、検索処理を行なうことなく高速にユーザが要求するサイズのメモリを提供することができる。
また、ユーザから要求されたメモリサイズのメモリブロックがサブメモリプール2〜8にプールされていない場合には、サブメモリプール切替部22、メモリプール判定部23、およびメモリブロック要求部26によって実現されるサブメモリプール選択処理手段が、ユーザから要求されたメモリサイズより大きいメモリサイズのメモリブロックをプールしているサブメモリプール3〜8を検出し、サブメモリプール切替部22、メモリプール判定部23、メモリ分割部24、およびメモリプール部25によって実現されるメモリ分割処理手段が、サブメモリプール選択処理手段によって検出されたサブメモリプール3〜8にプールされているメモリブロックを、ユーザが要求したメモリサイズのサブメモリブロックになるまで順次1つメモリサイズの小さいメモリブロックに分割してサブメモリプール2〜7にプールするようにしているので、バースト的にユーザからメモリブロックを要求され、要求されたメモリサイズのメモリブロックをプールするサブメモリプール2〜7にメモリブロックがプールされていない場合でも、高速にメモリブロックを割り当てることができる。
また、ユーザが要求したメモリサイズのサブメモリブロックになるまで順次1つメモリサイズの小さいメモリブロックに分割してサブメモリプール2〜7にプールするようにしてメモリの共有化を計るようにしているので、従来のようにメモリサイズ毎にメモリプールを分離していた場合と比較して、メモリを有効に利用することができる。
さらに、この実施の形態1では、要求されたサイズのメモリブロックがサブメモリプール2〜7にプールされていない場合、順次大きいサイズのサブメモリプールを検索するようにしているので、サブメモリプールの数−1回のサブメモリプールの検索処理時間と、サブメモリプールの数−1回のサブメモリプールごとのメモリブロックの分割処理時間を加えた値が、メモリ要求を受けてからメモリブロック提供までの最悪実行時間となり、メモリ要求を受けてからメモリブロックを提供するまでの実行最悪時間を保証することができる。
なお、この発明における実施の形態1の記憶領域管理装置のメモリ割当部21、サブメモリプール切替部22、メモリプール判定部23、メモリブロック要求部26、メモリ分割部24、およびメモリプール部25によって実現される前述した各機能を、CPU(Central Processing Unit)などのマイクロプロセッサに実行させるための記憶領域割当プログラムとして提供するようにしてもよい。
実施の形態2.
図6および図7を用いてこの発明の実施の形態2を説明する。この実施の形態2では、ユーザから解放されたメモリブロックを組み立てる(メモリブロックの連結)際の記憶領域管理方法について説明する。
図6は、この発明にかかる実施の形態2の記憶領域管理方法が適用される記憶領域管理装置の構成を示すブロック図である。図6に示した記憶領域管理装置は、図2に示したメモリ割当処理部20の代わりに、メモリ連結処理部70を備えている。図2に示した実施の形態1の記憶領域管理装置と同一機能を備える構成部分には同一符号を付し、重複する説明を省略する。
メモリ連結処理部70は、処理対象メモリブロックのペアメモリブロックを検出するペアメモリブロック検出処理部71と、処理対象メモリブロックとペアメモリブロックとを連結することができるか否かを判定するペアメモリブロック連結判定部72と、処理対象メモリブロックとペアメモリブロックとを連結するペアメモリブロック連結部73とを備えている。
ここで、ペアメモリブロックについて説明する。この発明にかかる記憶領域管理方法では、前述したようにシステムメモリプール1をnのべき乗のサイズ単位のサブメモリプール2〜8で構成している。また、システムメモリプール1は、最大メモリブロック(図1では、2048バイト)の偶数倍とし、2048バイトのメモリブロックを順次1/2に分割していきサブメモリプール2〜8にプールするメモリブロックを生成する。この1/2に分割して生成された同一メモリサイズの2つのメモリブロックが、本発明におけるペアメモリブロックとなる。
たとえば、2048バイトのメモリを1/2に分割して生成された2つの1024バイトのメモリブロックがペアメモリブロックとなる。したがって、連続する2つの2048バイトのメモリブロックをそれぞれ1/2に分割して4つの1024バイトのメモリブロックを生成した場合、1つめの2048バイトのメモリブロックを1/2に分割して生成したメモリブロックを1番目、2番目とし、2つめの2048バイトのメモリブロックを1/2に分割して生成したメモリブロックを3番目と4番目とすると、1番目と2番目のメモリブロック、3番目と4番目のメモリブロックがそれぞれペアメモリブロックであり、2番目と3番目のメモリブロックは連続しているがペアメモリブロックとはなりえない。
つぎに、図7のフローチャートを参照して、この発明にかかる実施の形態2の記憶領域管理方法が適用される記憶領域管理装置の動作を説明する。なお、サブメモリプール管理テーブル32にメモリブロックのリンクを追加する動作、およびサイズ管理テーブル31にメモリブロックのサイズ情報および利用状態を登録する動作は、実施の形態1で説明した動作と同様であるので詳細な説明は省略する。
ユーザからのメモリの返却を受けると、ペアメモリブロック検出処理部71は、メモリの返却によって解放されたメモリブロック(処理対象メモリブロック)のメモリサイズをサイズ管理テーブル31から取得する(ステップS200,S201)。
たとえば、先の図3に示した256バイトの使用中のメモリブロック63が解放されたとする。メモリの返却時には、返却するメモリブロックの先頭メモリアドレス「0xXXXX0700h」が通知される。ペアメモリブロック検出処理部71は、先頭メモリアドレス「0xXXXX0700h」に対応するサイズ管理テーブル31のエントリに登録されているメモリブロックのメモリサイズ(ここでは、256バイト)を取得する。
ペアメモリブロック検出処理部71は、取得した処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズであるか否かを判定する(ステップS202)。処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズではない場合、ペアメモリブロック検出処理部71は、処理対象メモリブロックのメモリサイズを用いて、処理対象メモリブロックのペアメモリブロックの先頭メモリアドレスを取得する(ステップS203)。ここでは、解放されたメモリブロック63の先頭メモリアドレス「0xXXXX06ffh」とメモリブロック63のメモリサイズ「0x0100h」(256バイト)との排他的論理和(EXOR)によってペアメモリブロックの先頭メモリアドレス「0xXXXX0600h」を取得する。
ペアメモリブロック連結判定部72は、サイズ管理テーブル31からペアメモリブロックの先頭メモリアドレスに対応付けられているメモリブロックの使用状態(サイズ情報および利用状態)を確認して、処理対象メモリブロックとの連結が可能であるか否かを判定する(ステップS204,S205)。具体的には、ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリブロックのメモリサイズが処理対象メモリブロックと同一メモリサイズであって、かつ未使用であるか否かを判定する。
ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリブロックのメモリサイズが連結しようとする処理対象メモリブロックと同一メモリサイズであって、かつ未使用の場合、ペアメモリブロック連結部73は、処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックより1つメモリサイズの大きいメモリブロック(処理対象メモリブロックの2倍のメモリサイズのメモリブロック)生成する。
ペアメモリブロック連結部73は、生成したメモリブロックをサイズ管理テーブル31に登録するとともにサブメモリプール管理テーブル32のリンクを変更する(ステップS206)。すなわち、処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックより1つメモリサイズの大きいメモリブロックを生成し、生成したメモリブロックのメモリサイズに応じたサブメモリプール3〜8に生成したメモリブロックをプールする。
上記動作を図3にて説明する。図3に示したメモリブロック53とメモリブロック63とを連結して512バイトのメモリブロックを生成する場合、メモリブロック53の先頭32バイトに対応するサイズ管理テーブル31のエントリのサイズ情報に512バイトを示す値を登録し、利用状態にFREEであることを示す値を登録する。また、サブメモリプール管理テーブル32の256バイトのフリーメモリアドレスから始まる256バイトのメモリブロックのリンクからメモリブロック53を切り離して、512バイトのフリーメモリアドレスから始まる256バイトのメモリブロックのリンクに、メモリブロック53とメモリブロック63とを連結して生成したメモリブロックを追加する。
なお、サブメモリプール管理テーブル32からペアメモリブロックを切り離す(デキュー)処理を高速化するために、この発明にかかる実施の形態2の記憶領域管理方法が適用される記憶領域管理装置では、サブメモリプール管理テーブル32のリンク構造として双方向リンクを用いる。すなわち、実施の形態1で説明したように未使用のメモリブロックに次に連結されるメモリブロックの先頭メモリアドレスを登録するともに、1つ前に連結されているメモリブロックの先頭メモリアドレスを登録しておく。これにより、単方向リンクの場合と比較して高速にメモリブロックをデキューすることができる。
ペアメモリブロック検出処理部71は、ペアメモリブロック連結部73によって生成されたメモリブロックを処理対象メモリブロックとしてペアメモリブロックを検出し、ペアメモリブロック連結判定部72は、処理対象メモリブロックとペアメモリブロックとを連結可能であるか否か判定し、ペアメモリブロック連結部73は、連結可能である場合には処理対象メモリブロックとペアメモリブロックとを連結する動作を、処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズになるか、処理対象メモリブロックとペアメモリブロックとを連結することができなくなるまで繰り返す(ステップS202〜S206)。
処理対象メモリブロックのメモリサイズが最大メモリブロックのメモリサイズである場合、または処理対象メモリブロックとペアメモリブロックとを連結できない(ペアメモリブロックが使用中、または処理対象メモリブロックのメモリブロックとメモリサイズが一致しない)場合、ペアメモリブロック連結判定部72は、処理対象メモリブロックをサイズ管理テーブル31に登録するとともにサブメモリプール管理テーブル32のリンクにエンキューする(ステップS207)。すなわち、処理対象メモリブロックのメモリサイズに応じたサブメモリプール3〜8にプールする。
このようにこの実施の形態2では、メモリブロックをnのべき乗サイズとしているので、解放されたメモリブロックと対となるペアメモリブロックをメモリブロックのメモリアドレスとサイズとの排他的論理和で取得することができるようにしているため、従来のように連結するメモリブロックをリンク検索によって検出する場合と比較して高速に連結処理を行なうことができる。そのため、リアルタイム処理が要求されるシステムに対応することが可能となるとともに、メモリを有効に利用することができる。
実施の形態3.
図8を用いてこの発明の実施の形態3を説明する。この発明にかかる実施の形態3の記憶領域管理方法では、図8に示すように、サブメモリプール2〜7にプールするメモリブロック9〜14の数に閾値TH1〜TH6を設ける。閾値TH1〜TH6には、設計時に必要と考えられるメモリサイズのメモリブロック9〜14の数を予測しておき、その数を設定する。
図8では、32バイトのサブメモリプール2の閾値TH1には「6」が設定され、64バイトのサブメモリプール3の閾値TH2には「4」が設定され、128バイトのサブメモリプール4の閾値TH3には「2」が設定され、256バイトのサブメモリプール5の閾値TH4には「5」が設定され、512バイトのサブメモリプール6の閾値TH5には「4」が設定され、1024バイトのサブメモリプール7の閾値TH6には「2」が設定されている。
システム起動時にシステムメモリプール1として使用するメモリ40を初期化する際に、図8に示すように、サブメモリプール2〜7に閾値TH1〜TH6の数分のメモリブロック9〜14をプールした後に、残ったメモリブロック15を最大メモリサイズのサブメモリプール8にプールする。なお、メモリブロックの分割、およびメモリブロックをサブメモリプール2〜7にプールする処理は、実施の形態1のメモリ分割部24およびメモリプール部25の処理動作と同じであるのでここではその説明を省略する。
メモリ40を初期化してサブメモリプール2〜7に閾値TH1〜TH6の数のメモリブロック9〜14をプールして残ったメモリブロック15をサブメモリプール8にプールした後に通常動作を開始し、ユーザからメモリ要求を受けると実施の形態1で図4のフローチャートを参照して説明したメモリ割当処理によってユーザにメモリブロックを提供する。このとき、サブメモリプール2〜7に予め閾値TH1〜TH6の数分だけのメモリブロックがプールされているので、閾値TH1〜TH6の数以内でユーザからのメモリ要求であれば、要求されたメモリサイズのメモリブロック9〜14をプールするサブメモリプール2〜7よりも1つサイズの大きいサブメモリプール3〜8にプールされているメモリブロック10〜15を分割する必要がなくなり、ユーザから要求されたメモリを高速に提供することができる。
このようにこの実施の形態3では、サブメモリプール2〜7にプールするメモリブロックの数の閾値TH1〜TH6を設定して、システム起動時に予め閾値TH1〜TH6の数分のメモリブロック9〜14を予めサブメモリプール2〜7にプールするようにしているので、メモリブロックの分割処理の発生を抑制し、高速にユーザが要求するサイズのメモリを提供することができる。
実施の形態4.
図9〜図12を用いてこの発明の実施の形態4を説明する。実施の形態2では、ユーザからのメモリ返却によってメモリブロックが解放された場合、解放されたメモリブロックのペアメモリブロックの使用状態に基づいてメモリブロックを連結して解放されたメモリブロックから順次1つメモリサイズの大きいメモリブロックを生成してメモリブロックを連結するようにした。
ここで、実施の形態2の記憶領域管理方法をプログラムによって実現し、リアルタイムOSの記憶領域管理に適用したとする。実施の形態2では、ユーザからのメモリ返却によってメモリブロックが解放されると、解放されたメモリブロックの連結処理を実行するため、ユーザのリアルタイム処理を阻害してしまうという問題があった。
図9は、リアルタイムOSによるタスク(ユーザ)のスケジューリングを示す図である。図9では、リアルタイムOSの基準チック100からタスク101が実行されてタスク102にディスパッチされ、タスク102が実行されてタスク103にディスパッチされ、タスク103実行後に、活性可能なタスクがなくなったことにより、リアルタイムOSのアイドルタスク104が起動されている。
この実施の形態4では、タスク101〜103の実行時にメモリ返却によってメモリブロックが解放された場合、解放されたメモリブロックに対して連結処理を実行することなくサブメモリプール2〜8にプールしておき、タスク101〜103が終了した後に起動されるアイドルタスク104の中でサブメモリプール2〜7にプールされている全てのメモリブロックに対して連結処理を実行するガベージコレクション処理プログラムを起動して、ユーザのリアルタイム処理を阻害することない記憶領域管理方法を提供する。
この発明にかかる実施の形態4の記憶領域管理方法は、タスク101〜103の実行時に解放されたメモリブロックを当該メモリブロックに対応するサブメモリプール2〜8にプールするメモリ解放処理プログラムと、アイドルタスク104の中でサブメモリプール2〜7にプールされている全てのメモリブロックに対して連結処理を実行するガベージコレクション処理プログラムとによって実現される。
図10は、メモリ解放処理プログラムの処理モジュールの構成を示す図である。メモリ解放処理プログラムは、ユーザからのメモリ解放に関する処理を行なうメモリ解放処理部80で構成される、図10では、この発明にかかる記憶領域管理方法を実現するために必要なメモリブロックプール処理部81のみを記載している。
メモリブロックプール処理部81は、解放されたメモリブロックを当該メモリブロックのメモリサイズに対応するサブメモリプール2〜8にプールする。すなわち、解放されたメモリブロックの先頭メモリアドレスが示すサイズ管理テーブル31のエントリの利用状態を使用中から未使用に変更するとともに、サブメモリプール管理テーブル32のリンクに解放されたメモリブロックをエンキューする。
図11は、ガベージコレクション処理プログラムの処理モジュールの構成を示す図である。ガベージコレクション処理プログラムは、サブメモリプール2〜7にプールされている全てのメモリブロックに対して連結処理を実行するガベージコレクション処理部(以下、GC処理部とする)90で構成される。
GC処理部90は、ガベージコレクション処理(以下、GC処理とする)の処理対象サブメモリプールを選択するサブメモリプール切替部91、処理対象サブメモリプールにプールされているメモリブロック全てに対して処理を実行したか否かを判定するサブメモリプール切替判定部92と、処理対象メモリブロックのペアメモリブロックを検出するペアメモリブロック検出処理部93、処理対象メモリブロックとペアメモリブロックとを連結することができるか否かを判定するペアメモリブロック連結判定部94、および処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックより1つメモリサイズの大きいメモリブロックを生成してサブメモリプール3〜8にプールする次サブメモリプール・プール部96と、処理対象メモリブロックを処理対象サブメモリプールにプールする対象サブメモリプール・プール部97とを有するメモリプール部95で構成される。すなわち、サブメモリプール切替部91によって選択された処理対象サブメモリプールにプールされている全てのメモリブロックに対して、サブメモリプール切替判定部92、ペアメモリブロック検出処理部93、ペアメモリブロック連結判定部94、およびメモリプール部95がガベージコレクションを実行する。
つぎに、図12のフローチャートを参照して、GC処理部90の動作を説明する。なお、ペアメモリブロック検出処理部93およびペアメモリブロック連結判定部94の動作は、実施の形態2のペアメモリブロック検出処理部71およびペアメモリブロック連結判定部72の動作と同じであるので、ここでは詳細な説明は省略する。また、メモリブロックをサブメモリプール2〜8にプールする動作、すなわち、サブメモリプール管理テーブル32にメモリブロックのリンクを追加する動作、およびサイズ管理テーブル31にメモリブロックのサイズ情報および利用状態を登録する動作は、実施の形態1で説明した動作と同様であるので詳細な説明は省略する。
ガベージコレクション処理開始(GC開始)を受けるとサブメモリプール切替部91は、ガベージコレクション(GC)を実行する処理対象サブメモリプールを選択する(ステップS300)。ガベージコレクションは、小さいメモリブロックから大きいメモリブロックを組み立てていくので、サブメモリプール切替部91は、32バイトのサブメモリプール2、64バイトのサブメモリプール3、128バイトのサブメモリプール4、256バイトのサブメモリプール5、512バイトのサブメモリプール6、1024バイトのサブメモリプール7、2048バイトのサブメモリプール8の順に処理対象サブメモリプールを選択する。
サブメモリプール切替判定部92は、処理対象サブメモリプールが最大メモリブロックのメモリブロックをプールするサブメモリプール8であるか否かを判定する(ステップS301)。処理対象サブメモリプールが最大メモリブロックのメモリブロックをプールするサブメモリプール8である場合、サブメモリプール切替部91は処理を終了する。
処理対象サブメモリプールが最大メモリブロックのメモリブロックをプールするサブメモリプール8ではない場合、ペアメモリブロック検出処理部93は、サブメモリプール管理テーブル32に基づいて、ガベージコレクションの処理対象メモリブロックを選択する。処理対象メモリブロックが存在する(ガベージコレクションを実行していない未処理のメモリブロックが存在する)場合、ペアメモリブロック検出処理部93は、処理対象メモリブロックのペアメモリブロックの先頭メモリアドレスを計算する(ステップS302,S303)。
ペアメモリブロック連結判定部94は、サイズ管理テーブル31からペアメモリブロックの先頭メモリアドレスに対応付けられている使用状態を確認して、処理対象メモリブロックとの連結が可能であるか否かを判定する(ステップS304,S305)。
ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリサイズが処理対象メモリブロックのメモリサイズと異なる場合(処理対象メモリブロックのペアメモリブロックになりえない場合)、またはペアメモリブロックの利用状態が使用中である場合、対象サブメモリプール・プール部97は、処理対象メモリブロックの連結処理を行なわずに、処理対象メモリブロックをサブメモリプール管理テーブル32のリンクからデキューして、リンクの先頭にエンキューする(ステップS306,S307)。これは、処理対象サブメモリプールにプールされているメモリブロックの中で未処理のサブメモリブロックと処理を完了したメモリブロックとを識別するためである。
ペアメモリブロックの先頭メモリアドレスに対応付けられているメモリサイズが処理対象メモリブロックのメモリサイズと同一サイズ(処理対象メモリブロックのペアメモリブロックである場合)であって、かつペアメモリブロックの利用状態が未使用である場合、次サブメモリプール・プール部96は、処理対象メモリブロックとペアメモリブロックとをサブメモリプール管理テーブル32のリンクからデキューする(ステップS308)。
次サブメモリプール・プール部96は、処理対象メモリブロックとペアメモリブロックとを連結して処理対象メモリブロックよりも1つメモリサイズの大きいメモリブロックを生成し、生成したメモリブロックを処理対象サブメモリプールより1つサイズの大きいサブメモリプール3〜8に対応するサブメモリプール管理テーブル32のリンクにエンキューする(ステップS309)。
メモリプール部95が処理対象メモリブロック、または処理対象メモリブロックとペアメモリブロックとを連結して生成したメモリブロックをサブメモリプール2〜8にプールした後、サブメモリプール切替判定部92は、処理対象サブメモリプールの未処理のメモリブロックから、次のGC処理の処理対象メモリブロックを導出し、ペアメモリブロック検出処理部93は処理対象メモリブロックのペアメモリブロックの先頭メモリアドレスを検出し、ペアメモリブロック連結判定部94が処理対象メモリブロックとペアメモリブロックとを連結可能であるか否か判定し、連結可能である場合には次サブメモリプール・プール部96が処理対象メモリブロックとペアメモリブロックとを連結して処理対象サブメモリプールより1つサイズの大きいサブメモリプール3〜8に連結したメモリブロックをプールし、連結できない場合には対象サブメモリプール・プール部97が処理対象メモリブロックを処理対象サブメモリプールにプールする動作を、未処理のメモリブロックがなくなるまで繰り返す(ステップS302〜S310)。
処理対象サブメモリプールにプールされているメモリブロックに対してガベージコレクションが終了すると、サブメモリプール切替判定部92はサブメモリプール切替部91に処理対象サブメモリプールを切り替えることを要求し、サブメモリプール切替部91は、処理対象サブメモリプールを現在より1つサイズの大きいメモリプールに切り替えて、上述したステップS301〜S310の動作を処理対象サブメモリプールが最大メモリブロックをプールするサブメモリプール8になるまで繰り返す。
このようにこの実施の形態4では、メモリ解放時には解放されたメモリブロックに対して連結処理を実行することなくサブメモリプール2〜8にプールしておき、アイドルタスク104の起動時にサブメモリプール2〜7にプールされているメモリブロックに対してガベージコレクション処理を実行するようにしているので、ユーザのリアルタイム処理中に解放されたメモリブロックに対する連結処理を実行する場合と比較して、ユーザ処理時間を短縮することができ、リアルタイムアプリケーションに適応することができる。
実施の形態5.
図13を用いてこの発明の実施の形態5を説明する。実施の形態4では、ガベージコレクション処理をリアルタイムOSのアイドル時間に実行するようにした。しかしながら、各サブメモリプール2〜7にプールされているメモリブロックの数に依存することなくガベージコレクション処理を実行するため、新たにそのサブメモリプールで、メモリブロックが必要になると、1つサイズの大きいサブメモリプールからメモリブロックを分割しなければならず、バースト的にメモリ要求および解放を行うリアルタイムシステムではメモリ割当てのオーバヘッドになるという問題があった。
このような問題を改善するために、この実施の形態5の記憶領域管理方法におけるガベージコレクション処理プログラムでは、図13に示すように、メモリブロックを連結する処理を実行するか否かを判定するガベージコレクション閾値(以下、GC閾値とする)TH10〜TH60をサブメモリプール2〜7毎に設定しておき、サブメモリプール2〜7にプールされているメモリブロックの数が、設定されたGC閾値TH10〜TH60を越えた場合だけガベージコレクションを実行するものである。
この発明にかかる実施の形態5の記憶領域管理方法が適用されるガベージコレクション処理プログラムの処理モジュールは、図11に示したものとほぼ同じであり、異なる点はサブメモリプール切替部91が処理対象サブメモリプールを選択する際に、サブメモリプール2〜7にプールされているメモリブロックの数がサブメモリプール2〜7に設定されているGC閾値TH10〜TH60を越えているか否かを判定して、GC閾値TH10〜TH60を越えた数のメモリブロックをプールしているサブメモリプール2〜7を処理対象サブメモリプールとして選択することである。また、サブメモリプール管理テーブル32には、フリーメモリアドレスとともにプールしているメモリブロックの数を登録しておく。
つぎに、この発明にかかる実施の形態5のガベージコレクション処理プログラムの動作を説明する。なお、処理対象サブメモリプールを選択した後のガベージコレクションについては、実施の形態4で説明した動作と同じであるので、ここではその説明を省略し、処理対象サブメモリプールを選択する動作のみを説明する。
リアルタイムOSのアイドル時間になってGC開始を受けるとサブメモリプール切替部91は、サブメモリプール管理テーブル32に基づいて32バイトのサブメモリプール2から順に、サブメモリプール2〜7にプールされているメモリブロックの数とGC閾値TH10〜TH60とを比較して、GC閾値TH10〜TH60を越えた数のメモリブロックをプールしているサブメモリプール2〜7を検出し、検出したサブメモリプール2〜7を処理対象サブメモリプールとして選択する。
GC開始時に、図13に示したように、32バイトのサブメモリプール2には9個のメモリブロック9がプールされ、64バイトのサブメモリプール3には10個のメモリブロック10がプールされ、128バイトのサブメモリプール4には6個のメモリブロック11がプールされ、256バイトのサブメモリプール5には7個のメモリブロック12がプールされ、512バイトのサブメモリプール6には10個のメモリブロック13がプールされ、1024バイトのサブメモリプール7には6個のメモリブロック14がプールされていたとする。
図13では、32バイトのサブメモリプール2のGC閾値TH10は「10」に設定され、64バイトのサブメモリプール3のGC閾値TH20は「8」に設定され、128バイトのサブメモリプール4のGC閾値TH30は「6」に設定され、256バイトのサブメモリプール5のGC閾値TH40は「8」に設定され、512バイトのサブメモリプール6のGC閾値TH50は「10」に設定され、1024バイトのサブメモリプール7のGC閾値TH60は「8」に設定されている。
サブメモリプール切替部91は、GC閾値TH10とサブメモリプール2にプールされているメモリブロック9の数とを比較する。メモリブロック9は9個でGC閾値TH10の値「10」を越えていないので、サブメモリプール切替部91は、GC閾値TH20とサブメモリプール3にプールされているメモリブロック10の数とを比較する。メモリブロック10は10個でGC閾値TH20の値「8」を越えているので、サブメモリプール切替部91は、サブメモリプール3を処理対象サブメモリプールとして選択する。
サブメモリプール切替判定部92、ペアメモリブロック検出処理部93、ペアメモリブロック連結判定部94、およびメモリプール部95は、実施の形態4で図12のフローチャートを参照して説明したように、サブメモリプール3にプールされている全てのメモリブロック10に対してガベージコレクション(ステップS302〜S310)を実行する。
処理対象サブメモリプールであるサブメモリプール3にプールに対するガベージコレクションが終了すると、サブメモリプール切替部91は、処理対象サブメモリプールを切り替える。
ここで、ガベージコレクションによってサブメモリプール3にプールされている1組のメモリブロック10が連結されたとすると、サブメモリプール4に1個のメモリブロック11がプールされてメモリブロック11が7個になり、サブメモリプール4にプールされているメモリブロック11の数がGC閾値TH30の値「6」を越える。したがって、サブメモリプール切替部91は、処理対象サブメモリプールとしてサブメモリプール4を選択する。
64バイトのサブメモリプール3にプールされているメモリブロックにおいてメモリブロックが連結されなかった場合には、サブメモリプール4にプールされているメモリブロックは6個のままであり、サブメモリプール4にプールされているメモリブロックの数はGC閾値TH30の値「6」を超えていないので、サブメモリプール切替部91は、サブメモリプール4を処理対象サブメモリプールとして選択しない。
サブメモリプール切替部91は、サブメモリプール5にプールされているメモリブロックの数とGC閾値TH40とを比較してサブメモリプール5を処理対象サブメモリプールとしてガベージコレクションを起動するか否かを判定し、512バイトのサブメモリプール6にプールされているメモリブロックの数とGC閾値TH50とを比較して512バイトのサブメモリプール6を処理対象サブメモリプールとしてガベージコレクションを起動するか否かを判定し、1024バイトのサブメモリプール7にプールされているメモリブロックの数とGC閾値TH60とを比較して1024バイトのサブメモリプール7を処理対象サブメモリプールとしてガベージコレクションを起動するか否かを判定する。
このようにこの実施の形態5では、ユーザから解放されたメモリブロックに対してメモリブロックの連結処理を実行するか否かを決定するGC閾値TH10〜TH60を設定して、サブメモリプール2〜7にプールされているメモリブロック数がGC閾値TH10〜TH60を越えた場合のみメモリ連結を行うようにしているため、ガベージコレクション実行の発生頻度を抑制することができる。
また、この実施の形態5では、解放されたメモリブロックに対してメモリブロックの連結処理を実行するか否かを決定するGC閾値TH10〜TH60を設定して、サブメモリプール2〜7にプールされているメモリブロック数がGC閾値TH10〜TH60を越えた場合のみメモリ連結を行うようにしているため、GC閾値TH10〜TH60を越えない数のメモリブロックをサブメモリプール2〜7にプールしておくことができ、高速にユーザが要求するサイズのメモリを提供することができる。
さらに、GC閾値TH10〜TH60にサブメモリプール2〜7で利用されるピーク時のメモリブロック数を設定しておけば、メモリブロックのガベージコレクションを起動しないリアルタイムシステムを構築することができ、リアルタイム性の必要なシステムにおいて非常に有効である。
また、GC閾値TH10〜TH60にメモリ40の初期化時にサブメモリプール2〜7に割当てるメモリブロック数を設定しておけば、メモリ要求によってメモリブロックが分割され、1つ大きいサブメモリプール3〜8からメモリブロックを貸与された場合でも、ユーザからメモリブロックが解放されれば、即メモリブロックを組み立てて1つ大きいサブメモリプール3〜8にメモリブロックを返却するシステムを構築することができ、メモリ容量が少ないシステムにおいて非常に有効である。
実施の形態6.
図14および図15を用いてこの発明にかかる実施の形態6を説明する。実施の形態5では、サブメモリプール2〜7にプールされているメモリブロック9〜14に対してガベージコレクションを実行するか否かを判定するGC閾値TH10〜TH60をサブメモリプール2〜7毎に設定しておき、サブメモリプール2〜7にプールされているメモリブロック9〜14の数が、GC閾値TH10〜TH60を越えた場合だけメモリブロック9〜14のガベージコレクションを実行するようにして、サブメモリプール2〜7にプールするメモリブロックの枯渇を防止するようにした。
しかしながら、メモリブロックの数がGC閾値TH10〜TH60を越えてガベージコレクションが実行された場合には、サブメモリプール2〜7にプールするメモリブロックが枯渇してしまう場合がある。
このような問題を改善するために、この実施の形態6の記憶領域管理方法におけるガベージコレクション処理プログラムでは、図14に示すように、メモリブロック9〜14を連結する処理を停止するか否かを判定するガベージコレクション完了閾値(以下、GC完了閾値とする)TH100〜TH150をサブメモリプール2〜7毎に設定しておき、サブメモリプール2〜7にプールされているメモリブロック9〜14の数が、設定されたGC完了閾値TH100〜TH150より小さくなった場合には、処理対象サブメモリプールに対するガベージコレクションを停止するものである。
この発明にかかる実施の形態6のガベージコレクション処理プログラムの処理モジュールは、実施の形態5のガベージコレクション処理プログラムの処理モジュールとほぼ同じである。実施の形態6のガベージコレクション処理プログラムの処理モジュールと実施の形態5のガベージコレクション処理プログラムの処理モジュールとの相違点は、サブメモリプール切替判定部92が処理対象サブメモリプールを切り替えるか否かを判定する条件である。この実施の形態6のサブメモリプール切替判定部92は、処理対象サブメモリプールにプールされているメモリブロックの数が処理対象サブメモリプールに設定されているGC完了閾値TH100〜TH150より小さい場合、または処理対象サブメモリプールにプールされているメモリブロック全てに対して処理を終了した場合に処理対象サブメモリプールを切り替えることを決定する。
つぎに、この発明にかかる実施の形態6のガベージコレクション処理プログラムの動作を説明する。なお、上述したように、この発明にかかる実施の形態6のガベージコレクション処理プログラムは、サブメモリプール切替判定部92が処理対象サブメモリプールを切り替えるか否かを判定する条件のみが実施の形態5に示したガベージコレクション処理プログラムと異なり、図12のフローチャートのステップS302が、図15のフローチャートに示した動作となる。
処理対象サブメモリプールが最大メモリブロックのメモリブロック15をプールするサブメモリプール8ではない場合(図12のステップS301)、または処理対象サブメモリプールの未処理のメモリブロックから、次のGC処理の処理対象メモリブロックを導出した後に(図12のステップS310)、サブメモリプール切替判定部92は、処理対象サブメモリプールに未処理のメモリブロックが存在する否かを判定する(図15のステップS400)。
処理対象サブメモリプールに未処理のメモリブロックが存在する場合、サブメモリプール切替判定部92は、ガベージコレクション実行前のメモリブロック数から連結処理に成功したメモリブロック数を減算して、処理対象サブメモリプールにその時点でプールされているメモリブロック数を算出する(図15のステップS401)。
サブメモリプール切替判定部92は、算出したメモリブロック数と処理対象サブメモリプールに設定されているGC完了閾値TH100〜TH150とを比較する(図15のステップS402)。比較の結果、算出したメモリブロック数がGC完了閾値TH100〜TH150より小さい場合、サブメモリプール切替判定部92は、処理対象サブメモリプールに対するガベージコレクションを終了することを決定し、サブメモリプール切替部91に処理対象サブメモリプールの切り替えを要求する。サブメモリプール切替部91は、現在の処理対象サブメモリプールより1つサイズの大きいサブメモリプール3〜8を選択して処理対象サブメモリプールを切り替える(図12のステップS300)。比較の結果、算出したメモリブロック数がGC完了閾値TH100〜TH150以上の場合、サブメモリプール切替判定部92は、処理対象サブメモリプールに対するガベージコレクションを継続することを決定し、ペアメモリブロック検出処理部93が処理対象メモリブロックのペアメモリブロックのメモリアドレスの計算する(図12のステップS303)。
一方、処理対象サブメモリプールに未処理のメモリブロックが存在しない場合、サブメモリプール切替判定部92は、処理対象サブメモリプールに対するガベージコレクションを終了することを決定し、サブメモリプール切替部91に処理対象サブメモリプールの切り替えを要求する。サブメモリプール切替部91が現在の処理対象サブメモリプールより1つサイズの大きいサブメモリプール3〜8を選択して処理対象サブメモリプールを切り替える(図12のステップS300)。
図14では、32バイトのサブメモリプール2のGC閾値TH10は「10」に設定され、GC完了閾値TH100は「6」に設定されている。64バイトのサブメモリプール3のGC閾値TH20は「8」に設定され、GC完了閾値TH110は「4」に設定されている。128バイトのサブメモリプール4のGC閾値TH30は「6」に設定され、GC完了閾値TH120は「2」に設定されている。256バイトのサブメモリプール5のGC閾値TH40は「8」に設定され、GC完了閾値TH130は「4」に設定されている。512バイトのサブメモリプール6のGC閾値TH50は「10」に設定され、GC完了閾値TH140は「6」に設定されている。1024バイトのサブメモリプール7のGC閾値TH60は「8」に設定され、GC完了閾値TH150は「2」に設定されている。
32バイトのサブメモリプール2には、9個のメモリブロックがプールされ、64バイトのサブメモリプール3には、10個のメモリブロックがプールされ、128バイトのサブメモリプール4には、6個のメモリブロックがプールされ、256バイトのサブメモリプール5には、7個のメモリブロックがプールされ、512バイトのサブメモリプール6には、10個のメモリブロックがプールされ、1024バイトのサブメモリプール7には6個のメモリブロックがプールされているので、GC閾値TH20を越えた数のメモリブロックをプールしている64バイトのサブメモリプール3のメモリブロックに対して、メモリブロックの数がGC完了閾値TH110より小さくなるまでガベージコレクションを実行する。
このようにこの実施の形態6では、サブメモリプール2〜7にガベージコレクションを停止するGC完了閾値TH100〜TH150を設定して、ガベージコレクションを実行した場合に、サブメモリプール2〜7にGC完了閾値TH100〜TH150の値の数のメモリブロックをプールしておくようにしているので、バースト的にメモリ割り当て、解放を行うアプリケーションに対して、最も利用頻度の高いメモリブロック数までガベージコレクションを実行させることができる。
また、この実施の形態6では、サブメモリプール2〜7に、ガベージコレクションを実行するGC閾値TH10〜TH60と、ガベージコレクションを停止するGC完了閾値TH100〜TH150とを設定するようにしているので、リアルタイム性とメモリ使用効率とを調整することができる。
実施の形態7.
図16および図17を用いてこの発明の実施の形態7を説明する。実施の形態4〜6では、先の図9を用いて実施の形態4で説明したように、タスク101〜103の実行時にユーザからメモリブロックが解放された場合、解放されたメモリブロックに対して連結処理を実行することなくサブメモリプール2〜8にプールしておき、タスク101〜103が終了したに起動されるアイドルタスク104の中でサブメモリプール2〜7にプールされているメモリブロックに対してガベージコレクションを実行するガベージコレクション処理プログラムを起動した。
しかしながら、タスク101〜103は非同期タスクである。そのため、タスク101〜103の処理時間は変動する。すなわち、図16に示すように、チックタイム#1(Tick Time#1)で実行されるタスク101〜103の処理時間118と、チックタイム#2(TickTime#2)で実行されるタスク101〜103の処理時間118とは異なる。基準チック100は周期的であるので、タスク101〜103の処理時間118の変動によりアイドル時間も変動する。したがって、アイドル時間にサブメモリプール2〜7にプールされているメモリブロックに対してガベージコレクションを実行する十分な時間がある場合と、ガベージコレクションを実行する時間が不足する場合とがあり、必ずしも1回のアイドル時間内でサブメモリプール2〜7全てに対してガベージコレクションを実行することができるとは限らない。
このような問題を改善するために、この実施の形態7のガベージコレクション処理プログラムでは、サブメモリプール切替部91が処理対象サブメモリプールを切り替える前、すなわち処理対象サブメモリプールに対してガベージコレクションが終了した時に、システム時間を取得して、次の基準チック100までの残GC可能時間を測定し、次の処理対象サブメモリプールに対してガベージコレクションが実行可能かどうかを判定して、ガベージコレクションを実行するか否かを決定し、非同期タスク間の時間揺らぎに対応するものである。
この発明にかかる実施の形態7のガベージコレクション処理プログラムの処理モジュールは、実施の形態4〜6のガベージコレクション処理プログラムの処理モジュールとほぼ同じである。実施の形態4〜6のガベージコレクション処理プログラムとの相違点は、サブメモリプール切替部91が、処理対象サブメモリプールを切り替える前に、システム時間を取得して、次の基準チック100までの残GC可能時間を測定して、次の処理対象サブメモリプールに対してガベージコレクションが実行可能かどうかを判定して、ガベージコレクションを実行するか否かを決定することである。
つぎに、図17のフローチャートを参照して、この発明にかかる実施の形態7のガベージコレクション処理プログラムの動作を説明する。なお、サブメモリプール2〜7を識別するために予めサブメモリプール2〜7にはサブメモリプールID(識別子)が付与されており、GC対象情報として、つぎにガベージコレクションの処理対象サブメモリプールとなるサブメモリプール2〜7を示すサブメモリプールIDが記憶されているものとする。ガベージコレクションは、サブメモリプール2から1つずつサイズの大きいサブメモリプール3〜7に対して実行されるので、GC対象情報の初期値はサブメモリプール2のサブメモリプールIDとなる。
リアルタイムOSのアイドル時間になってGC開始を受けるとサブメモリプール切替部91は、GC対象情報からGC対象となるサブメモリプールIDを取得する(ステップS500)。サブメモリプール切替部91は、取得したサブメモリプールIDが示すサブメモリプール2〜7を処理対象サブメモリプールとして選択して、実施の形態4〜6で説明したガベージコレクション処理を起動する(ステップS501)。
処理対象サブメモリプールに対するガベージコレクションが終了すると、サブメモリプール切替部91は、システム時間を取得して次の基準チック100までの残GC可能時間を測定する(ステップS502)。
サブメモリプール切替部91は、残GC可能時間内に次のガベージコレクションを実行ことができるか否かを判定する(ステップS503)。残GC可能時間内に次のガベージコレクションを実行ことができる場合、サブメモリプール切替部91は、処理対象サブメモリプールを切り替えて、次のサブメモリプール3〜7に対するガベージコレクション処理を起動し、ガベージコレクション処理が終了するとシステム時間を取得して次の基準チック100までの残GC可能時間を測定し、残GC可能時間内に次のガベージコレクションを実行ことができるか否かを判定する動作を繰り返す(ステップS501〜S503)。
残GC可能時間内に次のガベージコレクションを実行ことができない場合、サブメモリプール切替部91は、処理対象サブメモリプールより1つサイズの大きいサブメモリプール2〜3に付与されているサブメモリプールIDをGC対象情報として記憶して処理を終了する(ステップS504)。
図16の場合は、1番目のチックタイム#1において、1つめの処理対象サブメモリプールに対するガベージコレクション105が終了した際に残GC可能時間109を測定し、2つめの処理対象サブメモリプールに対してガベージコレクションが実行可能と判定してガベージコレクション106を実行している。ガベージコレクション106が終了した際に残GC可能時間110を測定し、3つめの処理対象サブメモリプールに対してガベージコレクションを実行できないと判定して処理を中断している。
2番目のチックタイム#2において、3つめの処理対象サブメモリプールに対してガベージコレクション107を実行し、ガベージコレクション107が終了した際に残GC可能時間111を測定し、4つめの処理対象サブメモリプールに対してガベージコレクションが実行可能と判定してガベージコレクション108を実行している。ガベージコレクション108が終了した際に残GC可能時間112を測定し、5つめの処理対象サブメモリプールに対してガベージコレクションを実行できないと判定して処理を中断している。
このようにこの実施の形態7では、処理対象サブメモリプールに対するガベージコレクションが終了した際に、システム時間を取得して、次の基準チック100までの残GC可能時間を測定して、次の処理対象サブメモリプールに対してガベージコレクションが実行可能かどうかを判定して、ガベージコレクションを実行するのか、停止するのかを決定するようにしているので、アイドル時間がタスクの処理時間によって変動しても、効率的にガベージコレクションを実行することができる。
実施の形態8.
図18〜図26を参照してこの発明にかかる実施の形態8を説明する。この実施の形態8では、実施の形態1〜7で説明した記憶領域管理方法を、CPUやDSP(Digital Signal Processor)などの複数のプロセッサで構成される分散マルチプロセッサ環境に適用した場合のメッセージ管理方法について説明する。
図18は、分散マルチプロセッサ環境の構成の一例を示す図である。CPU110a,110bは、実施の形態1または実施の形態3で説明した記憶領域管理方法による記憶領域割当プログラムと、実施の形態4〜7で説明した記憶領域管理方法によるメモリ解放処理プログラムおよびガベージコレクション処理プログラムとを実装が実装され、サイズ管理テーブル31a,31bおよびサブメモリプール管理テーブル32a,32bを用いてメモリ40a,40bをシステムメモリプール1として管理する記憶領域管理部114a,114bと、メッセージを管理するメッセージ管理部113a,113bを備えている。
タスク111a,112aはCPU110aで動作するタスクであり、タスク111b,112bはCPU110bで動作するタスクである。共有メモリ115は、CPU110aとCUP110bとの間でメッセージ転送に用いられるメモリで、2つのCPU110a,110bがアクセス可能となっている。CPU110aで起動するタスク111a,112aとCPU110bで起動するタスク111b,112bとは、共有メモリ115を介してメッセージ交換を行なう。図18では、CPU110aのタスク112aがCUP110bのタスク111bにメッセージ116を転送している。
複数の異なるプロセッサ上で動作するタスク間でメッセージを交換する場合、複数のプロセッサを接続してメッセージを交換しなければならない。図19では、CPU121〜123をバス120によって接続しており、図20では、CPU131〜133をスイッチ130によって接続しており、図21では、CPU141〜143をネットワーク140によって接続している。
図19〜図21に示したように複数のプロセッサ(図19〜図21ではCPU120〜123,131〜133,141〜143)をバス120やスイッチ130、ネットワーク140などの媒体によって接続して、異なるプロセッサ上で動作するタスク間でメッセージを交換する場合、複数のメッセージブロックで構成されるメッセージをパッキングして、連続する1つのメッセージパケットを生成する必要がある。
ここで、本発明と従来の記憶領域管理方法の差異を明確にするため、記憶領域管理部114a,114bが、この発明にかかる記憶領域管理方法ではなく、メモリの循環系ごとに構築したメモリプールを有効利用するために、メモリをさらに小さなブロックに分割して要求されたメモリサイズのメモリを割り当てる可変長メモリプール方式による従来の記憶領域管理方法を用いてメモリ40を管理したと仮定する。
従来の記憶領域管理方法を用いた場合のメッセージフォーマットは、たとえば、図22に示すように、メッセージヘッダ(Message Header)150、第1メッセージブロック152、第2メッセージブロック155、第3メッセージブロック156で構成される。メッセージヘッダ150,第1メッセージブロック152,第2メッセージブロック155,第3メッセージブロック156は、連結ポインタ151,153,154に登録されているメモリアドレスによるリンク形式で接続される。
メッセージヘッダ150、第1メッセージブロック152、第2メッセージブロック155、第3メッセージブロック156で構成されるメッセージをパッキングして、図23に示すようなメッセージパケットを生成する場合、メッセージ管理部113a,113bは、メッセージヘッダ150のメッセージ長160、第1メッセージブロック152のメッセージ長161,第2メッセージブロック155のメッセージ長162,第3メッセージブロック156のメッセージ長163と、メッセージブロック間を接続する連結ポインタ151、153、154の位置を把握しておかなければならない。すなわち、メッセージ管理部113a,113bでは、異なるプロセッサ上に存在するタスク間で交換される全てのメッセージのフォーマットを認識しておく必要がある。
そのため、メッセージの数の増加にともなってメッセージ管理部113a,113bのプログラムサイズが増大するという問題が生じる。また、ユーザプログラムの位置透過性を実現した場合、機能の追加にともない、プロセッサ間で交換されるメッセージが追加、変更されることも考えられる。メッセージ管理部113a,113bが、全てのメッセージフォーマットを認識する必要があるため、メッセージ変更のたびにメッセージ管理部113a,113bのプログラムを検証しなければならないという問題が生じる。
しかしながら、記憶領域管理部114a,114bが、この発明にかかる記憶領域管理方法を用いてメモリ40を管理した場合、メモリ40をn(1<n,nは自然数)のべき乗のサイズのメモリサイズのメモリブロック単位で管理しているので、メッセージ管理部113a,113bは、メッセージのフォーマットを意識することなく、複数のメッセージブロックからなるメッセージをパッキングしてメッセージパケットを生成することを可能となる。
記憶領域管理部114a,114bが、この発明にかかる記憶領域管理方法を用いてメモリ40を管理した場合、ユーザはメモリ要求を行って記憶領域管理部114a,114bによって提供されたメモリブロックにメッセージブロックを生成する。そのため、メッセージ管理部113a,113bは、メッセージブロックの先頭メモリアドレスがわかればサイズ管理テーブル31からメッセージブロックが記憶されているメモリブロックのメモリサイズ、すなわちメッセージ長(メッセージブロックサイズ)を取得することができる。そのため、メッセージ管理部113a,113bは、メッセージ長を認識する必要が無い。したがって、接続するメッセージブロックが記憶されているメモリアドレスが登録される連結ポインタの位置が既知であれば、メッセージ管理部113a,113bは、メッセージを構成する各メッセージブロックのフォーマットを意識することなくメッセージを1つの連続するパケットにパッキングすることができる。
そこで、この発明にかかる実施の形態8のメッセージ管理方法では、全てのメッセージブロックの連結ポインタの位置をメッセージブロックの先頭からオフセットN(Nは自然数)に固定することで、メッセージ管理部113a,113bがメッセージブロックのフォーマットを意識することなく、メッセージを1つの連続するパケットにパッキングして、複数のプロセッサからなる分散環境においてもメッセージを交換することを可能にする。
図24は、メッセージブロックのオフセットNが「0」の場合のメッセージ構成の一例を示す図である。図24では、オフセットNが「0」であるので、各メッセージブロック170,172,174,176の先頭に連結ポインタ171,173,175,177が位置している。
図25のフローチャートを参照して、メッセージ管理部113a,113bの動作を説明する。ユーザ(タスク)からメッセージ送信要求を受けると、メッセージ管理部113a,113bは、同一CPU内のタスクへのメッセージ送信要求であるか否かを判定する(ステップS600,S601)。
同一CPU内のタスクへのメッセージ送信要求ではない場合(異なるCPU内のタスクへのメッセージ送信要求の場合)、メッセージ管理部113a,113bは、メッセージ送信要求に含まれるメッセージブロックが記憶されているメモリブロックの先頭メモリアドレスを処理対象メモリアドレスとし、処理対象メモリアドレスとサイズ管理テーブル31a,31bとに基づいてメモリサイズ(メッセージブロック長)を取得する(ステップS602)。
メッセージ管理部113a,113bは、処理対象メモリアドレスおよびメッセージブロックサイズに基づいてメッセージブロックをシステムが用いるメモリにコピーする(ステップS603)。メッセージ管理部113a,113bは、コピーしたメッセージブロックの連結ポインタにメッセージブロック長を登録する。これにより、メッセージパケットを受け取ったメッセージ管理部113a,113bは、メッセージブロック長を知ることができるので、メッセージパケットからメッセージを再構築することができる。
メッセージ管理部113a,113bは、メッセージブロックの連結ポインタに登録されている次に接続されるメッセージブロックの先頭メモリアドレスを取得する(ステップS604)。メッセージ管理部113a,113bは、取得した先頭メモリアドレスがつぎに接続されるメッセージブロックが存在しないことを示すコード、たとえば「NULL」になるまで、取得した先頭メモリアドレスを処理対象メモリアドレスとしてメッセージブロックサイズを取得してメッセージブロックを前回コピーしたメッセージブロックに連続してコピーする動作を繰り返す(ステップS602〜S605)。
メッセージを構成するメッセージブロックを全てコピーしてメッセージパケットを生成すると、メッセージ管理部113a,113bは、メッセージ送信要求が示すCPUのメッセージ管理部113b,113aにバス間、スイッチ間のメッセージ転送、或いはネットワークを介したIP転送、MAC転送などを用いて生成したメッセージパケットを送信して処理を終了する(ステップS606)。
一方、同一CPU内のタスクへのメッセージ送信要求の場合、メッセージをパッキングしてメッセージパケットを生成する必要がないので、メッセージ管理部113a,113bは、同一CPU内メッセージ送信を実行して処理を終了する(ステップS607)。
図24に示したメッセージから図26に示すメッセージパケットを生成する場合は、メッセージ送信要求に含まれるメッセージヘッダ(Message Header)170の先頭メモリアドレスおよびサイズ管理テーブル31から取得したメッセージブロック長180に基づいてメッセージヘッダ170をコピーし、連結ポインタ171に登録されている第1メッセージブロック172の先頭メモリアドレスおよびサイズ管理テーブル31から取得したメッセージブロック長181に基づいて第1メッセージブロック172をコピーし、連結ポインタ173に登録されている第2メッセージブロック174の先頭メモリアドレスおよびサイズ管理テーブル31から取得したメッセージブロック長182に基づいて第2メッセージブロック172をコピーし、連結ポインタ175に登録されている第3メッセージブロック176の先頭メモリアドレスおよびサイズ管理テーブル31から取得したメッセージブロック長183に基づいて第3メッセージブロック172をコピーする。
このようにこの実施の形態8では、記憶領域管理部114a,114bがメモリ40a,40bをn(1<n,nは自然数)のべき乗のサイズのメモリサイズのメモリブロック単位で管理してサイズ管理テーブル31にメモリブロックのメモリサイズを登録していることに着目して、メッセージブロックの先頭からオフセットNの位置に連結ポインタを設けるようにしているので、メッセージ管理部113a,113bは、プロセッサ間で伝達されるメッセージのフォーマットを認識することなくタスク間の通信に利用する複数のメッセージブロックを有するメッセージを1つの連続領域からなるメッセージパケットにパッキングすることが可能となり、メッセージブロックのメッセージ長およびポインタ位置を把握しなければならない場合と比較してプログラムサイズを小さくすることができる。
また、メッセージのフォーマットを認識することなくメッセージパケットを生成することができるため、メッセージブロックのメッセージ長およびポインタ位置を把握しなければならない場合と比較してメッセージパケットを生成する時間を短縮することができる。
また、メッセージの構造やメッセージブロックを識別することなくメッセージをパッキングすることができるので、新たなメッセージが追加された場合でもマルチプロセッサシステムのリアルタイムOSを変更する必要が無い。そのため、マルチプロセッサシステムのリアルタイムOSを用いたシステムの検証として、追加されたメッセージに関する検証だけを行なえばよく、試験評価時間を短縮することができる。