malloc() を使用して 50Mb のメモリを割り当て、ループを使用してすべてのページを「タッチ」して常駐させる、以下の小さな C プログラムを作成しました。
int main ()
{
// Map 50M to RAM
unsigned char *p = malloc(52428800);
sleep(5);
// Touch every page
for (int i = 0; i< 52428800; i+=4096)
p[i] = 1;
sleep(100000);
}
実際、プログラムは動作しているように見えます。つまり、最初の 5 秒間のスリープの後、「トップ コマンド」出力の常駐メモリがいっぱいになり始め、最終的にすべての仮想メモリが RAM に割り当てられます。
PID %MEM VIRT RES CODE DATA SHR
32486 0.6 55396 52360 4 51528 1104
プログラムのページ フォールトに気付きましたが、小さなものしかありません。
ps -ef -o min_flt,maj_flt 32486
MINFL MAJFL
12879 0
主要なページ フォールトがあってはなりませんか? 私が理解している限り、malloc() を使用すると、50Mb の仮想アドレス空間が作成されます。各仮想ページに書き込む前の実際の常駐サイズは非常に小さいですが、書き込み後は要求された仮想メモリに等しくなります。
ページを「タッチ」すると(ページを居住させるために)、各ページがディスクからDRAMに移動されますよね?それでは、メジャー ページ フォールトが発生しないのはなぜでしょうか。
また、malloc() を 50m 実行し、住居のサイズに気付いたとき、わずか数キロバイトしかありません。残りのページはどこにありますか? それらはディスク上にありますか?