11

私は C プログラミングを見始めました。私は完全な初心者ではありませんが (Java と Web 開発の知識はあります)、理解できないことがたくさんあります。

私の質問は、プログラムが最初にメモリにロードされる時期についてです。ここで実際に何が起こっているのか理解できません。

プログラムの起動時にすべてのプログラム コードがメモリにロードされますか、それとも必要なものだけがロードされますか?

この後、このコード/一連の命令は、プロセスが CPU 時間を取得したり、プログラムの実行中にロードされたコードがメモリに残ったりするときに、物理ディスクにスワップインおよびスワップアウトされますか?

2 つのプロセスが同じ命令セットを共有できる場合、これは各プロセスが仮想メモリ空​​間で個別のコード セクションを取得することを意味しますか?

私の質問が基本的なものであったり、言葉遣いが不十分だったりして申し訳ありませんが、先週これを見始めたばかりで、週末に読んだ後、答えよりもはるかに多くの質問があります!

4

1 に答える 1

7

プログラムの起動時にすべてのプログラム コードがメモリにロードされますか、それとも必要なものだけがロードされますか?

最近のほとんどの OS は「オンデマンド」でロードするため、アプリケーションの開始点 ( main) が OS によってロードされ、OS はそこから開始されます。アプリケーションがまだメモリにないコードにジャンプすると、そのビットが読み込まれます。

この後、このコード/一連の命令は、プロセスが CPU 時間を取得したり、プログラムの実行中にロードされたコードがメモリに残ったりするときに、物理ディスクにスワップインおよびスワップアウトされますか?

OSが一部のメモリが必要であると判断した場合、コードの一部を破棄し、後で必要になったときに再ロードする可能性があります[再び必要になった場合-初期化の一部であった場合は、二度とヒットしない可能性があります] .

2 つのプロセスが同じ命令セットを共有できる場合、これは各プロセスが仮想メモリ空​​間で個別のコード セクションを取得することを意味しますか?

同じアプリケーションの複数のコピー間でコードを共有することは確かに可能です。繰り返しますが、特定の OS がこれを行うかどうかは、OS によって異なります。Linux は確かに、2 つの (関連のない) プロセス間で同じアプリケーションからのコード コピーを共有します [明らかに、フォークされたプロセスは定義上コードを共有します]。Windowsもそうだと思います。

プロセス間でコードを共有するために共有ライブラリ (Linux/Unix および Windows 用の「.so」ファイルと「.dll」ファイル) も使用されます。同じ共有ライブラリが多くの異なるアプリケーションに使用されます。

もちろん、データ スペースはアプリケーションごとに分離されており、共有ライブラリも、ライブラリを共有するプロセスごとに独自のデータ セクションを取得します。

于 2013-05-20T11:34:58.193 に答える