.dll文件是为每个程序加载一次还是为所有程序加载一次?

Nil*_*ert 19 c++ memory dll module loading

我有一个简单的小问题,谁知道谁能够轻松回答,我搜索谷歌但无法找到答案.

在计算机上一次运行许多程序,我的问题是:当程序加载DLL时,它是否实际加载DLL文件或者是否找到已加载DLL的内存?例如,为每个使用winsock的程序加载了ws2_32.dll(winsock 2),还是加载了一次,所有使用它的程序使用相同的内存地址来调用函数?

Dea*_*ing 21

它被加载一次,所有程序共享相同的内存中代码副本.它有点复杂,但对于DLL的只读部分(即代码),操作系统加载程序使用一种称为"内存映射"的技术将DLL映射到进程的地址空间.对于所有进程,页面仅被加载到物理存储器中一次,即使它们可能将页面映射到其虚拟地址空间中的不同地址.

但是,每个进程都有一个单独的数据部分(因此全局变量不会被共享 - 除非您明确要求它们),并且它们显然也有一个单独的堆,以便不共享动态分配的内存.

  • 这个问题的答案是"不".函数指针是进程*虚拟地址空间*中的地址,并且绝对不会在进程之间共享.DLL可以在不同进程中的不同地址加载,因此函数指针的地址将不同 - 即使使用相同的物理页面. (2认同)

wal*_*lyk 7

这取决于你所说的"装载".

DLL准备共享使用代码和数据:大多数Windows环境都尊重可共享性(通过将代码的相同内存副本映射到每个进程的内存空间)来节省内存.

但是,"加载"操作的一部分(从进程的角度来看)正在运行DLL的初始化:这是在每个进程中单独完成的,具有对每个进程专用的数据区域的不同副本.