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

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

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

ベストアンサー1

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

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

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

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

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

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

おすすめ記事