2017-02-23 2 views
0

これをネット上で検索した後、答えが見つからないようです。dlopenは複数のライブラリインスタンスを作成しますか?

初めてdlopenを使用すると、プログラムの複数のインスタンスから実行した場合を含め、それ以降はいつもより長くかかりそうです。

dlopenはメモリに一度ロードしてOSに保存させるので、プログラムの別のインスタンスからの次の呼び出しがメモリ内の同じ場所を指すようにします。

したがって、ライブラリを実行するプログラムの3つのインスタンスは、同じ.soの3つのインスタンスがメモリにロードされるか、メモリ内に1つのインスタンスしか存在しないことを意味しますか?

おかげ

+3

共有ライブラリとは呼ばれません。 –

+0

恐ろしく!私はそれが共有されていることを知っていたので、他のプログラムがそれを呼び出すことができました。私は、OSが一度だけ記憶に入るほどスマートだったという強いはっきりしない疑いがあった。早速のご返事ありがとうございます。 – Questionable

+0

私の意見では、これはOSの実装に依存するかもしれませんが、理論的にはdlopenはlibとそのすべての依存関係をmmapして開きます。そして、再利用の理由から、プロセス間でマッピングされたメモリを共有するために論理的に聞こえる。私はこの種のプロセスが何とかあなたが観察していることを説明できると思います。しかし、あなたのタイミングはファイルシステムのキャッシュやsmthのような他の理由によって引き起こされるかもしれないことにも留意してください。 else。 – dmi

答えて

2

一度そうにメモリにロードし、メモリ内の同じ場所にでもプログラムポイントの別のインスタンスから任意の次の呼び出しようにOSがそれを保存していdlopenをしていますか?

単一プロセス内からのdlopenへの複数の呼び出しにより、ライブラリが複数回ロードされないことが保証されています。 man pageから:

If the same shared object is loaded again with dlopen(), the same 
    object handle is returned. The dynamic linker maintains reference 
    counts for object handles, so a dynamically loaded shared object is 
    not deallocated until dlclose() has been called on it as many times 
    as dlopen() has succeeded on it. 

dlopenへの最初の呼び出しが発生した場合、ライブラリは呼び出し元のプロセスにmmap編です。通常、少なくとも2つの個別のmmapコールがあります。.textおよび.rodataセクション(通常は1つのROセグメントに存在)は読み取り専用にマッピングされ、.dataおよび.bssセクションは読み書き可能にマッピングされます。

次のプロセスからのdlopenは同じmmapを実行します。しかし、OSはディスクから読み込み専用のデータを読み込む必要はありません。最初のdlopen呼び出しで既に読み込まれたページの参照カウントをインクリメントします。それは "共有ライブラリ"での共有です。

したがって、ライブラリを実行するプログラムの3つのインスタンスは、同じ.soの3つのインスタンスがメモリにロードされるか、メモリ内に1つのインスタンスしか存在しないことを意味しますか?

"インスタンス"と呼ばれるものによって異なります。

各プロセスは、このライブラリを記述する独自の(動的に割り当てられた)ランタイムローダ構造を持ち、各セットには共有ライブラリの "インスタンス"が含まれます(プロセスごとに異なるアドレスにロードできます)。各プロセスには、書き込み可能なデータの独自のインスタンス(コピーオンライトセマンティクスを使用する)もあります。しかし、読み取り専用のマッピングはすべて同じ物理メモリを占有します(ただし、各プロセスの異なるアドレスに表示される可能性があります)。

+0

詳細な回答ありがとうございます。 – Questionable

関連する問題