是否会使用共享库代替静态库影响内存使用?

时间:2011-03-05 06:37:57

标签: c++ fork dynamic-library

我正在连接10个静态库。

当我使用动态库时,我的二进制文件大小正在减少。

据我所知,使用动态库不会减少内存使用量。

但是我的大四学生告诉我,使用共享库也会减少内存使用量?(当多个进程运行相同的可执行代码时。)

这句话是对的吗?

他告诉我,因为库中没有重复的函数副本,所以内存使用量会减少。当您创建该进程的n个实例时。

当进程启动时,它会分叉10个孩子。那么使用动态库代替静态库会减少总内存使用量吗?

3 个答案:

答案 0 :(得分:8)

在您的示例中,动态库不会为您节省太多。当您在现代操作系统上分叉流程时,所有页面都会在写入时标记为复制而不是实际复制。因此,您的静态库已经在您的10个流程副本之间共享。

但是,您可以保存的位置是在不同进程之间共享动态库而不是同一进程的分支。因此,如果你使用相同的glibc.so作为另一个进程,这两个进程共享glibc.so的物理页面,即使它们是不相关的进程。

答案 1 :(得分:4)

如果你分配给定的进程,那应该没什么区别,因为大多数操作系统都使用copy-on-write。这意味着只有在页面更新时才会复制页面,因此共享库中的代码段之类的内容不应受到影响。

另一方面,如果静态链接,不同的进程将无法共享代码。考虑一下libc,它实际上是每个二进制链接...如果它们都是静态链接的,你最终会在内存中找到几十个printf副本。

最重要的是,你不应该静态链接你的二进制文件,除非你有充分的理由。

答案 2 :(得分:2)

在这种情况下你的大四是正确的。共享库的单个副本将被加载到内存中,并将被引用它的每个程序使用。

此处有关于此主题的帖子:

http://www.linuxquestions.org/linux/articles/Technical/Understanding_memory_usage_on_Linux