如标题所示,多个进程可以在内存中共享相同的动态库副本吗?
我读了here。请搜索使用更少的资源。文章说“DLL可以减少加载到磁盘和物理内存中的代码重复”。我可以理解节省磁盘空间。虽然我不确定在使用DLL时是否保存了“物理内存”。在Unix中使用.so是否具有节省内存的相同优势?
答案 0 :(得分:2)
是的,内核只需要加载一次物理代码页,所有进程都可以共享它们,无论每个进程在何处加载库。 PLT和GOT将为每个进程定制,但.text部分页面可以共享。
答案 1 :(得分:1)
内核将加载一次,并由其他进程共享。
我进行了不同的测试 - a)在不同的Linux服务器上编译示例程序: gcc -rdynamic -o foo foo.c -ldl
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int
main(int argc, char **argv)
{
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen("libm.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror(); /* Clear any existing error */
/* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
* would seem more natural, but the C99 standard leaves
* casting from "void *" to a function pointer undefined.
* The assignment used below is the POSIX.1-2003 (Technical
* Corrigendum 1) workaround; see the Rationale for the
* POSIX specification of dlsym(). */
*(void **) (&cosine) = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
printf("%f\n", (*cosine)(2.0));
getchar();
dlclose(handle);
exit(EXIT_SUCCESS);
}
该程序可以在手册页中找到 - &#34; man dlopen&#34;
2)执行命令以查看来自不同交互式shell的两个PID的内存映射(这也可以使用代码完成) ps -fu pmap -x
3)比较两个图书馆的输出内容─ libdl-2.12.so //静态链接 libm-2.12.so //使用代码加载
内存映射所指的地址应该相同。
P.S。 - 可以找到详细信息here