2016-11-29 11 views
0

私は、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とし、住宅サイズに気づいた場合、残りのページは何キロバイトですか?それらはディスク上にありますか?

答えて

0

オペレーティングシステムは、malloc呼び出しをサポートするために、デマンドゼロのページを作成する可能性があります。ディスクから強制的に読み込むことをここでやったことがあります。

ページが変更された後に2番目のループを試行して、ページフォルトが発生するかどうかを確認することができます。

関連する問題