2

我正在链接 10 个静态库。

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

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

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

这种说法对吗?

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

当进程开始时,它的 fork 是 10 个孩子。那么使用动态库代替静态库会减少总内存使用吗?

4

3 回答 3

9

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

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

于 2011-03-05T06:44:00.853 回答
4

如果你 fork 给定的进程,应该不会有太大的区别,因为大多数操作系统都使用写时复制。这意味着页面只有在更新时才会被复制,因此共享库中的代码段等内容不应受到影响。

另一方面,如果它们是静态链接的,则不同的进程将无法共享代码。考虑 libc,实际上每个二进制链接都针对...如果它们都是静态链接的,那么您最终会在内存中获得数十个 printf 副本。

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

于 2011-03-05T06:44:16.717 回答
2

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

这里有一篇关于这个主题的帖子:

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

于 2011-03-05T06:41:39.040 回答