8

共有ライブラリと静的ライブラリの読み込み時間について質問があります。

liba、libb、libc を使用する実行可能ファイル foo.exe があるとします。また、ある時点で、実行可能ファイルの 10 を超えるインスタンスがマシン上で実行されています。

上記の 3 つのライブラリが共有ライブラリである場合: 最初のインスタンスが RAM にロードされます: かかる時間は、foo.exe の main() がメモリをロードするのにかかる時間 (無視できると仮定) + liba をロードする時間 + ロードする時間です。 libb + libc をロードする時間 2 番目のインスタンスが開始されました : この実行可能ファイルの 2 番目のインスタンスが実行されたとします。すべてのライブラリは既にメイン メモリにロードされているため、かかる時間は main() をメモリにロードするためだけであり、無視できます。

上記の 3 つのライブラリが静的ライブラリである場合: 最初のインスタンスが RAM にロードされます: かかる時間は、foo.exe の main() がメモリをロードするのにかかる時間 (無視できると仮定) + liba をロードする時間 + ロードする時間です。 libb + libc をロードする時間 (もちろん、現在は実行可能ファイル全体のすべての部分です) 2 番目のインスタンスが開始されます: この実行可能ファイルの 2 番目のインスタンスが実行されると仮定します。かかる時間は、foo.exe の main() がメモリをロードするのにかかる時間 (無視できると仮定) + liba をロードする時間 + libb をロードする時間 + libc をロードする時間になります。(これらは静的ライブラリであるため、各実行可能ファイルはライブラリを共有できないため)

したがって、静的ライブラリを使用すると、読み込み時間が長くなるというのが私の結論です。しかし、共有ライブラリは静的ライブラリよりも読み込みに時間がかかるため、遅延が発生するため、共有ライブラリは適切なオプションではないと言われました。これはどのように可能ですか?

4

3 に答える 3

10

リンク (参照の解決) は無料ではありません。静的リンクでは、解決はバイナリの生成時に一度だけ行われます。動的リンクでは、バイナリがロードされるたびに実行する必要があります。共有ライブラリで実行するためにコンパイルされたコードは、静的にリンクされるようにコンパイルされたコードよりも効率が悪い可能性があることは言うまでもありません。正確なコストは、アーキテクチャとシステムの動的リンクの実装によって異なります。

ライブラリを動的にするコストは、32 ビット x86 命令セットでは比較的高くなる可能性があります。ELF バイナリ形式では、動的にリンクされたコードを再配置可能にするために、すでに不足しているレジスタの 1 つを犠牲にする必要があります。古いa.out形式では、各共有ライブラリが固定された場所に配置されていましたが、拡張できませんでした。Mac OS X には、動的ライブラリがアドレス空間の所定の場所に配置されたときの中間システムがあったと思いますが、競合は個々のコンピュータの規模で解決されました (新しいインストール後の長い「システム パフォーマンスの最適化」フェーズ)。ソフトウェア)。ある意味では、このシステム(プレバインディングと呼ばれる) を使用すると、ケーキを持って食べることもできます。Apple がほとんど amd64 アーキテクチャに切り替えた今でも、事前バインドが必要かどうかはわかりません。

また、最新のOSでは、静的および動的にリンクされたコードは、使用されている場合にのみディスクからロード(ページイン)されますが、これは質問とはまったく異なります。

于 2010-01-08T04:21:06.753 に答える
2

静的ライブラリはコンパイル時にリンクされ、共有ライブラリは実行時にリンクされます。したがって、静的ライブラリを使用する実行可能ファイルは、ディスクに書き込まれる前にすべてのリンク時間を償却します。

于 2010-01-08T04:17:31.613 に答える
0

この信じられないほど迅速な対応に感謝します。2 つの建築シナリオがあります。

Q1. Architecure-1 : exe サイズを 3GB (静的ライブラリ) と仮定します。95% がライブラリで 5% が main() です。このような巨大なサイズでは、この exe の読み込みに時間がかかるか (静的ライブラリを想定)、この exe のリンクに時間がかかります (共有ライブラリを使用し、すべてのライブラリが既に存在する場合)。メモリ内では、リンクのみを行う必要があります。)

Architecure-2 : exe サイズが 1.5GB (95% lib + 5% main()) で、これの 6 つのインスタンスが同時に実行されているとします。これらの 6 つのインスタンスが起動すると、数日間実行されます。これらの 6 つのインスタンスの初期ロードとリンクの間に追加の遅延を受け入れる準備ができていると仮定します。

Q2. 静的オブジェクトではなく共有オブジェクトを使用している場合、すべてのライブラリが 6 つのインスタンス間で共有されるため、RAM に多くの空き容量がありますか? RAM のスペースが増えてページのスワッピングが減少するため、リアルタイムの実行速度が向上することはありませんか?

Q3. 「マップ」ファイルを使用してエクスポートされるシンボルの数を減らすと (これは共有ライブラリを使用する場合にのみ可能です)、シンボル テーブルのサイズは減少せず、実行時のパフォーマンスも向上しませんか?

ありがとう

于 2010-01-08T05:22:16.193 に答える