7.程序员的自我修养---动态链接

1.为什么要动态链接 
	静态链接缺点:
		1.静态链接的方式对于计算机内存和磁盘的空间浪费非常严重。特别是多进程操作系统情况下,静态链接极大的浪费了内存空间。
		2.静态链接对程序的更新,部署和发布也会带来很大的麻烦。一旦程序中有模块更新,整个程序就要重新链接,发布给用户

	要解决空间浪费和更新困难这2个问题最简单的办法就是把程序的模块互相分割开来,形成独立的文件,而不再将它们静态的链接在一起。
  简单的说,就是不对哪些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说把这个过程推迟到了运行时再进行。这就是
  动态链接的基本思想。

    多个程序共享一个目标文件模块的好处是,节省内存,还可以减少物理页面的换入换出,也可以增加 CPU 缓存的命中率,因为不同的进程间的
  数据和指令都集中子啊了同一个共享模块上。

    动态链接也使得程序的升级变得很简单。当我们要升级程序库或程序共享的某个模块时,理论上只要简单的将旧的目标文件覆盖,而无需将所有的
  程序再重新链接一遍。当程序下一次运行的时候,新版本的目标文件会自动装载到内存并链接起来。程序就完成了升级。

	动态链接还有一个特点是,程序在运行时可以动态的选择加载各种程序模块,这个有点就是被人们后来用来制作程序的插件。比如某个公司开发了某个
  产品,它按照一定的规则制定好程序的接口,其他公司或开发者可以按照这种接口来编写符合要求的动态链接文件。该产品程序可以动态的载入各种第三方
  开发的模块,在程序运行的时候动态的链接,实现程序功能的扩展。

    动态链接还可以加强程序的兼容性。一个程序在不同的平台运行时可以动态的链接到由操作系统提供的动态链接库,这些动态链接库相当于在程序和操作系统
  之间增加了一个中间层,从而消除程序对不同平台之间的依赖。

    动态库的基本思想是把程序按照模块拆分成各个独立的部分,在程序运行时才将它们链接成一个完整的程序,而不是像静态链接一样,把所有的程序模块都链接成
  一个单独的文件。
    动态链接涉及运行时的链接以及多个文件的装载,必须要有操作系统的支持,因为动态链接的情况下,进程的虚拟地址空间的分布比静态链接的情况更为复杂,还有
  一些存储管理,内存共享,进程线程等机制在动态链接的情况下也会有些微妙的变化。

    当程序被装载的时候,系统的动态链接器会将程序所需要的所有动态库装载到进程的地址空间,并且将程序中所有未决的符号绑定到相应的动态链接库中,并进行
  重新定位。

    程序与 libc.so 之间真正的链接工作是由动态链接器完成的,而不是我们前面看到的静态链接器 ld 完成的。也就是说,动态链接把链接的这个过程从本来的程序
  装载被推迟到了装载的时候。动态链接会导致程序在性能的一些损失,性能损失大概在 5% 一下,这点性能损失能换来程序在空间上的节省和程序构建和升级时候的灵活。

1.为什么要动态链接 

猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/84101728