まあ、プロセス自体はあなたが書いたより少し複雑です。いくつかのステップには、ステップ1やPEのロード方法(およびmscoree.dll自体がロードされる方法)の中に内部ステップが含まれるなど、多少考えられるかもしれません。
しかし、私はあなたの質問に答えようとします。あなたの質問がちょっと大きいことに気づくだけで、簡単に答えてみました。しかし、本当に興味があるのであれば、CLR(C#、リヒター)を読むことを強くお勧めします。彼は最初の章でローディングプロセスについて説明し、ガベージコレクタ専用の章を持っています。
興味深いガベージコレクタの基本については、MSDNの記事もあります。
作成されるスタック、ヒープ、スレッドの数はいくつですか?スレッドは作成され、実行可能ファイル内のコードが実行されますか?
シンプル(空の)コンソールアプリケーションには、メインスレッド、GCスレッド、ファイナライザースレッドの3つのスレッドがあります。もちろん、それぞれのスレッドはそれ自身のスタックを持っています(それぞれ1MB)。
ヒープ数は、使用しているGCタイプによって異なります。 Workstation GC(デフォルト)を使用している場合は、マネージド・ヒープが1つ(2つのセグメント、1つは「通常の」オブジェクト用、もう1つはラージ・オブジェクト・ヒープ・セグメント用)です。
サーバーGCで作業している場合、システムで使用できる各論理コアごとに1つのヒープがあります(2つのセグメントを持つヒープのそれぞれに1つのヒープがあります)。初期メモリは複数の要素で構成されてい
メモリ割り当て、割り当てられた初期メモリのサイズ?何である
(OSやCLRは?):各スレッドの1MBのスタックがありますプロセスにロードされたイメージのサイズ(アプリケーションに依存します)があります。サイズには "動的な"要素があります。これはアプリケーションでの割り当てで、GCがヒープサイズを大きくし、使用していないオブジェクトをGCできれいにし、GCにメモリを解放させる可能性があります。
exeが実行されているときにさらに多くのメモリが必要な場合は、誰がこのメモリをどのくらい割り当てるかを決定しますか?
単純なコンソールアプリケーションがある場合は、メインの内部に新しいクラスのインスタンスが作成されます。その場合、 "new"キーワード(CIL "newobj"命令)はCLRに必要なメモリ量を計算させます。
世代0(新しく作成されたオブジェクトが格納される)に十分なメモリがある場合、追加のメモリ割り当てはありません。十分なメモリがない場合、GCは起動し、VirtualAllocを呼び出してオブジェクトのメモリを割り当てます。このシナリオでは、新規に作成されたオブジェクトの参照がスタックに保存されます。
もちろん、参照が保存される場所(スタック、ヒープ、プロセッサレジスタ)とオブジェクトが割り当てられる場所(スタック/ヒープ)は異なる場合があります。基本的には、クラスや構造体の割り当てについて話しているかどうか、割り当てのコンテキストは何か(依存するメソッドの場合、他のクラスのフィールド、構造体のフィールドなど)によって異なります。また、プラットフォームによって異なる場合もあります。
exeが実行されているときにさらに多くのメモリが必要な場合は、誰がこのメモリをどのくらい割り当てるかを決定しますか?
プロセスで作成された新しいオブジェクトのメモリ割り当てはすべて、CLR(もちろん、CLRはVirtualAllocやVirtualFreeなどのWindows APIや仮想メモリ自体を管理するWindows APIを使用します)によって管理されます。
管理されたヒープで作成する必要がある新しいオブジェクトを作成するために「新しい」演算子を使用すると、CLRは割り当てに必要なサイズを計算します(すべてのフィールドのサイズ+ obオブジェクトそれがどのタイプであるかを知っている)、管理されたヒープに空き領域があるかどうかを確認します(世代0では、CLRは常に新しいオブジェクトを割り当てる場所へのポインタを保持します)。そうであれば、それを使用します。それ以外の場合、メモリが不足しているとガーベッジコレクションが開始され、時には(gcプロセスの後のメモリの状態やその他のものによって異なります)VirtualAllocはCLRによって呼び出され、プロセスにさらにメモリを割り当てます。
EXEを閉じるとどうなりますか?アプリケーションドメインをアンロードする前にCLRがGCを実行していますか? (exeを閉じて)、またはOSは?
CLRはapp-domainをアンロードする前にクイックGCを実行します。このクイックGCの目的は、ファイナライズする機会を最終化することです。プロセスを終了するときには、OSがとにかくそれを行うので、CLRがメモリをクリーニングする必要はありません。
希望します。
"CLR via C#"を購入するか、ブログシリーズ "CLR Inside Out"を読んでください。これは適切に答えるには広すぎる方法です。あなたの質問のそれぞれが以前に答えられたことは確かです。 – CodeCaster