链接详解以及静态链接和动态链接的区别

在学习操作系统的时候,对于书上的内存管理部分中的链接一直无法看懂,趁着假期的时间查阅学习了一下,供大家分享参考:
可以借用高级语言如C语言来理解链接,用户编写的若干个代码文件经编译器编译后,变成若干个目标模块(也就是把高级语言翻译成机器能够看懂的机器语言)。此时就需要链接程序来对这些目标模块进行链接,它会将这若干个目标模块和它们调用的库函数链接在一起,然后形成一个整体的模块,然后才会被放入内存中从而被调用。
下面是一些便于理解的图例:
在这里插入图片描述
在这里插入图片描述

明白链接是什么操作后,我们给出链接的定义:

源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块链接形成装入模块,链接是将各种代码和数据片段收集并组合成为一个单一文件的过程。

而链接又分为静态链接和动态链接

静态链接
源代码被翻译成机器代码时,在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块(又称执行模块),以后不再拆开。

简单的说,就是把互相依赖的源代码文件和需调用的库函数全部都提前加载到可执行文件的模块当中去,形成一个文件集合。

优点:执行文件时速度会比较快。
缺点:不利于代码共享、不利于模块的独立升级、可能链接一些不会执行的模块,浪费存储空间和处理机时间。

动态链接

应用程序来执行(对某些目标模块的链接,是在程序执行中需要该目标模块时,由操作系统去找到该模块并将之装入内存,随后把它链接到调用者模块上),执行时代码可移动,需地址转换(映射)硬件支持。

简单的说,就是执行文件的时候才把所需的模块调用到内存当中去,把比如现在有两个程序test1.o和test2.o,这两者共用同一个库li.o,假设首先运行程序test1,系统首先加载test1.o,当系统发现program1.o中用到了li.o,即test1.o依赖于lib.o,那么系统接着加载li.o,如果program1.o和lib.o还依赖于其他目标文件,则依次全部加载到内存中。当test2运行时,同样的加载test2.o,然后发现test2.o依赖于li.o,但是此时li.o已经存在于内存中,这个时候就不再进行重新加载,而是将内存中已经存在的li.o映射到test2的虚拟地址空间中,从而进行链接(这个链接过程和静态链接类似)形成可执行程序。

优点:凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。
缺点:文件执行时速度一般会比静态链接慢。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

投三分的金闪闪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值