【操作系统复习】内存分页 & 分段 & 段页式管理

分页管理是将进程逻辑空间进行划分,对物理内存也进行划分。进程划分称为页,内存划分称为页框、内存块。

页表

进程、内存进行划分之后,就需要有一个数据结构记录进程的哪一个页被放到了内存的哪一个页框去了。操作系统通过页表来进行记录。
页表根据页号按顺序进行存储。因为物理内存进行划分后,每一块大小固定,那么数额也就是固定的。所以块号的位数就是固定的。那么就可以利用数组的思维方式进行记录。
下标为0的存储0号页存放到哪一个物理块号。
所以页表大致基础的数据结构为一个线性表,下标为页号,内容为页框号的线性表。

如何实现地址转换

虽然分页进行了离散存放,但离散是对于页来说的,但是每一个页内的地址都是连续存放的。
所以一个逻辑地址可以理解为
逻辑地址 = 页号 ∗ 页大小 + 页内偏移量 逻辑地址 = 页号*页大小 + 页内偏移量 逻辑地址=页号页大小+页内偏移量
那么将这个逻辑地址转为物理地址可以采取以下步骤

  1. 给出一个进程的逻辑地址,确定逻辑地址的页号。
  2. 查页表确定在内存的块号,就可以求出内存块的起始地址。
  3. 内存块起始地址加上偏移地址就是对应的物理地址。

页号 = 逻辑地址 / 页面长度 页内地址 = 逻辑地址 % 页面长度 页号 = 逻辑地址 / 页面长度\\ 页内地址 = 逻辑地址 \% 页面长度 页号=逻辑地址/页面长度页内地址=逻辑地址%页面长度
而如果页面大小为2的整数幂,那么就相当于高位为逻辑地址,低位为页内地址。那么就可以直接取前面几位就是页号,后面几位就是页内地址。
同时
物理块号 = 页框号 ∗ 页面长度 + 页内地址 物理块号 = 页框号 * 页面长度 + 页内地址 物理块号=页框号页面长度+页内地址
所以如果页大小为2的整数次幂,可以让页表查询出的页框号直接代替高位,就可以得到物理地址。

快表

正常情况下,对于一个地址的访问需要访问两次内存。第一次去内存中查询页表,第二次取真正的数据/指令。
通过快表可以优化第一次访问内存。
快表是类似于cache的存储设备,存储速度在内存之上。
可以将近期访问的页表项放入快表之中,在进行逻辑页表到物理页框的转换时候,可以先访问页表。如果快表命中就不需要访问内存页表。只要访问一次内存,寻找真实的数据即可。
运用原理:时间局部性原理,空间局部性原理。

二级页表

  • 一级页表的问题
    如果进程较大的话,可能会占用多个页框,那么会导致页表过大。而进程在近期常常使用的区域可能只是一小部分。所以常驻内存的页表内大部分最近暂时用不到的。

所以可以进行一个二级划分。将页表进行等大拆分,常驻内存的为页目录表。页目录表存放二级页号存放的页框号。然后调二级页表进入内存,查询页框号,得到最终的物理地址。
那么驻留内存只需要为页目录表。
注意点:各级页表不应该超过一页。

分段管理

进程的地址空间按照程序自身逻辑关系划分为若干个段。每个段从0编址。每个段在内存中占据各个连续空间,段之间可以互不相连。
那么一个逻辑地址就可以表示为高位段号,低位段内地址。
而段号位数决定进程最多可以有几个段号,段内地址位数决定一个段最大的大小。

段表

与页表类似,进程分为一个一个段,也需要有数据结构对于每个段进行记录。
段表结构为段长与基址。基址表示这个段在内存当中的起始地址为多少。段长表示这个段有多长。因为每一个段的段长不固定。

逻辑地址的转换

PCB中会有段表的起始地址与段表长度,在进程调入CPU运行时候,会将这个值加载进CPU的段表寄存器。

  1. 根据段号与段表寄存器中的段表长度进行检查,如果越界,发生中断
  2. 根据段号到内存段表查询,比较段内地址与段表中保存的段长,如果越界也发生中断。
  3. 根据段表查找内存中这个段的起始地址,最终得到物理地址。

分页与分段

  • 页是物理单位,分页的目的是离散分配,提高内存利用率。分页完全只是为了系统的需要,对用户不可见。
  • 段是逻辑单位,分段是为了更好满足用户需求,分段用户是可见的。
  • 分页进程地址空间为一维,
  • 分段进程地址空间为二维
  • 分段比分页容易实现信息共享和保护。因为分页跟逻辑没有关系,可能会将多个逻辑块放在一个页面。而分段会将一个逻辑块为一个段。每个逻辑块都是独立的。

段页式管理

分段有利于用户逻辑维护,分页能够提高内存利用率。
如果单纯使用分段管理,与动态分区分配很类似,对内存空间的利用率并不好。
可以先对进程进行分段,然后对于一个段进行分页管理,就可以让进程即保持逻辑性,也能保证内存利用率较高。

段页式地址转换

段页式地址转换改变为先进行段号转换,再进行页转换。

  1. 先从逻辑地址中的段号与段寄存器里的段长进行比较,越界发生中断
  2. 然后根据段寄存器中的段表地址找到段表,这时候段表存储内容发生改变,每一个内容应该为页表项的长度,以及页表起始地址。
  3. 然后根据页号与该段进行比较,如果越界就发生中断。
  4. 进入内存查询页表,查询页框。
  5. 最后获得物理地址
    总共访问三次内存:第一次访问段表,第二次访问页表,第三次访问数据。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值