FreeBSD の比較的新しい VM の解説2009年02月23日 00時15分21秒

少し、FreeBSD の VM 関連の記事を探してみた。Design elements of the FreeBSD VM system by Matthew Dillon あたりが、比較的新しく現状を記述しているみたいだった。

このページは、何故だかファイル名が -text で終わっている。実質的には HTML で書かれていた。しかし、タグに若干問題があるらしく HTML として表示するには、最初の数行を修正する必要があった。

以下に、冒頭部分を要約した。本文には、VM オブジェクトの扱いから、各種最適化方法が更に綴られている。

FreeBSD 3.x の頃のスワップは事前に割り当ててあった配列を元にした実装だった。そのため、カーネルのメモリが断片化しやすく、また線形検索だった為、速くはなかった。また、カーネルメモリの割り当てもスワップ時に起きていたので、デッドロックの可能性もあった。

FreeBSD 4.x の時にスワップシステムを完全に書き換えた。線形配列ではなく、ハッシュテーブルを元にした実装に変えた。radix tree を用いたビットマップにて、スワップは管理されている。これにより、O(1) でスワップの割当と開放が出来るようになった。 また、radix tree は事前にメモリを割り当ててあり、メモリが少なくなった時に、スワップを行なう為にメモリを割り当てる事は無い。radix tree の断片化を防ぐために、大きな連続した塊としてスワップが機能するようになっている。

FreeBSD のスワップ機構は、メモリが圧迫している時に最も効率が良くなるようにデザインされている。スワップが一度起こると、ディスクアクセスが発生する。余計なディスクアクセスを起こすくらいなら、それを避けるために多めの計算量で必要であっても、ディスクとデータをやり取りを避けられるのなら、よっぽど短時間で済ませる事が出来る。そのため、FreeBSD のメモリ管理システムは、他の OS と比べてもメモリ圧迫時に、優れた性能を発揮する。