2012-04-25 25 views
5

32ビットLinuxシステムでは、プロセスは最大4 GBの仮想アドレス空間にアクセスできます。しかし、プロセスは、それを保留する度合いを変えて保守的であるように見えます。したがって、mallocを使用するプログラムはsyscall sbrk/brkによってデータセグメントを拡張することがあります。これらのページでさえ、まだ物理メモリで要求されていません。私が完全に理解していないのは、最初にsbrkする必要がある理由です。なぜなら、私たちがそれらのブロックに触れる/主張するまでは、本質的に自由な操作ですからです。仮想メモリとsbrk

答えて

5

ファイルをメモリマップするとどうなりますか(Linuxでは非常に一般的なことです)?それはアドレス空間のどこかに行かなければならないので、「使用済み」と「未使用」の部分を定義する手段が必要です。
共有メモリ(実際には実際のファイルのないファイルをマッピングするだけです)は同じです。それはどこかに行かなければならず、OSは何かを上書きせずにそれを置くことができると確信しなければならない。

また、明らかな(そしてあまり明らかでない)効率の理由のために、参照の局所性を維持することが好ましい。アドレス空間のどの場所にでも書き込んだり読み込んだりすることが許されていれば、それだけで何人かの人が賭けることができます。

+0

「共有メモリ( ) 同じです。 OSはどこかに移動しなければならず、OSは何かを上書きせずに置くことができなければなりません。 "mallocがmmapを(匿名でプライベートで)私が信じているかもしれないと呼んでいるようにsbrkを呼び出すのではなく、プログラムの初期化時にmallocがbrk(4GB)を実行していればsysckなどのsyscallを削除しますが、追加のメモリマップファイルをマップしたり、共有メモリを別のフラグで作成することはできません。 –

+0

"わかりやすい(そしてあまり明らかでない)効率の理由から、参照の局所性を維持することも好ましい"しかし、1GBを4GBのブロックに、3GBのメモリを4GBのブロックにすると、おそらく新しい割り当てがセグフォルトインされた後で物理メモリに閉じ込められているか(ちょうどゼロになる)? –

+0

それはそうかもしれません。 – Damon

4

頭に浮かぶの理由のカップルがありません:

  • あなたはもはや
  • マップされていないメモリにアクセスする際Translation lookaside buffer(TLB)は、おそらくそれを設定するために多くの時間を必要とする、より大きなだろうセグメンテーションフォールトを取得したいですあなたは新しい共有ライブラリまたはmmapの中にロードする場合
  • までとにかくそのメモリの一部のマッピングを解除する必要があると思います()実際には、実際のファイルを使用せずにファイルをマッピングしている何か
関連する問題