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 秒間のスリープの後、「トップ コマンド」出力の常駐メモリがいっぱいになり始め、最終的にすべての仮想メモリが 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 実行し、住居のサイズに気付いたとき、わずか数キロバイトしかありません。残りのページはどこにありますか? それらはディスク上にありますか?

4

1 に答える 1

0

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

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

于 2016-11-29T16:18:14.403 に答える