动态加载和动态链接库

动态加载

由于之前进程的整个程序和数据必须处于物理内存当中,因此进程的大小受物理内存大小的限制。为了获得更好的内存空间使用率的话,我们可以去使用动态加载。

采用动态加载,一个子程序只有在调用的时候才会被加载,所有的子程序都以可重定位的方式保存在磁盘上。主程序装入内存并且去执行,当一个子程序需要调用另一个子程序的时候,调用子程序的时候回先去检查另一个子程序是否已经加载,如果没有的话,就让可重定位的链接程序去加载所需要的子程序,并且去更新程序的地址表去反映这一变化。

动态加载的优点其实就是不用的子程序决不会被加载,动态加载不需要操作系统提供特别的支持,利用这种方法来涉及程序主要是用户的责任,不过操作系统可以帮助程序员,如提供子程序库以实现动态加载

动态链接库

有的操作系统只支持静态链接,也就是其实就是加载程序合并到二进制程序镜像中。而动态链接其实就是将链接延迟到了运行时,这个被用在系统库是极好的,因为如果说我们有很多应用程序都去调用了系统库的某些子程序,如果没有动态链接,我们就需要在这些应用程序中都去复制一份这些子程序的副本,这无疑是浪费磁盘空间和内存空间的

如果有了动态链接,二进制镜像当中对每个库程序的引用都有一个存根,存根其实就是一小段代码,用来指出如何定位适当的内存驻留库程序,或者说就是用来指出如果该程序不在内存当中应该如何装入库,在执行存根的时候,它会首先去检查子程序是否已在内存当中,如果不在的话就会将子程序装入内存。不管如何,存根都会用子程序的地址去替换自己,并且开始执行子程序,所以下次再指向子程序代码的时候,就可以直接进行执行了。使用系统库的所有的进程只需要有一份系统库代码就够了

动态链接也可用于库更新比如说修复了些许漏洞,一个库可以被新的版本所替代,并且该库的所有程序会自动的使用新的版本,如果没有动态链接,那么所有的这些程序都必须重新去链接这样才可以去访问新的库,以及为了不使程序错用新的、不兼容版本的库,程序和库将包含版本信息,这样的话多个版本就都可以装入内存,然后程序可以通过版本信息去决定使用库的哪个版本

猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/80254726
今日推荐