4

静的ライブラリと共有ライブラリの議論では、共有ライブラリが重複を排除し、全体的なディスク容量を削減するとよく耳にします。しかし、最近のLinuxディストリビューションでは、共有ライブラリが実際にどれだけのディスク容量を節約できるのでしょうか。すべてのプログラムが静的ライブラリを使用してコンパイルされた場合、どれだけ多くのスペースが必要になりますか?Ubuntuなどの典型的なデスクトップLinuxディストリビューションの数を減らした人はいますか?利用可能な統計はありますか?

補遺:

すべての回答は有益であり、感謝されていますが、彼らは私の質問に答えようとするのではなく、撃ち落とすようでした。Kalebは正しい方向に進んでいましたが、ディスクスペースではなくメモリスペースの数値を計算することを選択しました(私の質問はディスクスペースに関するものでした)。

プログラムは、使用する静的ライブラリの部分に対してのみ「支払い」を行うため、すべての静的ライブラリとすべての共有ライブラリのディスク容量の違いを定量的に知ることは事実上不可能のようです。

答えるのは事実上不可能だと気付いた今、私は自分の質問を捨てたくなっています。ただし、有益な回答を保持するために、ここに残しておきます。

SOが答えを選ぶように私をしつこくするのをやめるために、私は最も人気のあるものを選びます(たとえそれが質問を回避したとしても)。

4

5 に答える 5

9

これをどこで聞いたかはわかりませんが、ドライブスペースがギガバイトあたりペニーに近づくにつれて、ディスクスペースの減少はほとんど赤ニシンです。共有ライブラリの真のメリットは、それらのライブラリのセキュリティとバグ修正の更新です。静的ライブラリを使用するアプリケーションは、新しいライブラリを使用して個別に再構築する必要がありますが、共有ライブラリを使用するすべてのアプリは、いくつかのファイルを置き換えるだけで一度に更新できます。

于 2010-01-20T20:25:59.657 に答える
6

共有ライブラリはディスク容量を節約するだけでなく、メモリも節約します。これはさらに重要です。ここでは、事前リンクの手順が重要です...同じアドレスにロードされていない限り、同じライブラリの2つのインスタンス間でメモリページを共有することはできません。事前リンクにより、メモリページを共有できます。

于 2010-01-20T20:46:57.640 に答える
4

共有ライブラリは、必ずしもディスクスペースやメモリを節約するわけではありません。

アプリケーションが静的ライブラリにリンクすると、アプリケーションが使用するライブラリの部分のみがアプリケーションバイナリにプルされます。ライブラリアーカイブ(.a)にはオブジェクトファイル(.o)が含まれており、それらが十分に考慮されている場合、アプリケーションは、使用するオブジェクトファイルとリンクするだけで、使用するメモリが少なくなります。共有ライブラリには、ライブラリの一部がアプリケーションによって使用されているかどうかに関係なく、ディスク上およびメモリ内にライブラリ全体が含まれます。

デスクトップおよびサーバーシステムの場合、これが全体的に勝つ可能性は低くなりますが、組み込みアプリケーションを開発している場合は、すべてのアプリケーションを静的にリンクして、全体的な節約になるかどうかを確認する価値があります。

于 2010-01-22T23:43:09.000 に答える
2

わかりました、おそらく答えではありませんが、メモリの節約は私が考えるものです。節約は、最初のアプリケーションの後にライブラリがロードされた回数に基づくため、簡単なスクリプトを使用して、ライブラリごとにどれだけの節約がシステムにあるかを調べてみましょう。

#!/bin/sh

lastlib=""
let -i cnt=1
let -i size=0
lsof | grep 'lib.*\.so$' | awk '{print $9}' | sort | while read lib ; do
    if [ "$lastlib" == "$lib" ] ; then
        let -i cnt="$cnt + 1"
    else
        let -i size="`ls -l $lib | awk '{print $5}'`"
        let -i savings="($cnt - 1) * $size"
        echo "$lastlib: $savings"
        let -i cnt=1
    fi
    lastlib="$lib"
done

これにより、libごとの節約が可能になります。

...
/usr/lib64/qt4/plugins/crypto/libqca-ossl.so: 0
/usr/lib64/qt4/plugins/imageformats/libqgif.so: 540640
/usr/lib64/qt4/plugins/imageformats/libqico.so: 791200
...

次に、総節約額:

$ ./checker.sh | awk '{total = total + $2}END{print total}'
263160760

つまり、私のシステムで大まかに言えば、約250メガのメモリを節約できます。あなたのマイレージは異なります。

于 2010-01-20T21:04:43.533 に答える
2

わいせつな作業をしなくても、部分的な定量的な答えを見つけることができました。これが私の(頭のいい)方法論です:

1)次のコマンドを使用して、インストールされているサイズと依存関係のリストを含むパッケージのリストを生成します。

dpkg-query -Wf '${Package}\t${Installed-Size}\t${Depends}

2)結果を解析し、各パッケージの統計のマップを作成します。

struct PkgStats
{
    PkgStats() : kbSize(0), dependantCount(0) {}
    int kbSize;
    int dependentCount;
};

typedef std::map<std::string, PkgStats> PkgMap;

そのパッケージに直接依存するdependentCount他のパッケージの数はどこにありますか。

結果

これが私のシステムに最も依存しているパッケージのトップ20リストです:

Package             Installed KB    # Deps  Dup'd MB
libc6               10096           750     7385
python              624             112     68
libatk1.0-0         200             92      18
perl                18852           48      865
gconf2              248             34      8
debconf             988             23      21
libasound2          1428            19      25
defoma              564             18      9
libart-2.0-2        164             14      2
libavahi-client3    160             14      2
libbz2-1.0          128             12      1
openoffice.org-core 124908          11      1220
gcc-4.4-base        168             10      1
libbonobo2-0        916             10      8
cli-common          336             8       2
coreutils           12928           8       88
erlang-base         6708            8       46
libbluetooth3       200             8       1
dictionaries-common 1016            7       6

ここDup'd MBで、は共有がなかった場合に複製されるメガバイト数です(= installed_size * (dependants_count - 1)、for dependants_count > 1)。

libc6が一番上に表示されるのは当然のことです。:)ところで、私はいくつかのプログラミング関連のパッケージといくつかのGISツールがインストールされた典型的なUbuntu9.10セットアップを持っています。

いくつかの統計:

  • インストールされているパッケージの総数:1717
  • 直接扶養家族の平均数:0.92
  • 共有なしの重複サイズの合計(間接的な依存関係を無視):10.25GB
  • 直接扶養家族の数のヒストグラム(対数Yスケールに注意): ヒストグラム

上記は間接的な依存関係を完全に無視していることに注意してください(つまり、すべてが少なくとも間接的にlibc6に依存している必要があります)。私が本当にすべきことは、すべての依存関係のグラフを作成し、それを統計の基礎として使用することです。たぶん、私はいつかそれを回避して、より詳細で厳密な長いブログ記事を投稿するでしょう。

于 2010-01-21T20:29:47.983 に答える