古い質問の繰り返しのように感じたら申し訳ありません。スタック オーバーフロー (tanenbaum による最新のオペレーティング システムの本) に関するいくつかの質問を調べましたが、これに関する疑問を解消する必要があります。
まず、この構造をよりよく理解するために、より詳細に調べるべき本/リソースをいただければ幸いです。これらがOSの本で一般的に説明されている概念なのか、プログラミング言語やアーキテクチャの本なのか、私には理解できません。
質問する前に、スタック/ヒープに関する読み取りに基づいて調査結果をリストします。
ヒープ
- すべてのインスタンス変数、動的に割り当てられた (new/malloc)、およびグローバル変数のみを含む
- データ構造ヒープを使用しなくなり、より複雑な構造を使用
- メモリ ロケーション、割り当てられたメモリを担当する個々のプロセスを介したアクセス
- 最適化とメモリの割り当ては OS によって行われます (はいまたはいいえの場合は、ヒープ、OS、またはランタイム環境を管理しているのは誰かという私の質問に答えてください)
- 参照にアクセスできるプロセス内のすべてのスレッド間で共有
スタック
- すべてのローカル変数のみが含まれます。(関数呼び出しでプッシュ)
- 操作には実際のスタック データ構造を使用
- 隣接しているためアクセスが速い
さて、同じことに関する私の質問のいくつかについて。
- グローバル変数、どこに割り当てられますか? (私の考えでは、それらはヒープに割り当てられます。もしそうなら、実行時またはコンパイル時にいつ割り当てられますか、そしてもう1つの質問は、このメモリを(削除を使用する場合のように)クリアできますか?)
- ヒープの構造は何ですか?ヒープはどのように構成されていますか (OS またはランタイム環境 (C/C++ コンパイラによって設定されている) によって管理されていますか)。
- スタックはメソッドとそのローカル変数のみを保持していますか?
- 各アプリケーション (プロセス) には個別のヒープが与えられますが、ヒープ割り当てを超えた場合、OS がそれ以上のメモリを割り当てることができなかったということですか? (メモリ不足により、断片化を避けるためにOSが再割り当てされると想定しています)
- ヒープは、プロセス内のすべてのスレッドからアクセスできます (これは本当だと思います)。はいの場合、すべてのスレッドがインスタンス変数、動的に割り当てられた変数、グローバル変数にアクセスできます (参照がある場合)
- 異なるプロセスは、お互いのヒープにアクセスできません (アドレスが渡されても)
- スタック オーバーフローがクラッシュする
- 現在のスレッドのみ
- 現在のプロセス
- すべてのプロセス
- C/C++ では、実行時に関数内のブロック変数のスタックにメモリが割り当てられますか (たとえば、コードのサブブロック (たとえば、For ループ) が新しい変数を作成する場合、実行時に割り当てられるのはスタック(またはヒープ)または事前に割り当てられていますか?)いつ削除されますか(ブロックレベルのスコープ、それはどのように維持されますか)。これに関する私の信念は、スタックへのすべての追加は実行時にブロックの開始前に行われ、そのブロックの最後に到達するたびに、その時点までに追加されたすべての要素がプッシュされるということです。
- スタック レジスタに対する CPU のサポートは、メモリへの通常のアクセスを介してインクリメント (ポップ) およびデクリメント (プッシュ) できるスタック ポインタに限定されます。(これは本当ですか?)
- 最後に、メイン メモリ上に存在する OS/ランタイム環境によって生成されたスタック構造とヒープ構造の両方が (抽象化として?)
私はこれがたくさんあることを知っており、全体を通して非常に混乱しているように見えます.これらの問題を解決するために正しい方向に私を向けていただければ幸いです!