【问题标题】:perquisite to share one DLL by multiple process允许多个进程共享一个 DLL
【发布时间】:2019-07-24 12:26:41
【问题描述】:
我在理解以下从 Microsoft 读取的语句时遇到问题。它说“在同一基地址加载相同 DLL 的多个进程共享物理内存中 DLL 的单个副本。”
所以我的理解是,如果一个 DLL 必须在不同的进程之间共享,那么该 DLL 必须在每个进程的虚拟内存中加载到相同的基地址中。为什么这样?如果进程加载到不同进程虚拟地址空间中的不同基地址会发生什么情况,因为最终所有进程都将访问共享 DLL 的相同物理内存。
【问题讨论】:
标签:
windows
memory-management
dll
【解决方案1】:
图像部分绑定到磁盘上的文件。虽然我们不修改部分集中的某些页面 - 此页面将由图像文件共享和支持。但是如果我们修改页面 - 它不能更多地由图像文件支持。系统需要为此修改的页面分配新的物理页面。此页面已经对进程私有并由页面文件支持。
映射在相同或不同地址的部分不起直接作用。但如果图像部分 - 如果它未映射到公共首选地址 - 它必须重新定位。重定位 - 需要修改代码。结果图像页面修改,分配新的私有物理页面
【解决方案2】:
原因是动态链接。大多数 DLL 文件不只是加载到内存中,它们经过处理,以便重写代码中的绝对或长跳转以使其有意义。那么页面被锁定为只读+执行目的。
所以如果同一个DLL在不同的进程中加载到不同的基地址,动态链接过程的结果就会不同,内存页不能共享。
这适用于 DLL 文件数据,例如代码。 DLL 代码运行时分配/使用的内存当然是完全不同的。