Windowsの物理メモリの使用状況
Windowsの物理メモリがどのように使われているかを調べてみました。
(本当に正しいかどうか怪しいですけど・・)
検証に使ったマシンは、メインメモリ2GBで、OSはWindowsXPです。
次の図は、OSが起動してからあまり時間が経っていないときに、mallocして確保したメモリが、物理メモリ上でどのアドレス(物理ページ)に配置されるかを図にしてみたものです。
16MBytesの領域をmallocで確保して物理ページを調べ、その後freeし、再びmallocして調べ・・ということを延々と繰り返しています。
なお、画面上の1ドットが1物理ページ(=4096バイト)に対応しています。一度使った点を消していないので、物理アドレス上のどの領域がどんなふうに使われていくかがわかります。
(クリックでアニメーションします。アニメーションGIFのサイズ3882kB)
Windowsが起動後間もないので、比較的連続して固まった領域を確保できています。
次は、起動してから少しだけ時間が経ったときの物理メモリ使用状況です。
(クリックでアニメーションします。アニメーションGIFのサイズ5054kB)
確保できている領域が少しだけばらけてきました。
最後に、起動してから十分に時間が経ったときのようすです。
mallocで取った16MBytesのメモリ領域は、物理メモリ上ではかなり断片化されて広大な範囲に確保されていることがわかります。
(クリックでアニメーションします。アニメーションGIFのサイズ6424kB)
まぁ、物理メモリ上でいくら断片化していようとも、アプリケーションから仮想メモリでアクセスする分にはTLB(PTE)が自動変換してくれるから、全く気にしなくてもいいんですけど、DMAをするには大事なことなので、調べてみました。
わかってきたのは、
・Windowsが起動してから時間が経つと、mallocで確保された領域はどんどんばらける傾向にある。
・mallocとfreeを繰り返すと、物理アドレスが大きくなる方向に確保されていく。
・物理アドレス0番地から、普通に使われている。
・mallocとfreeを繰り返すと、物理メモリのほとんどの領域は満遍なく使われるが、物理メモリ上で決して使われない領域がある。おそらく、非ページメモリに割り当てられた領域か、他のプログラムが使っていて開放していない領域と思われる。(32~160MBytes付近、512MBytes付近、最後の32MBytes付近)
・連続した領域が確保されやすい場所(最初の512MBytesあたりまで)と、確保されにくい場所(後半)といった傾向はある
・大きなサイズの連続した非ページ領域を確保するのって、結構大変なことなのかも。
ということでした。
このツールを作ってみたきっかけは、DMA用のデバイスドライバを作るために、MapTransferとかで苦労してスキャッタギャザリストを取得してみたら、MDLの中身と同じだったということで、図示してみたくなったということです。
Windowsのプログラミングでは、物理メモリは秘められた世界です。カーネルモードのプログラムでさえもメモリの物理アドレスを直接扱う機会はありません。そういうところを調べるのが好きです。
最近のコメント