II-6-3. メモリの割り当て方法

カーネル内でのメモリ確保の方法と、そのインタフェースについて説明する。また、カーネル内でのメモリ確保特有の制限や、システムとして提供するメモリ確保のアルゴリズムについても述べる。

【学習の要点】

* カーネル空間は通常ページング不可能である。

* カーネルの使用できるメモリ領域には制限がある。このため、短期的なメモリであっても、現実的にはカーネルが必要とする際には動的に確保する必要がある。

* カーネルがメモリを動的に割り当てるために、必要とされるサイズや高速性要件に適したいくつかの異なるアルゴリズムとそれに対応するインタフェースが用意されている。

図II-6-3. 階層化されたメモリ管理システム

【解説】

1) カーネル内での動的メモリ領域確保

* カーネル内では、メモリの使用に関して幾つかの制限がある。

- 使用するメモリのほとんどはページング不可能である。

- 通常、アドレス固定の連続した物理メモリ領域を必要とする。

- 高速性が最も重要となる。多くの場合、カーネルは即座に(処理をブロックすることなしに)メモリ領域を確保する必要がある。

2) カーネル内での動的メモリ領域確保用インタフェース

* ユーザプロセスは、malloc(), free()システムコールを用いて動的なメモリ領域の確保を行う。カーネル内でも、動的にメモリ領域を確保するために、malloc()と似たインタフェースが用意されている。Linuxでは以下のインタフェースが使用できる。

- kmalloc(), kfree()

カーネルが連続した物理メモリ領域を確保するために使用。物理メモリ上に連続した領域を確保することで、空間的局所性が得られ、TLBを最大限活用できるため高速である。

- vmalloc(), vfree()

仮想メモリ領域から仮想的に連続したメモリ領域を確保するために使用。kmalloc(), kfree()と異なり、物理メモリ領域上では連続しているとは限らない。このため、速度は劣るものの大きな領域を確保することができる。

3) メモリ確保の構成要素

* ページレベルアロケータ

ページレベルアロケータは、ハードウェアによって行われたアドレス変換の結果得られたページをカーネルメモリアロケータとページングシステムに渡すインタフェースを提供する。

4) ページングシステム

ページングシステムは、仮想メモリシステムで用いられる、「デマンドページング」や「スワッピング」ポリシーを実装するものである。主にユーザプロセスに対してメモリ確保の仕組みを提供する。

* カーネルメモリアロケータ

- 2の累乗フリーリスト

ページ単位よりも小規模なメモリを確保したい場合、ページングシステムでは内部断片化が起こる。このような場合、ページを2nの大きさを持った小さなゾーンに分割する戦略が取られる。これは「2の累乗フリーリスト」として知られる。これを発展させたものに「バディシステム」がある。

- スラブアロケータ

Linuxには、さらに効率的(断片化を極力抑える)にメモリ領域を確保できる「スラブアロケータ」が用意されている。これは、オブジェクトに対してスラブと呼ばれる連続した物理メモリ領域を割り当て、この領域を次回同種のオブジェクトに対するメモリ要求があった場合に再利用するものである。