程序的分段载入与内存分页

一.重定位载入内存

我们知道,程序代码中所指向的地址是以0为基址的相对地址,也叫做逻辑地址。而在程序运行过程中我们需要将程序的逻辑地址指向实际的物理地址,即需要对逻辑地址进行重定位。

按照进行重定位时刻的不同可分为编译时重定位、载入时重定位和执行时重定位三种。编译时重定位程序只能放在内存的固定位置,载入时重定位一旦将程序载入内存就不能再二次移动了,这在日常使用的PC机中是存在问题的,例如:
在这里插入图片描述
在经历了交换操作后,进程在内存中的基地址都已经发生了改变,以上两种方法都不能再满足这种需求。
所以我们最常用的方式是运行时重定位
重定位的基本过程
在这里插入图片描述
程序载入内存时首先然后取出PCB(进程控制块,一种存放进程的管理和控制信息的数据结构)中的基地址,然后再加上代码中的逻辑地址,得到最终的物理地址。

二.程序的分段载入

为了符合程序员的观点,程序载入内存采用的是分段载入的方式。例如将程序按照功能和权限的不同分为数据段、变量集、函数库等不同的段代码,指令的定位相应采取段号+段内偏移的形式获取

分段载入过程的简单描述
当一个程序载入内存时采取分段载入的策略:分别从内存中寻找空闲分页同时将基地址记录在LDT表中,再将LDT表赋给PCB,系统再从PCB中读出LDT表里的基地址信息确定最终的物理地址

三.内存分页管理机制

(1)内存可变分区的局限性

可变分区是指按照程序所需的内存大小分配相应的内存空间。但这样的分配策略存在着一些问题:每一个内存分区里面都可能会存在着较大的内存碎片,这些内存碎片不能再直接被系统使用,需要对其进行内存紧缩,但在内存紧缩的过程内存是无法使用的。也就是说,系统会存在真空期。

(2)内存分页管理

为了解决可变分区的问题,引入了分页管理机制:将内存分成较小的页,通常大小设为4k(4k大小的设定是有讲究的),按照整数页的形式给程序段分配内存。

过程简单概述:
指令传入逻辑地址信息,然后将逻辑地址的值除以内存分页的大小(由于汇编指令中的数据都是16进制数据,故除以4k即是左移3位),得到的商即是页号,余数即是页内偏移地址;最后再通过查询页表,找到对应的页框号,乘以分页大小再加上页内偏移地址得出实际的物理地址。

(3)分页管理策略的问题与处理办法

为了提高内存利用率,我们让内存分页尽可能地小,但是这样又会使得页表项的增多。同时由于每一个进程都对应着一个页表,那么在多进程下光是页表就占用了较大的内存空间。

删除没有使用的页表项来减少页表项的想法破坏了页表项的有序性,增大了内存访问的时间复杂度。因此我们最终采取了多级页表+快表的处理办法。

类似于建立目录索引查找的思想,以二级页表为例,建立页目录表和页节表。将逻辑地址除以页节表的大小得到页目录号,余数做为页号,通过查询页目录号得到对应页节表,然后再在页节表中找到物理地址映射。这样的话,对于查询目录号以外的页表并不需要将其放入内存,有效提高了内存利用率。

祸福相倚,与之而来的问题:
多级页表的建立意味着内存访问次数的增加,每多一级页表就会多一次额外的内存访问,降低了系统的时间效率。对应着我们又引入TLB寄存器,在TLB中建立最近使用过的页表映射(类似于缓存的作用),即建立快表。按照局部性原理,快表拥有着较高的命中率,能有效提高逻辑地址到物理地址的查询速度
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值