質問に答えるには、まず、最新のオペレーティングシステムで、stack
とheap
の割り当てについて少し説明しなければなりません。
stackは、メモリの割り当てを継続することです。ここで、cpuはpush
とpop
コマンドを使用してスタックの先頭からデータを追加/削除します。私はあなたがすでにスタックの仕組みを知っていると仮定します。プロセスストア - 戻りアドレス、関数の引数およびローカル変数をスタックオーバーします。関数が呼び出されるたびに、より多くのデータがプッシュされます(最終的にはスタックオーバーフローにつながる可能性があります。データがポップされることはありません - 無限再帰)。スタックサイズは、プログラムがメモリにロードされるときに固定されます。ほとんどのプログラミング言語では、コンパイル時にスタックサイズを決めることができます。そうでない場合、デフォルトを決定します。 Linuxでは、最大スタックサイズ(ハードリミット)はulimit
で制限されています。サイズはulimit -s
で確認、設定できます。
しかし、ヒープスペースは、* nixシステムに上限がありません(ulimit -v
を使って確認してください)、すべてのプログラムはデフォルト/設定量のヒープで始まり、必要に応じて増やすことができます。プロセスのヒープスペースは、実際には2つのリンクされたリストfree
とused
ブロックです。ヒープからのメモリ割り当てが必要なときはいつでも、1つ以上の空きブロックが結合されて大きなブロックを形成し、使用済みリストに単一のブロックとして割り当てられます。解放するとは、ブロックを使用済みリストから空きリストに削除することです。ブロックを解放した後、ヒープは外部断片化を持つことができます。今度は空きブロックの数がデータ全体を含むことができない場合、プロセスはOSからより多くのメモリを要求します。一般に、新しいブロックは上位アドレスから割り当てられます。そこで、ヒープ成長の上向きの図を示します。私は言い換えます - ヒープは高い方向に連続的にメモリを割り当てません。
質問にお答えします。
コンパイル時またはロード時のアドレスバインディングでは、スタックと ヒープセグメントはプログラムの物理アドレス空間にどのように配置されますか?
固定スタックは、コンパイル時に割り当てられ、ヒープメモリが割り当てられます。どのように配置されているかは上で説明した。
ヒープとスタックの間のスペースは、プログラム のために予約されていますか、またはOSが他のプログラムに使用できるのですか?
はいこれはプログラム用に予約されています。しかし、プロセスはヒープに空きブロックを追加するために、より多くのメモリを要求できます。それはそれ自身のヒープを共有することとは異なります。
注:質問が広いので、ここで説明できるトピックがたくさんあります。それらの中には、ガベージコレクション、ブロック選択、共有メモリなどがあります。私はすぐにここに参照を追加します。
参考資料: -