私たちは多くの共有オブジェクト(.so)を持つ非常にモジュラーなアプリケーションを持っています。メモリ/フラッシュが制限されたローエンドのプラットフォームでは、共有オブジェクトがオーバーヘッドを持つため、すべてを1つの大きな実行可能ファイルに静的にリンクする方がよいと主張する人もいます。共有オブジェクトオーバーヘッド
あなたの意見は?
よろしく、
ポール
私たちは多くの共有オブジェクト(.so)を持つ非常にモジュラーなアプリケーションを持っています。メモリ/フラッシュが制限されたローエンドのプラットフォームでは、共有オブジェクトがオーバーヘッドを持つため、すべてを1つの大きな実行可能ファイルに静的にリンクする方がよいと主張する人もいます。共有オブジェクトオーバーヘッド
あなたの意見は?
よろしく、
ポール
メモリが極端にでない限り、これらのファイルの1つのコピーのサイズは主要な決定要因ではありません。これが組み込みシステムであることを考えると、おそらく、アプリケーションがあなたのライブラリをいつ使用するのか、いつ利用するのかが分かります。アプリケーションが開かれた複数のライブラリを忠実に参照して閉じると、すべてのライブラリを同時に開くことができない場合、共有ライブラリはRAMを大幅に節約します。
考慮すべき他の要因は、パフォーマンスのペナルティです。共有ライブラリを開くと、小さな(通常は些細な)時間がかかります。プロセッサーが非常に遅い、またはヒットしにくいリアルタイム要件がある場合、静的ライブラリーは共用ライブラリーのロード・ペナルティを被ることはありません。これが重要かどうかを調べるプロファイル。
いくつかの特殊なケースでは、共有ライブラリは静的ライブラリよりも大幅に優れています。ほとんどの場合、ほとんど害はありません。単純な状況では、共有ライブラリから何の利益も得られません。もちろん
あなたが同じライブラリを使用して、複数のアプリケーション(またはアプリケーションのバージョンを)持っている場合は、共有ライブラリには、Flashの大幅な節約になります。静的ライブラリを使用する場合、1つのコピー(共有ライブラリ[1]とほぼ同じサイズ)がそれぞれにコンパイルされます。これは、PCワークステーションを使用している場合に便利です。しかし、あなたはそれを知っていました。 1つのアプリケーションでのみ使用されるライブラリで作業しています。
[1]個々のライブラリファイルのメモリの違いは小さいです。共有ライブラリは、dlopen(3)
がライブラリをロードできるように、インデックスとシンボルテーブルを追加します。これが重要かどうかは、ユースケースによって異なります。それぞれをコンパイルしてサイズを比較して、どれが小さいかを判断します。あなたはRAMを消費するものを決定するために実行とプロファイルを実行する必要があります。共有ライブラリーの最初のロードを除いて、それらは似ているはずです。
もちろんのライブラリの多くを持つことは、より多くのメタデータが格納され、また、そのメタデータ(などのライブラリセクションヘッダ)の一部である必要がありますしなければならないことを意味ロード時にRAMに格納されます。しかし、その差は、(中程度に近代的な)組み込みシステムでさえ、かなり無視できるはずです。
私はあなたに両方の選択肢を試し、FLASHとRAMの両方で使用されているスペースを測定し、どれが最適かを判断することをお勧めします。
共有ライブラリのコストはおおよそ(ライブラリーあたり)です:プライベート汚いメモリの
mmap
およびmprotect
のシステムコール、および読み込み時に少なくとも1つのページフォルトがあります。プラス位置独立コード費:1の汎用レジスタの
長時間実行されるアプリケーションが大規模な場合は、ご使用のシステムが小型でない限り、コストはまったく問題になることはありません。一方、短時間の作業(言語通訳など)のために何度も呼び出される可能性のあるものを書く場合、これらのコストは膨大になる可能性があります。 Perl、Pythonなどの起動が遅い理由の大部分は、静的ではなく標準モジュールをすべて自分自身の.so
ファイルに置くことです。
個人的に、私はない開発モデルとして、拡張ツールような動的ロードされたモジュールを使用しての戦略となるだろう。