7

私はこれらの質問に非常に混乱しています。

  1. 32 ビット プロセッサでは、すべてのプロセスに 4 GB の仮想メモリがあります。ただし、すべてのプロセスに 4 GB のスペースがある場合、100 のプロセスが実行されている場合はすべての巨大な量になります。これはスワップ領域よりも大きくなります。誰かがこれを説明してもらえますか; 私は非常に混乱しています。

  2. オペレーティング システムはどのようにメモリをプロセスに割り当てますか? プロセスに があるとしますa = malloc(2)。このメモリをプロセスに割り当てるのは誰ですか? OS は、これらの 2 バイトのメモリをプロセスに割り当てますか。
    (セグメンテーション エラーを生成する a[2] にアクセスします)。

  3. プロセスのさまざまな部分 ( Code 、 Data 、 Stack、 Heap ) は、メイン メモリまたはセカンダリ メモリのどこに残りますか。

私が見つけたリンクは仮想メモリを完全に説明していないので、仮想メモリとそのメカニズム全体を理解できるように、良いリンクを教えてください。

4

4 に答える 4

3
  1. 仮想メモリがスワップ領域よりも大きいか小さいかは誰が気にしますか? それはどのような違いをもたらしますか?(たとえば、2GB のファイルを読み取り専用でマップすると、2GB の仮想メモリが使用されますが、スワップ領域はなく、ごくわずかな量の物理メモリしか必要ありません。)

  2. OS は、プロセスの仮想メモリ空​​間を単純に拡張します。決算書を変更するだけです。アドレス空間の内容を変更しようとするまで、物理メモリは必要ありません。(実際には、プロセス自体がこれを行う可能性が高く、より大きなチャンクが必要な場合にのみ、OS に仮想メモリ空​​間を拡張するように要求します。)

  3. それらは、オペレーティング システムがそれらを別の場所に移動するか破棄することを選択するまで、物理メモリに残ります (最初に障害が発生したと仮定します)。それらが別の場所に移動されるか、破棄されると、ページ フォールトを通じてアクセスされたときにページインされるか、再作成されます。(OS は、物理メモリを貴重なリソースとして管理し、OS が最適と考える方法で付与します。)

ちなみに、ほとんどの 32 ビット OS では、OS 自体がその仮想メモリ空​​間の 1GB または 2GB を占有し、プロセスが実際に使用できるのは 2GB または 3GB だけです。64 ビット OS では、OS はそのスペースをまったく使用しないため、32 ビット プロセスで 4GB をすべて使用できます。

于 2012-07-24T07:06:02.523 に答える
2

1) 各プロセスには 4GB の仮想メモリ空​​間がありますが、一度に割り当てる必要はありません。オペレーティング システムは、物理メモリのどの部分がその仮想空間にマップされ、どの部分がまったくマップされないかをMMUに指定します。マップされていない部分にアクセスすると、プロセッサに障害が発生し、オペレーティング システムは通常 segfault を生成します。メモリの領域が物理メモリ空間ではなくスワップ空間にあることをプロセッサに伝える「存在しない」というマーカーもあるため、プロセッサに障害が発生し、オペレーティングシステムはページを物理メモリにスワップしてから再開します。中断したプロセス。プロセスのページ テーブルを記述するには、数バイトのメモリしか必要ないため、100 のプロセスは、実際に要求するまでそれほど多くのメモリを使用しません。

2) 多くのメモリ割り当てアルゴリズムがあります。通常、オペレーティング システムは一度に大きなメモリ ブロックしか割り当てないため、malloc() の呼び出しによってオペレーティング システムが呼び出されることがありますが、ほとんどの場合、マイクロ管理を処理するのは C 標準ライブラリの実装の詳細です。配列の境界外へのアクセスがセグ フォールトを生成するという保証はありません。これは、以前に malloc された別の配列の一部であるか、標準ライブラリが将来のために追跡している空き領域の一部である可能性があるためです。したがって、セグメンテーション違反は発生しません。ただし、そのようなエラーを検出する valgrind などのデバッグ ツールがあります。

3) 各セグメントの場所に関する詳細はオペレーティング システムに依存しますが、一般的で移植可能なコードの場合、知る必要はありません。

これらすべてのトピックの詳細については、osdev wiki、特にページングメモリ割り当てに関する部分を参照してください。

于 2012-07-24T13:18:12.030 に答える
0

あなたからの重大な誤解は、仮想メモリとメモリの違いです。プロセス POV からは違いはなく、プロセスはメモリにのみアクセスし、物理 (RAM) と仮想メモリの間でデータの一部を交換するのは OS です。

1) プロセスのアドレス空間が最大 4GB に達することができるということは、各プロセスに 4GB が割り当てられているという意味ではありません。OS は、必要に応じてそれらにメモリを割り当てます。

2) OS はメモリ (*1) をブロック単位で提供します。malloc を実行すると、プログラム メモリを内部的に管理する malloc 関数がプロセス メモリ内で必要なスペースを取得し、ポインタを返します (おそらく、そのプロセスで OS に追加のメモリを要求しますが、必須ではありません)。

3) 最初に始めたように、これは OS の問題です。各 OS は、仮想化する部分としない部分を決定できます。スワップの数を減らすには、複雑な戦略が必要です。

*1 VM ではなく、メモリについて話していることに注意してください。アプリケーションは、メモリのどの部分が仮想または物理であるかを認識せず、それらに対して透過的です。

于 2012-07-24T07:17:55.297 に答える
0

最初: 32bit は 32bit を意味します。より多くのメモリ空間をアドレス指定するためのビットはもうありません。マルチプロセッサ システムは新しい発明ではありません。32ビットでは、4ギガのスペースしかアドレス指定できません。PAE http://en.wikipedia.org/wiki/Physical_Address_Extensionのようないくつかの回避策があります。

2 番目と 3 番目..今日の仕組みはよくわかりません。しかし、http://en.wikipedia.org/wiki/Virtual_memoryを見てください。

于 2012-07-24T07:10:05.300 に答える