2013-05-20 6 views
6

私はCプログラミングを見始めましたが、私は完全な初心者ではありませんでした(私はJavaとWeb開発の知識があります)分かりません。すべてのプログラムコードはメモリの codeセクションセグメントにロードされています

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

プログラムの起動時にメモリにロードされたプログラムコードはすべて、またはロードされる必要があるのは何ですか?

このコードを実行すると、プロセスがCPU時間を取得したり、プログラムが実行されている間にコードがメモリに残り、物理ディスクからスワップイン/スワップされます。

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

私の質問が基本的ではありませんが、言葉が貧弱ですが、私はこの先週を見て始めて、読んで週末を過ぎてから、私は答えよりはるかに多くの質問があります。

+0

いい質問です! –

答えて

4

プログラムが が起動したとき、またはロードする必要があるときだけ、すべてのプログラムコードがメモリにロードされていますか?

のOSのほとんどの近代的なアプリケーション(main)の出発点は、OSによってロードされますので、その後、OSがちょうどそこにキックオフ、「オンデマンド」ロードされます。アプリケーションがメモリにまだないコードにジャンプすると、そのビットがロードされます。この後

プロセスがCPU時間を取得またはプログラムが実行されている間、メモリ内のコード 滞在をロードしないよう命令のこのコード\セットは、物理ディスクの 内外にスワップますでしょうか?

OSがいくつかのメモリが必要と判断した場合、OSはコードの一部を破棄し、後で必要になったときに再ロードすることができます[必要になった場合は再初期化します。決して再びヒットすることはありません。

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

同じアプリケーションの複数のコピー間でコードを共有することは可能です。ここでも、特定のOSがこれを行うかどうかは、OSに依存します。 Linuxは、2つの(無関係な)プロセス間で同じアプリケーションからのコードコピーを確実に共有します(定義上、forkされたプロセスはコードを共有します)。私はWindowsもそうだと信じています。

共有ライブラリ(「.soは」と、それぞれのLinux/UnixとWindows用の「の.dll」ファイル)も、プロセス間でコードを共有するために使用されている - 同じ共有ライブラリは、多くの異なる用途に使用されます。

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

+0

マツは、それが私が知る必要があるすべてをカバーしてくれたその答えに感謝します、残念ながら(通常はそうですが)それはより多くの関連する質問を私に残しました!メソッドの命令がロードされ、このメソッドがプログラムの存続期間中に複数回呼び出される可能性がある場合、そのメソッドはメモリーに残りますか?私の他の質問は、グラフィック表示を生成するコードについてですか?私は、このコードはプログラムの生涯にわたって永続的にロードされなければならないと思っていますか、これを考えるのは間違っていますか? – berimbolo

+0

OSがそれ以外のメモリを「必要とする」メモリの量がそれほど多くない限り、それはメモリにとどまります。私はなぜ「グラフィック表示を生成するコード」が他のコードとも異なっているのは理解していません。それは数学を行うコードのようにコードであり、テーブルを検索したり、 [明らかに、画面上に実際に描画されるドライバのコードは、カーネルモジュールまたはシステムドライバであり、通常は「スワップ可能」ではなく、通常は「デマンドロード」されていませんが、一度にロードされます。典型的な場合にはアンロードされない]。 –

+0

私はこれを追加する必要があります。通常、OSは何らかの形でこのメモリが使用されてからの経過時間を記録します。したがって、使用されずに座っていたコード(またはデータ)のいくつかは、最近実行されたものよりも「追い出される」可能性が高くなります。 –

関連する問題