何谓静态链接?何谓装入时动态链接和运行时的动态链接

何谓静态链接?何谓装入时动态链接和运行时的动态链接,第1张

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。

静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。

像Unix ld程序这样的静态链接器(static linker)以一组可重定位的目标文件作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在一个节中;而未初始化的变量在另外一个节中。

动态链接英文是Dynamic Linking,他是使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,从某种意义上来讲大大促进了程序的开发效率,原先限制程序的规模也随之扩大。但是慢慢地静态链接的诸多缺点也逐步暴露出来,比如浪费内存和磁盘空间、模块更新困难等问题,使得人们不得不寻找一种更好的方式来组织程序的模块。

动态链接与静态链接对比

静态链接

优点:

① 代码装载速度快,执行速度略比动态链接库快;

② 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。

缺点:

使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

动态链接

优点:

①更加节省内存并减少页面交换;

② DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

③不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;

④适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

缺点:

使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。[1]

页面

动态页面:含有?的,或是以asp,php,jsp,aspx结尾的都是动态,动态页面是可以通过网站后台管理系统对网站的内容进行更新管理,动态页面在服务器里面不是真实存在的,访问动态页面需要经过数据库,动态页面是动态连接,发布公司产品,交流互动,博客,网上调查等,这都是动态网站的一些功能。

静态链接是在生成可执行程序的时候就把库中的内容加入到程序中。

载入时动态链接是在将功能模块读入内存时把动态库中调用到的相关模块的内容载入内存。

运行时动态链接是在执行程序调用到模块内容时再将动态库中的相应模块载入到内存。

这里有两个时间问题。一是载入时间,二是执行时间。

静态链接由于是在一开始就把所有模块都加载进入内存,所以如果模块很多的话效率就会被大大拉低。

载入时动态链接是分别载入,当把一个模块载入内存时检查有调用关系的模块载入,比静态链接节省了许多开销。

运行时动态链接则是把当前模块调用的模块推迟到调用的时候再载入。

三者之间的关系就像是机q,冲锋q和手q

机q在一开始就把所有子d装好,开q的时候很快,但也很笨重。

冲锋q则是将子d分d夹存好,轻便了许多,但是会有一段装填时间。

手q就更加轻便了,但是d夹容量更小,装填的频率又变高了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11796304.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存