在Linux上使用共享库来减少内存负载

在Linux上使用共享库来减少内存负载

问题描述:

在低内存的Linux系统上,我有一个由单个可执行文件和多个共享库组成的项目。这些库不与其他可执行文件共享,并且任何时候只有一个可执行文件实例正在运行。有人告诉我,这种设置允许共享库在未处于活动状态时从内存中卸载。它是否正确?在Linux上使用共享库来减少内存负载

在我看来,仅仅将整个项目构建为一个静态二进制文件(当然不包括系统共享库)会更有意义,因为每个函数只有一个副本在内存中处于活动状态。

这两种方法有什么不同吗?

+0

如果你真的绝望了,你可以使用'dlopen'和'dlclose'手动加载和卸载库,如果你的程序不需要一直使用所有库。 – markgz 2014-09-20 02:03:57

有人告诉我,该设置允许共享库在未处于活动状态时从内存中卸载。它是否正确?

从某种意义上说,是的。如果内存压力变高,内核内存管理器会处理这个问题。只读部分(如代码)可以简单地从内存中删除,并在需要时从原始文件重新加载。其他部分可以换出到交换文件。完全未使用的代码和数据甚至不会被加载到内存中。加载或“卸载”的粒度是1个内存页面,通常为4096个字节。 (即它不是每个函数/文件或任何类似的东西)

然而,它对于可执行文件与共享库完全相同 - 如果只有一个可执行文件,则不会通过使用共享库获得任何相关信息使用这些共享库。

如果有几个不同的可执行文件使用相同的共享库,它们可以共享共享库的只读部分的内存,所以在这种情况下可以节省内存。这是一个很小的代价,你的共享库应该被编译为PIC代码,这通常会导致编译后的代码稍微大一点,并且执行速度要慢几个百分点。

+1

由于只有一个可执行文件使用库,静态链接可能节省空间*和*时间... – Deduplicator 2014-09-20 00:05:50

+2

静态链接,特别是如果使用'-fdata-sections -ffunction-sections -Wl,-gc-sections'或更好但LTO几乎肯定会节省大量空间。静态链接总是可以节省时间。 – 2014-09-20 01:11:39