我有一个简单的小问题,知道的人能够轻松回答,我搜索谷歌但找不到答案。
计算机上同时运行许多程序,我的问题是:当程序加载DLL时,它是否实际加载DLL文件或者是否找到已加载DLL的内存?例如,为每个使用winsock的程序加载了ws2_32.dll(winsock 2),还是加载了一次,所有使用它的程序使用相同的内存地址来调用函数?
答案 0 :(得分:21)
它加载一次,所有程序共享相同的内存中代码副本。它有点复杂,但对于DLL的只读部分(即代码),操作系统加载程序使用一种称为“内存映射”的技术将DLL映射到进程的地址空间。这些页面仅为所有进程加载到物理内存中一次,即使它们可能将页面映射到其虚拟地址空间中的不同地址。
但是,每个进程都有一个单独的数据部分(因此不会共享全局变量 - 除非您明确要求它们),并且它们显然也有一个单独的堆,因此不会共享动态分配的内存。
答案 1 :(得分:7)
这取决于“装载”的含义。
DLL准备共享使用代码和数据:大多数Windows环境都尊重可共享性(通过将代码的相同内存副本映射到每个进程的内存空间)来节省内存。
然而,部分“加载”操作(从进程的角度来看)正在运行DLL的初始化:这是在每个进程中单独完成的,每个进程都有不同的数据区副本。