私は、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秒スリープした後、「topコマンド」の出力に常駐メモリがいっぱい、最終的に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とし、住宅サイズに気づいた場合、残りのページは何キロバイトですか?それらはディスク上にありますか?