32 ビット Linux システムでは、プロセスは最大 4 GB の仮想アドレス空間にアクセスできます。ただし、プロセスは、そのいずれかを予約する際にさまざまな程度で保守的であるようです. そのため、malloc を使用するプログラムは、syscall sbrk/brk によってデータ セグメントを拡張することがあります。これらのページでさえ、物理メモリではまだ要求されていません。私が完全に理解していないのは、なぜ最初に sbrk が必要なのかということです.なぜ sbrk 呼び出しを避けて 4 GB のアドレス空間を与えないのですか?
質問する
819 次
2 に答える
5
ファイルをメモリマップするとどうなりますか(Linuxで行うのは非常に一般的なことです)。アドレス空間のどこかに配置する必要があるため、「使用済み」と「未使用」の部分を定義する手段が必要です。
共有メモリ(実際には実際のファイルなしでファイルをマッピングしているだけです)は同じです。それはどこかに行かなければならず、OSは何かを上書きせずにそれを配置できることを確認する必要があります。
また、明白な(そしてあまり明白ではない)効率上の理由から、参照の局所性を維持することが好ましい。アドレス空間の任意の場所への書き込みと読み取りが許可されている場合、一部の人がそれを実行することは間違いありません。
于 2012-04-25T09:42:17.860 に答える
4
いくつかの理由が思い浮かびます。
- マップされていないメモリにアクセスするときにセグメンテーション違反が発生しなくなりました
- 変換ルックアサイド バッファー(TLB) が大きくなり、セットアップに時間がかかる可能性があります。
- 新しい共有ライブラリまたは mmap() 何かをロードする場合は、とにかくそのメモリの一部をマップ解除する必要があります
于 2012-04-25T09:45:26.557 に答える