地址捆绑 读操作系统概念第六版

 通常,程序以二进制可执行文件形式存储在磁盘上。为了执行,程序应被调入内存并放在进程内。根据所使用的内存管理方案,进程在执行时可以在磁盘和内存之间移动。在磁盘上等待调入内存以便执行的进程形成了输入队列。

通常的步骤是从输入队列中选一个进程并装入内存。进程在执行时,会访问内存中的执行中的指令和数据。最后,进程终止,其地址空间将被释放。

CPU所生成的地址通常称为逻辑地址,而内存单元所看到的地址(即,加载到内存地址寄存器中的地址)通常称为物理地址。

编译时和加载时的地址捆绑生成相同的逻辑地址和物理地址。

 

一个进程的整个程序和数据必须处于内存中,以便执行。进程的大小守内存大小的限制。为了获得更好的内存空间使用率,可以使用动态加载(dynamic loading)。采用动态加载时,一个子程序只有在调用时才被加载。所有子程序可以重定位的形式保存在磁盘上。主程序装入内存并执行。当一个子程序需要调用另一个子程序时,调用子程序首先检查另一个子程序是否已加载。如果没有,可重定位的链接程序将被用来加载所需要的子程序,并更新程序的地址表以反映这一变化。

动态链接库(dynamically linked library)。有的操作系统只支持静态链接库(static linking),因而系统语言库的处理和其他目的模块一样,由加载程序合并到二进制程序映象中。动态连接的概念与动态加载相似。这里,不是将加载延迟到运行时,而是将链接延迟到运行时。这一特点通常用于系统库,如语言子程序库。没有这一点,系统上的所有程序都需要一份其语言库的拷贝。这一要求浪费磁盘空间和内存空间。如果有动态链接,二进制映象中对每个库程序

的饮用都有一个存根。存根是一小段代码,用来指出如何定位适当的内存驻留库程序,或如果该程序不在内存时是如何装入库。

当存根执行时,它首先检查所需子程序是否已在内存中。如果不在,就将子程序装入内存。不管如何,存根会用子程序地址来替换自己。因此,下次再执行该子程序代码时,就可以直接进行,而不会因动态链接而产生任何开销。采用这种方案,使用语言库的所有进程只需要一个库代码拷贝就可以了。

动态链接也可用于库更新。一个库可能被新的版本所替代,且使用该库的所有程序会自动使用新的版本。没有动态链接,所有这些程序必须重新链接以便访问新的库。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值