|
ここでは、legOSにおけるメモリマネージャの動作について調べてみる。
|
|
カーネルがマルチプログラミングをサポートすると、
プロセスの生成や消滅にともなって動的にメモリを割り当てたり
開放したりする必要がある。
メモリマネージャはどこにどれだけの空きがあり、
どこがどのプロセスに使用されているかを把握し、
必要な時には必要なだけのメモリをプロセスに与えたり、
必要がなくなったときには空き領域資源として管理し、
将来の割り当てに備えなくてはならない。
legOSではメモリを不定長セグメント (i386以降のようなセグメント機構じゃなくてソフトで論理的に 分割した領域のこと!) に分割して管理する。 各セグメントは図3のようにヘッダ部分32bitをもつ 連続した領域であり、各々のヘッダ部分には使用しているプロセスID(16bit値) とそのセグメントのサイズ(16bit値)が格納される。 空き領域にはプロセスIDのかわりにMM_FREE(0x0000)が格納され、 そのセグメントが空き領域であることが示される。 また、セグメントサイズはバイトでなくクリックで管理され、 legOSでは1クリックが2バイトのサイズを持つ。 メモリをバイトでなくクリックで管理するのは そのほうが一般的に効率がよいからである。 (PCのように仮想メモリなどで32bitのメモリ空間を管理する場合などでは 256バイトのクリックサイズだったとして、 1024GBまでのメモリ空間が管理参照できる。) legOSのような小さなメモリ空間でクリックで管理する必要があるか どうかはちょっと疑問ではあるがとにかくそうなっている。 さらに、PCのような大規模なメモリ空間の管理には管理用の特別の メモリ領域を確保して空きセグメントリスト、使用セグメントリストを 設けて、メモリ管理はこのリストを参照して行われる。 (ギガバイト級のメモリを端っこから見てたら日がくれちゃうでしょ!) しかし、legOSでは管理すべき空間がそもそも狭いので、 メモリ空間そのものをリストとして管理参照している。
カーネルがメモリ割り当てを行う際まず始めに行うことは、
必要なだけの連続した空き領域が存在するかを調べることである。
カーネルはmm_startで示されるメモリマネジメント領域の最初のアドレス
からスタック領域の下限までの全てのメモリ空間から適切な空き領域
を選び出さなくてはならないが、legOSではこのアルゴリズムに
ファーストフィット法を採用している。
以下に代表的な探索アルゴリズムをならべて眺めてみる。
ファーストフィット
ネクストフィット
ベストフィット
ワーストフィット
クイックフィット
|
|
NO_MEMORY_MANAGEMENTマクロを未定義でコンパイルされたカーネルは 初期化シーケンスにおいてmm_init()の呼び出しでメモリマネージャを 初期化する。 初期化の手続きは以下。
以上が初期化内容である。 初期化直後のメモリイメージを図4に示す。 |
|
メモリの動的な確保の手続きを調べることでlegOSのメモリマネージャの働きが
全て分かるといっても過言ではないので調べてみることにする。
mallocは引数として確保すべき領域サイズ(bytes)を表す16bit値 size をとる。
いま見て来たように、空き領域と使用領域とにかかわらずリスト(メモリ) の始めから順番に検索しているのがちょっと引っかかるけれど、 まあmm_first_freeで少しはマネージャさんの負担を軽減してるわけだし、 legOSのメモリマネジメントは必要にして十分、 簡潔明瞭かつ高速な実装になっていると言えるよね! |