メモリにプログラムをロードして実行する[閉じる]

メモリにプログラムをロードして実行する[閉じる]

リンクローダとリンクエディタを比較しながら知ったことの1つは、リンクローダの場合はリンクと再配置がプログラムが実行されるたびに発生し(ロード時に発生します)、以下のリンクエディタではリンクが1回だけ発生し、プログラムを複数回ロードして使用できます。これは、プログラムが実行制御を受けた場合にのみ(またはオペレーティングシステムがそのプログラムを次の実行プログラムとして決定した場合にのみ)メインメモリにロードされることを意味しますか?具体的には、プログラムをメインメモリにロードするとすぐに実行スロットが保証されますか?

答え1

ここでいくつかを明確にする必要があります。

  1. プログラムがハードドライブにあるかメモリにあるかにかかわらず、事実上違いはありません。カーネルがすでにメモリにマップされているファイルを見つけられない場合は、 mmapその時点からプログラムの仮想メモリにマップされたメモリページを介してファイルにアクセスします。全体的なメカニズムは透明ですが、バックグラウンドで多くのことが起こります。ファイルが以前の使用でキャッシュされていて、空き容量が不足している場合は、物理メモリがディスクにスワップされている可能性があります。
  2. ダイナミックリンクライブラリに実行ファイルがたくさん接続されていても、ダイナミックリンクライブラリは一度だけロードされます。同様に、ページはそのページを必要とするプロセスの仮想メモリにマップされます。
  3. 実行可能ファイルの内容をメモリにロードすることは、実行中のコードとは何の関係もありません。 (フォークを介して)新しいプロセスが作成されるたびに独自の仮想メモリレイアウトがあり、ページがどこに保存されているか、誰が使用しているかは関係ありません。呼び出されるとexecexecve通常)バイナリ(およびおそらくelfフォーマット)が解析され、他のコンテンツが別のページ(プログラムコード、静的データ、スタック割り当てなど)にマッピングされ、リンカはコード内で未解決のシンボルを探します。仮想アドレス空間にもマップされる動的接続可能ライブラリのアドレスにマップされます。その後、実行は実行プログラムのコードエントリポイントに渡されます。

特定のプログラムの各実行は独自の新しいプロセスであり、コードのソースは実際には気にしません。コードはすでにRAMにある場合もあれば、そうでない場合もあります。メモリ管理は非常に動的です。コードを含む同じ物理メモリページが複数のプロセスのアドレス空間にマッピングされ、ダイナミックリンクライブラリが間違いなく同じ共有ページを使用することも可能ですが、それはすべてです。

一般的に使用されているライブラリは起動時に事前にロードできるため、プロセスはより速く実行されます。しかし、これはリンカがすでにRAMにロードされているページを見つけたため、ハードドライブからそのページを読み取る必要がないことを意味します。これは再キャッシュ方法であり、カーネルが望む方法でページを混在させるという事実の副作用であり、ユーザーが見るのは仮想アドレス空間だけです。

既存のプロセスを再利用するためにコマンドを呼び出すことを言うのはまったく異なります。おそらく、既存のインスタンスを見つけて何をすべきかを知らせる通信プロトコルがあります。あるいは、やるべきことがあるときに睡眠から目覚める睡眠プロセスがあるかもしれません。ただし、この場合、実際には新しいプロセスを実行しません。

あなたの質問が何であるかよくわかりませんが、これがあなたの質問に少なくとも部分的に答えることを願っています。

答え2

あなたの質問は理解しにくく、誤解を招く可能性があります。

これは、プログラムが実行制御を受けた場合にのみ(またはオペレーティングシステムがそのプログラムを実行する次のプログラムであると判断した場合にのみ)メインメモリにロードされることを意味しますか?

execve()UNIXでは、システムコール(およびそのバリエーション)を介して制御が次のプログラムに転送されます。このシステムコールは、実行されるプログラムのファイル名を引数として使用します。したがって、プログラムをロードして実行する要求と同じです。プログラムはまだプリロードされていません。その意味で、あなたの質問に対する答えは「はい」です。

以前にプログラムコードを読み込んだり実行したことがある場合は、まだ物理メモリにキャッシュされている可能性があることを無視します。これは最適化です。

カーネルが最初にすることは問題のファイルをロードすることです。

動的にリンクされた実行可能ファイルの場合、プログラムはランタイムリンクを実行するヘルパープログラムである動的リンカーもロードします。このヘルパーは通常、別のコードスニペット(共有ライブラリ)をロードする作業を行います。

動的接続が完了すると(またはプログラムが動的に接続されておらず、動的接続が完了していない場合)、制御は適切なプログラムコードに渡されます。

プログラムをメインメモリにロードすると、スロットがすぐに実行されることが保証されますか?

「即時スロットの実行」は理解できません。

ファイル(プログラムを含む)をメモリにロードするには、実行、コピー、編集など、いくつかの理由があります。

関連情報