我试图弄清楚操作系统如何处理加载相同 DLL/共享库的多个不相关进程。我关心的操作系统是 Linux 和 Windows,但在较小程度上也是 Mac。我认为我的问题的答案对于所有操作系统都是相同的。
我对显式链接特别感兴趣,但我也想知道隐式链接。我认为两者的答案也将是相同的。
这是迄今为止我发现的关于 Windows 的最佳解释:
“系统在所有加载的模块上维护每个进程的引用计数。调用 LoadLibrary 会增加引用计数。调用 FreeLibrary 或 FreeLibraryAndExitThread 函数会减少引用计数。系统在其引用计数达到零或进程终止时卸载模块(无论参考计数如何)。” - http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
但它留下了一些问题。
1.) 不相关的进程是否会冗余地加载同一个 DLL(即 DLL 在内存中存在多次)而不是使用引用计数?(IE,进入每个进程自己的“地址空间”,我想我理解它)
如果在进程终止后立即卸载 DLL,这使我相信使用完全相同 DLL 的其他进程将冗余加载到内存中,否则不应允许系统忽略引用计数。
2.) 如果这是真的,那么当您在同一进程中多次加载 DLL 时,引用计数 DLL 的意义何在?将同一个 DLL 两次加载到同一个进程有什么意义?我能想到的唯一可行的原因是,如果一个 EXE 引用了两个 DLL,而其中一个 DLL 引用了另一个,那么同一个库将至少有两个 LoadLibrar() 和两个 FreeLibrary() 调用。
我知道我似乎在这里回答我自己的问题,但我只是假设。我很想知道。