程序员的自我修养(5)

动态链接

1.为什么要动态链接
静态链接让不同的程序开发者与部门能够相对独立地开发和测试自己的程序模块,促进了开发效率,程序规模随之扩大。但是静态链接的缺点有开始出现,比如浪费内存和磁盘空间,模块更新困难,故需要动态链接。

占用内存大,假设一个程序内部保存printf,scanf,strlen等这样的公用库函数,还会有数量相当可观的其它库函数与辅助函数,那么假设我们的机器运行100个程序,那么就会有100重复的模块群被链接到程序中,而一个普通程序需要1M的C语音库函数静态链接,那么至少要100M。而一个操作系统运行成千上万的程序,那占用的内存极大。
还有就是程序一旦静态链接完成运行后,一旦有一个模块修改了后,那么就需要重新链接整个程序模块。更新困难。

故使用到了动态链接,就是将程序的模块相互分割,形成独立文件,不是将所有目标程序链接后形成程序,而是程序启动后才开始链接,把原本链接的过程从运行程序前移动到运行程序后。

2.动态链接与静态链接案例
假设有两个程序,p1,p2。p1程序需要用到p1.o与lib.o,p2程序需要用到p2.o与lib.o。
如果是静态链接,那么p1和p2运行前,就会独自分别链接p1.o与lib.o,p2.o与lib.o,很明显lib.o重复两份。
但是是静态链接,运行了p1,首先知道p1.o是主程序是需要的,这个p1.o依赖lib.o,故同时将p1.o与lib.o移至内存。那么运行p2程序,我会知道需要p2.o与lib.o,可lib.o已经加入内存,是存在副本的,我们可以直接使用这个副本,故节省了lib.o的空间。

3.动态链接与静态链接缺点
很明显动态链接比静态链接节省空间,方便更新程序,但会损伤5%以下的性能,因为每次运行都要进行链接。典型的时间换空间。-

你可能感兴趣的:(程序员的自我修养,底层)