2011-10-19 4 views
5

私たちは多くの共有オブジェクト(.so)を持つ非常にモジュラーなアプリケーションを持っています。メモリ/フラッシュが制限されたローエンドのプラットフォームでは、共有オブジェクトがオーバーヘッドを持つため、すべてを1つの大きな実行可能ファイルに静的にリンクする方がよいと主張する人もいます。共有オブジェクトオーバーヘッド

あなたの意見は?

よろしく、

ポール

答えて

5

メモリが極端にでない限り、これらのファイルの1つのコピーのサイズは主要な決定要因ではありません。これが組み込みシステムであることを考えると、おそらく、アプリケーションがあなたのライブラリをいつ使用するのか、いつ利用するのかが分かります。アプリケーションが開かれた複数のライブラリを忠実に参照して閉じると、すべてのライブラリを同時に開くことができない場合、共有ライブラリはRAMを大幅に節約します。

考慮すべき他の要因は、パフォーマンスのペナルティです。共有ライブラリを開くと、小さな(通常は些細な)時間がかかります。プロセッサーが非常に遅い、またはヒットしにくいリアルタイム要件がある場合、静的ライブラリーは共用ライブラリーのロード・ペナルティを被ることはありません。これが重要かどうかを調べるプロファイル。

いくつかの特殊なケースでは、共有ライブラリは静的ライブラリよりも大幅に優れています。ほとんどの場合、ほとんど害はありません。単純な状況では、共有ライブラリから何の利益も得られません。もちろん


あなたが同じライブラリを使用して、複数のアプリケーション(またはアプリケーションのバージョンを)持っている場合は、共有ライブラリには、Flashの大幅な節約になります。静的ライブラリを使用する場合、1つのコピー(共有ライブラリ[1]とほぼ同じサイズ)がそれぞれにコンパイルされます。これは、PCワークステーションを使用している場合に便利です。しかし、あなたはそれを知っていました。 1つのアプリケーションでのみ使用されるライブラリで作業しています。


[1]個々のライブラリファイルのメモリの違いは小さいです。共有ライブラリは、dlopen(3)がライブラリをロードできるように、インデックスとシンボルテーブルを追加します。これが重要かどうかは、ユースケースによって異なります。それぞれをコンパイルしてサイズを比較して、どれが小さいかを判断します。あなたはRAMを消費するものを決定するために実行とプロファイルを実行する必要があります。共有ライブラリーの最初のロードを除いて、それらは似ているはずです。

1

もちろんのライブラリの多くを持つことは、より多くのメタデータが格納され、また、そのメタデータ(などのライブラリセクションヘッダ)の一部である必要がありますしなければならないことを意味ロード時にRAMに格納されます。しかし、その差は、(中程度に近代的な)組み込みシステムでさえ、かなり無視できるはずです。

私はあなたに両方の選択肢を試し、FLASHとRAMの両方で使用されているスペースを測定し、どれが最適かを判断することをお勧めします。

6

共有ライブラリのコストはおおよそ(ライブラリーあたり)です:プライベート汚いメモリの

  • 少なくとも4K。
  • 少なくとも12kの仮想アドレス空間。
  • いくつかのファイルシステムアクセスのシステムコール、mmapおよびmprotectのシステムコール、および読み込み時に少なくとも1つのページフォルトがあります。
  • ライブラリコード内のシンボル参照を解決する時間。

プラス位置独立コード費:1の汎用レジスタの

  • 損失(これは他のarchsを上のx86(32ビット)上の巨大なが、ほとんど無関係であることができます)。
  • グローバル/静的変数(および定数)にアクセスする余分な間接参照レベル。

長時間実行されるアプリケーションが大規模な場合は、ご使​​用のシステムが小型でない限り、コストはまったく問題になることはありません。一方、短時間の作業(言語通訳など)のために何度も呼び出される可能性のあるものを書く場合、これらのコストは膨大になる可能性があります。 Perl、Pythonなどの起動が遅い理由の大部分は、静的ではなく標準モジュールをすべて自分自身の.soファイルに置くことです。

個人的に、私はない開発モデルとして、拡張ツールような動的ロードされたモジュールを使用しての戦略となるだろう。