何时使用动态链接和静态链接

动态链接和静态链接如何选择,选择用空间换时间还是用时间换空间,详见下文。转自IBM Knowledge Center

原文

原文是我在2015年刚工作一年转载的,内容仍然正确,但是其论域仅覆盖性能因素,已经不符合当前的时代环境。更新的内容请见下方增补

操作系统提供了生成和使用动态连接共享库的工具。应用程序引用的在共享库中定义的外部符号通过动态链接在加载的时候被处理。当用户编译使用了共享库的程序时,将会以默认的方式动态连接到用户的程序中。

共享库的思想是只保存一个经常使用的例程并存储在唯一的共享库代码段中。这些公共例程可以显著降低可执行程序的大小从而节省磁盘空间。

可使用动态链接减少程序大小,但通常会影响程序的性能。共享库代码不是保存在磁盘的可执行映像文件中,而是保存在一个分开的库文件中。共享库代码一次加载到共享库段内并为所有引用它的程序服务。因此动态连接库减少了程序的虚拟存储空间,当前运行的多个应用程序(或同一应用程序的不同版本)可以引用动态连接库中的程序。动态连接库也减少了程序所需的磁盘空间,在同一个系统中存储的几个不同应用程序共享同一个动态库。

动态库的其他优点如下

  • 由于共享库代码以在存储器中,从而减少加载时间。
  • 由于操作系统减少了标明多个应用程序或同一应用程序的不同版本使用的共享库代码而不是仅被单一应用程序引用的代码的页数的几率。从而减少了缺页故障的发生。
  • 在应用程序装载后,库中的程序是动态而不是静态地连接到应用程序中。这使应用程序无需重新编译或绑定就自动地将程序的变化继承到动态库中。

动态链接的缺点如下

  • 从性能的角度看,可执行程序访问共享存储段需要“粘联代码”。在每次引用共享库中的程序需要八个机器周期时会影响运行的性能。使用动态连接库的程序通常比使用静态连接库的程序慢。- – 另一个更微小的影响是“引用定位”的降低。你可能只用到库中的一些程序,但这些程序分散存储在库的虚拟地址空间中。这样用户需要存取程序的页面数显著比所有这些程序绑定到可执行程序中的页面数多。这样的话,如果你是这些库程序的唯一用户,当你将这些程序调入内存时更有可能产生页面错误。另外由于要扫描更多的页面,会增加指令转化后备缓冲器 (TLB) 丢失的可能性。
  • 当应用程序有限引用库中的过程时,包含引用程序的库中的每一个页面必须分别到入内存中。如果程序很小,使用静态链接会使在不同库页面中的程序连成一个单一页面,这样的话动态连接会增加页面从而降低程序运行性能。
  • 动态连接程序取决于一个兼容的动态库。如果动态库发生了变化(例如发布新的编译器会改变动态库),可能要改写应用程序以兼容新版本的动态库。如果系统删掉了动态库,使用了动态库的程序就不能正常运行。

在静态连接程序中,所有的程序代码包好在一个可执行模块中。因为库程序静态连接到应用程序中,库的引用效率更高。静态连接增加应用程序文件的大小,如果系统同时还运行其他的应用程序时,静态连接也会增加内存中代码的大小。

2023年增补

随着现实生活中的设备性能越来越强,CPU主频变高核数变多,内存也越来越大,如何链接依赖库越来越少的考虑性能因素了。我这里结合工作经验谈一下兼容性因素、热更新因素和许可证因素。

增补正文参见何时使用动态链接和静态链接2023版

发表评论

为防机器,验证码请直接输入4个数字1

*