使用动态库节省内存

时间:2018-01-10 08:03:14

标签: c++ dll

如标题所示,多个进程可以在内存中共享相同的动态库副本吗?

我读了here。请搜索使用更少的资源。文章说“DLL可以减少加载到磁盘和物理内存中的代码重复”。我可以理解节省磁盘空间。虽然我不确定在使用DLL时是否保存了“物理内存”。在Unix中使用.so是否具有节省内存的相同优势?

2 个答案:

答案 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