Tetsuo Handa
from-****@i-lov*****
2009年 5月 22日 (金) 17:47:55 JST
熊猫です。 Hiroshi Shinji さんは書きました: > これって、ポリシーが削除済みかどうかのマーキングをするための領域分、 > 増加したということでしょうか? いいえ、削除済みかどうかのマーキングするための領域は既にあります。 メモリ消費の増加は、主に以下にあげる6項目が原因です。 (1)文字列を解放可能にするために ページ単位(多くの環境では4096バイト)でメモリを割り当て、可能な限り多くの 文字列を保持する。 ↓ 文字列毎にその文字列の長さ以上(32以上の2のべき乗の長さ)のメモリを 割り当て、その文字列だけを保持する。 という仕様変更により最大で約50%のメモリ消費増。(メモリ管理機構の仕様により 文字列の長さピッタリのバイト数を割り当てることはできないため、例えば長さ16 バイトの文字列を保持するためには32バイト、長さ65バイトの文字列を保持する ためには128バイトのメモリが割り当てられてしまいます。) (2)文字列を解放可能にするために 文字列のリストを単方向リンクリストで管理する。 ↓ 文字列のリストを双方向リンクリストで管理する。 という仕様変更により文字列1個につき sizeof(struct list_head *) (32ビット 環境では4バイト)のメモリ消費増。 (3)文字列を解放可能にするために 文字列に対してリファレンスカウンタを使用しない。 ↓ 文字列に対してリファレンスカウンタを使用する。 という仕様変更により文字列1個につき sizeof(atomic_t) (32ビット環境では 4バイト)のメモリ消費増。 (4)リストから要素を削除できるようにするために リストの要素を単方向リンクリストで管理する。 ↓ リストの要素を双方向リンクリストで管理する。 という仕様変更により要素1個につき sizeof(struct list_head *) (32ビット環境 では4バイト)のメモリ消費増。 (5)リストから要素を削除できるようにするために リストの要素に対してリファレンスカウンタを使用しない。 ↓ リストの要素に対してリファレンスカウンタを使用する。 という仕様変更により要素1個につき sizeof(atomic_t) (32ビット環境では 4バイト)のメモリ消費増。 (6)リストの要素のサイズを if 節の有無に依存させないようにするために アクセス許可に if 節がある場合だけメモリ領域を割り当てる。 ↓ アクセス許可に if 節が無くてもメモリ領域を割り当てる。 という仕様変更により要素1個につき sizeof(atomic_t) (32ビット環境では 4バイト)のメモリ消費増。 この内、(2)(4)については(GCとは無関係ですが) TOMOYO 2.2.0 では既に 採用されています。 TOMOYO 2.x でGCを搭載するために(1)(3)(5)が必要に なります。 今後 TOMOYO 1.x の機能を 2.x に移植していく上では、 1.x と 2.x が同様の構造に なっているほうが移植しやすいでしょうから、 TOMOYO 2.x がGCを搭載することに なるのであれば、この機会に TOMOYO 1.x も書き換えるのもありかと思います。 GCが搭載されると、学習モードでの動作中にバックアッププログラムなどによりMB 単位のメモリが割り当てられてしまった場合でも、システムを再起動させることなく 不要なメモリを解放できるようになります。 > オプション指定してGCを有効/無効にすることはできるのでしょうか? カーネルコンフィグでの指定はできなくは無いでしょうが、 ソースコードが #if の嵐になる恐れがあります。