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

时间:2014-09-19 23:45:51

标签: c linux memory linker dynamic-linking

在低内存Linux系统上,我有一个由单个可执行文件和许多共享库组成的项目。这些库不与其他可执行文件共享,并且只有一个可执行文件实例随时运行。有人告诉我,这个设置允许共享库在不处于活动状态时从内存中卸载。这是对的吗?

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

这两种方法之间有区别吗?

1 个答案:

答案 0 :(得分:5)

  

有人告诉我,这个设置允许在不使用时从内存中卸载共享库。这是对的吗?

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

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

如果有几个不同的可执行文件使用相同的共享库,它们可以共享共享库的只读部分的内存,因此在这种情况下,您可以节省内存。这需要花费很少的成本,您的共享库应该编译为PIC代码,这通常会导致编译后的代码稍大一些,执行速度会慢一些。