プロセスが開始されると、プロセスは自身の仮想アドレス空間を取得します。仮想アドレス空間のサイズは、オペレーティングシステムによって異なります。一般に、32ビットプロセスでは4 GiB(4ギガバイナリ)アドレスが得られ、64ビットプロセスでは18 EiB(18 exaバイナリ)アドレスが得られます。
仮想アドレススペースにマップされていないものには、決して定義されていないものはアクセスできません。そこにマップされていないものにはアドレスはありません。あなたは現在何にもマップされていない仮想アドレス空間の領域にアクセスしようとするかもしれません。その場合、segfault例外が発生します。
アドレス空間のすべてが、ある時点で何かにマッピングされているわけではありません。また、すべてがマップされているわけではありません(マップされるマップの量は、プロセッサーとオペレーティングシステムによって異なります)。現在の世代のIntelプロセッサでは、アドレス空間の最大256 TiBがマッピングされます。オペレーティングシステムはこれをさらに制限する可能性があることに注意してください。たとえば、32ビットプロセス(最大4つのGiBアドレスを持つ)の場合、Windowsはデフォルトでシステムに2 GiB、アプリケーションに2 GiBを予約します(ただし、システムに1 GiB、アプリケーションに3 GiBにする方法があります)。
アプリケーションの実行中に変更されるアドレス空間の量と変更量。オペレーティングシステム固有のツールを使用すると、現在割り当てられているメモリと仮想アドレス空間が実行中のアプリケーションのものであるかどうかを監視できます。
コードセクション、データセクション、BSSなどは、リンカーによって作成された実行可能ファイルのさまざまな領域を参照する用語です。一般に、コードは、静的に割り当てられるが変更可能なデータとは別の静的な不変データとは別個のものである。スタックとヒープは、上記のものとは別のものです。それらのサイズは、コンパイラとリンカによって計算されます。各バイナリファイルにはそれぞれ独自のセクションがあるので、動的にリンクされたライブラリはアドレス空間に別々にマップされ、それぞれのセクションはどこかにマップされます。ただし、ヒープとスタックはバイナリイメージの一部ではありません。通常、プロセスごとに1つのスタックと1つのヒープがあります。
スタックのサイズ(少なくとも最初のスタック)は一般的に固定です。コンパイラおよび/またはリンカには、通常、実行時に必要なスタックのサイズを設定するために使用できるフラグがいくつかあります。スタックは一般的に「後退する」というのは、それがプロセッサスタック命令の仕組みだからです。スタックが一方向に成長し、残りが成長すると、両方を無制限にしたいが、どれだけ成長できるか分からない状況では、メモリを整理することが容易になります。
ヒープは、一般に、プロセスの開始時に事前に割り当てられていないものを指します。最低レベルでは、ヒープ管理に関連するいくつかの論理操作があります(すべてのオペレーティングシステムでここで説明するようにすべてが実装されているわけではありません)。
アドレス空間は固定されていますが、一部のOSはプロセスによって現在どの部分が再生されているかを把握しています。これが当てはまらない場合でも、プロセス自体はそれを追跡する必要があります。従って、最低レベルの動作は、アドレス空間の特定の領域が使用されることを実際に決定することである。
第2の低レベルの操作は、OSにその領域を何かにマップするように指示することです。これは、一般的に
スワップおよびいくつかの他のファイル
にマッピングされ
-
システムのスワップファイルにスワップとマッピングされたメモリである
メモリをスワップに対応していませんいくつかのメモリとすることができます
読み取り専用モードでスワップ可能で、他のファイルにマップされているメモリ
別の仮想アドレス領域が他の仮想アドレス領域をマップする、同じマッピングが
別の仮想アドレス領域をマップする、同じマッピングが
にマッピングされたが、読み取り専用モードにあるのと同じマッピングが、デフォルトのスワップファイルにマッピングされたコピーされたデータと書き込みモードのコピーで
は、私が忘れてしまった他の組み合わせがあるかもしれませんが、それらは主なものです。
もちろん、実際に使用されるスペースの合計は、その定義方法によって異なります。現在使用されているRAMは、現在マップされているアドレス空間とは異なります。しかし、私が上記に書いたように、オペレーティングシステムに依存するツールでは、現在何が起きているのかを知ることができます。
プログラミングに関する質問ではありません。 – unwind