free()
共有ライブラリSIGKILL
の内部などについて助言し始めたとき、私はCコードを書いていました。それから何度も読んでもう一度考えた後、私はこの簡単な質問を思い出しました。
コンテキスト:ローダが一部のlibA.so共有オブジェクトを指すELFファイルを読み込み、ライブラリをロードするときにセグメント全体をプログラムのメモリアドレス空間にマッピングしますか?共有メモリに割り当てられますか?
私が知る限り、カーネルは死んだプロセスの共有メモリを占有しません。したがって:
- 共有オブジェクトがロードされ、メモリが割り当てられた次のメインプログラムがそれを受け取るとどうなりますか
SIGKILL
?割り当てられたメモリは共有メモリとして処理され、漏れますか? - 同じ共有ライブラリをロードする2つのプログラムがあり、そのうちの1つがそれを解放せずに終了するとどうなりますか?
どちらも最終的に次のようになります。共有ライブラリオブジェクトはプログラムの共有メモリにロードされますか?
私の質問は非常に一般的です。私は他のカーネル/ローダーを比較したいと思います。
ベストアンサー1
すべての現代のオペレーティングシステムはSunOS-4.0(1988)の基本概念に従い、さらにはSunOSのコード(Sunは1990年初めにFreeBSDにソースコードを提供し、コピーされました...)に基づいているため、大きな違いがあります。 。
共有ライブラリファイルは、書き込み中にコピー共有を介してプログラムメモリにマッピングされるため、必要なRAMの大部分が共有されます。
malloc()
「ライブラリ」ではなくプロセスによって呼び出され、関連するメモリはプロセスに関連付けられます。シグナルはライブラリではなくプロセスに送信されます。
プログラム/プロセスが終了すると、カーネルによって割り当てられたメモリーが解放され、マップされたライブラリーの参照カウントが0の場合、ライブラリー全体がメモリーから削除されます。