当我开始询问自己关于free()
共享库和SIGKILL
等等的内部情况时,我正在编写一些 C 代码。然后,经过一些阅读和重新思考,我想到了这个简单的问题。
语境:当加载器读取指向某个 libA.so 共享对象的 ELF 文件并加载该库时,它会将整个段映射到程序的内存地址空间吗?它会将其分配为共享内存吗?
据我所知,内核不会占用死进程的共享内存,因此:
- 如果加载共享对象并分配内存,然后主程序接收,会发生什么
SIGKILL
?分配的内存会被视为共享内存并且会泄漏吗? - 如果我有两个程序加载同一个共享库,并且其中一个程序在没有释放的情况下就死掉了,会发生什么情况?
两者最终都是:共享库对象是否作为程序的共享内存加载?
我的问题很笼统。我很想比较不同的内核/加载器。
答案1
由于所有现代操作系统都遵循 SunOS-4.0 (1988) 的基本概念,并且它们甚至基于 SunOS 的代码(Sun 在 1990 年初向 FreeBSD 提供了源代码,其中已被复制......)差异很大。
共享库文件被映射到程序内存中,这是通过数据写入时复制的共享方式完成的,因此大部分所需的 RAM 都是共享的。
malloc()
不是由“库”调用,而是由进程调用,相关内存与进程相关联信号被发送到进程 - 而不是发送到库
如果程序/进程终止,则内核会释放 malloc 的内存,并且如果映射库的引用计数为零,则整个库将从内存中删除。