操作系统:静态链接与动态链接

  • 什么是库?

    • 库是现有的、成熟的、可以复用的代码。现实中每个程序都要依赖很多的底层库。
    • 本质上来讲,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
  • 将一个源文件编译链接成一个可执行文件的步骤:
    image

  • 静态链接

    • 为什么要进行静态链接

      • 在实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件。
      • 而且多个源文件之间会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数。
      • 但是每个源文件都是独立编译的,即每个.cpp文件会形成一个.o文件,为了满足依赖关系,需要将这些源文件产生的目标文件进行链接,从而形成一个可执行程序。
    • 静态链接的原理
      image

    • 静态链接的缺点

      • 浪费空间,因为每个可执行程序对需要的目标文件都有有一份副本,所以如果多个程序对同一个目标文件都有依赖,这个目标文件会在内存中有多个副本。
      • 更新比较困难,因为每当库函数的代码被修改,就需要重新进行编译链接形成可执行程序。
        image
    • 静态链接的优点:

      • 在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。
  • 动态链接

    • 为什么会出现动态链接
      • 解决静态链接中出现的两个问题:一是空间浪费,二是更新困难。
    • 动态链接的原理
      • 动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完成的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。
      • 假设有两个程序program1.o和program2.o,它们共用同一个库lib.o。假设首先运行程序program1,系统首先加载program1.o,当系统发线program1.o中用到了lib.o,那么系统接着加载lib.o。当program2.o运行时,同样的加载program2.o,然后发现program2.o依赖于lib.o,但是此时lib.o已经存在于内存中,那么此时不再重新加载,而是将内存中已经存在的lib.o映射到program2的虚拟地址空间中,从而进行链接形成可执行文件。
        image
    • 动态链接的缺点
      • 因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。
    • 动态链接的优点
      • 节省空间。因为即使所有程序都依赖都一个库,但是该库在内存中只存在一个副本。
      • 更新方便,因为更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会自动加载到内存中并且链接起来。
原文地址:https://www.cnblogs.com/xiaobaizzz/p/12266801.html