Mik*_*ike 2 c linux memory linker dynamic-linking
在低内存Linux系统上,我有一个由单个可执行文件和许多共享库组成的项目.这些库不与其他可执行文件共享,并且只有一个可执行文件实例随时运行.有人告诉我,这个设置允许共享库在不处于活动状态时从内存中卸载.它是否正确?
在我看来,简单地将整个项目构建为单个静态二进制文件(当然不包括系统共享库)更有意义,因为每个函数只有一个副本在内存中是活动的.
这两种方法有区别吗?
有人告诉我,这个设置允许共享库在不处于活动状态时从内存中卸载.它是否正确?
从某种意义上说,是的.如果内存压力变高,内核内存管理器会处理这个问题.可以简单地从内存中删除只读部分(例如代码),并在需要时再次根据原始文件加载回来.其他部分可以换成交换文件.完全未使用的代码和数据甚至不会被加载到内存中.加载或"卸载"的粒度是1个内存页,通常是4096个字节.(即它不是每个功能/文件或类似的东西)
但是,对于可执行文件和共享库完全相同 - 如果只有一个使用这些共享库的可执行文件,那么使用共享库就无法获得这方面的任何内容.
如果使用相同的共享库有几个不同的可执行文件,它们可以共享共享库的只读部分的内存,因此在这种情况下,您可以节省内存.这需要花费很少的成本,您的共享库应该编译为PIC代码,这通常会导致编译的代码稍微大一些,执行速度会慢一些.