2

10 個の静的ライブラリにリンクしています。

ダイナミック ライブラリを使用すると、バイナリ ファイルのサイズが小さくなります。

私が知っているように、動的ライブラリを使用してもメモリ使用量は減りません。

でも、共有ライブラリを使えばメモリ使用量も減るって先輩に言われましたよね?(同じ実行コードに対して複数のプロセスが実行されている場合。)

その発言は正しいですか?

彼は、 library で使用される関数の重複コピーがないため、メモリ使用量が少なくなると私に言いました。そのプロセスの n インスタンスを作成するとき。

プロセスが開始されると、10 個の子がフォークされます。静的ライブラリの代わりに動的ライブラリを使用すると、総メモリ使用量が削減されますか?

4

3 に答える 3

9

あなたの例では、動的ライブラリはあまり節約できません。最新の OS でプロセスをフォークすると、すべてのページが実際にコピーされるのではなく、書き込み時にコピーとマークされます。したがって、スタティック ライブラリは、プロセスの 10 個のコピー間で既に共有されています。

ただし、保存できるのは、動的ライブラリが同じプロセスのフォークではなく、異なるプロセス間で共有されている場合です。したがって、同じ glibc.so を別のプロセスとして使用している場合、2 つのプロセスは、無関係なプロセスであっても、glibc.so の物理ページを共有しています。

于 2011-03-05T06:44:00.853 に答える
4

ほとんどのオペレーティング システムはコピー オン ライトを使用するため、特定のプロセスを fork しても大きな違いはないはずです。これは、ページが更新された場合にのみページがコピーされることを意味するため、共有ライブラリのコード セグメントなどは影響を受けません。

一方、静的にリンクされている場合、異なるプロセスはコードを共有できません。実際にすべてのバイナリ リンクに対して libc を検討してください...それらがすべて静的にリンクされている場合、メモリ内に数十の printf のコピーが作成されることになります。

肝心なのは、よほどの理由がない限り、バイナリを静的にリンクするべきではないということです。

于 2011-03-05T06:44:16.717 に答える
2

この場合の先輩は正しいです。共有ライブラリの単一のコピーがメモリにロードされ、それを参照するすべてのプログラムで使用されます。

このトピックに関する投稿がここにあります:

http://www.linuxquestions.org/linux/articles/Technical/Understanding_memory_usage_on_Linux

于 2011-03-05T06:41:39.040 に答える