同時に実行されている多くのプログラムがあるとします。
実行される各実行可能プログラムは、RAM 内に独自のコード、データ、およびスタック セグメントを持っていますか、それとも 4 つのセグメントに分割された完全な RAM であり、これらのセグメントのそれぞれが各プログラムのそれぞれのセグメントを保持していますか。
3 に答える
これは、次の 2 つの条件に依存します。
- デプロイ アーキテクチャ
- プロセスを実行する OS
一般的な主流の Linux、Windows、BSD で x86 を実行している場合は、
- 各プロセスには独自のプライベート仮想 RAM があります
- すべてのセグメントのテキスト (コード)、ヒープ、データは同じ論理アドレス空間 (仮想 RAM セグメント) にあります。
歴史的に、x86 はセグメント化されたメモリをサポートする機能を備えて設計されていましたが、OS がそれを利用することはなく、そのサポートは AMD64 で最初に削除されました。最近のプロセッサーは、仮想化とハイパーバイザーで使用するために再びサポートしています。現在、ユーザーランド アプリケーションはセグメンテーションなしでデプロイされるのが一般的です。
簡単な答え: 実行しているハードウェアと OS によって異なります。
通常、各プロセスは独自の仮想メモリ空間を取得するため、コンピューター上で実行されている唯一のプロセスのように見えます。その仮想メモリ空間は、OS によってコード/データ/スタック セグメントに分割されます (これらには通常、固定/共通アドレスがあります)。
物理的な RAM の使用量に関しては、OS に完全に依存します。RAM のさまざまなセクションを好きなように使用でき、プログラムはそれを認識しません。
この質問はオペレーティング システム固有のものであり、C 固有のものではありません。
一般に、OS はプロセスごとに実行コンテキストを維持し、スタックとランタイム フラグを保持しますが、メモリの割り当て方法はmalloc
システムによって異なります。
詳細については、ドキュメントをさらに深く掘り下げることをお勧めしmalloc
ます。