操作系统-内存的分页和分段管理

操作系统-王道老师

第三章-内存的分页和分段管理

目录:

1.基本分页存储管理的基本概念
    1.1 重要概念
    1.2 如何时间地址转换
    1.3 逻辑地址结构
    1.4 页表
2.基本地址交换机构
    2.1 页表寄存器的作用
    2.2 地址转换过程
    2.3 其他小细节
3.具有快表的地址交换机构
4.两级页表
    4.1 单级页表存在的问题
    4.2 两级页表
    4.3 如何实现地址变换
    4.4 几个细节
5.基本分段存储管理方式
    5.1 分段
    5.2 段表
    5.3 分段地址变换
    5.4 分段地址变换流程
    5.5 分段 VS 分页

1. 基本分页存储管理

1.1 重要概念
  1. 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块” 。每个页框有一个编号,即“页框号”(或者内存块号”、“页帧号”、“物理块号”)页框号从0开始。
  2. 将用户进程的地址空间也分为页框大小相等的一个个区域,称为“”或“页面”。每个页面都有一个编号,即“页号”,页号也是从0开始的

注:进程的最后一个页面可能没有一个页框那么大,因此,页框不能太大,否则就可能产生过大的碎片

  1. 操作系统以页框为单位为各个进程分配内存空间,进程的每个页面分别放入到一个页框中,也就是,进程的页面与内存的页框一一对应的关系,各页面间不需要连续存放,也不必按先后顺序来,可以放不相邻的页框中。

在这里插入图片描述

1.2 如何进行时间地址转换
例:逻辑地址为80的内存单元,应该在1号页,该页在内存中的起始位置为450,逻辑地址为80的内存单元相对于该页的起始地址而言,“偏移量就”应该是30。
实际物理地址:450 + 30 =480

在这里插入图片描述

计算方法:

  1. 要计算错逻辑地址对应的页号
  2. 要知道该页号对应的页面在内存中的起始地址
  3. 要计算出逻辑地址在页面内的“偏移量”
  4. 物理地址 = 页面地址 + 页内偏移量

如何计算:

主要公式:
页号 = 逻辑地址/页面长度(取除法的整数部分)
页内偏移量 = 逻辑地址 % 页面长度(得到余数)
假设用32个二进制位表示逻辑地址:
	页面大小 = 2^12B = 4096B = 4KB
	为了方便计算,页面大小一般要为2的整数倍

在这里插入图片描述

计算案例:

在这里插入图片描述

1.3 逻辑地址结构

在这里插入图片描述

地址结构包含两个部分:前一部分为页号, 后部分为页内偏移量W。在上图所示的例子中,地址长度为32位,其中0-11位为“页内偏移量”,或称**“页内地址”,12~31 位为“页号”**。

如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是2K个内存单元
如果有M位表示“页号”,则说明在该系统中,- 一个进程最多允许有2M个页面

1.4 页表

为了能知道进程的每个页面在内存中的位置,操作系统为每个进程都设置了一个页表,用来存储页面的位置。

在这里插入图片描述

  1. 一个进程对应一张页表
  2. 进程的每一页对应一个页表项
  3. 每个页表项由“页号” 和“块号”组成
  4. 页表记录进程页面和实际存放地址的对应关系

问题: 为什么每个页表项的长度都相同,页号是”隐含“的?

Eg:假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该为多少字节?

因此4GB的内存总共会被分为2^32/ 2^12= 2^20个内存块,因此内存块号的范围应该是0~ 2^20-1,因此至少要20个二进制位才能表示这么多的内存块号,因此至少要3个字节才够(每个字节8个二进制位,3个字节共24个二进制位)
在这里插入图片描述

2.基本地址交换机构

基本地址转换机构可以借助进程的页表将逻辑地址转换位物理地址。

2.1 页表寄存器的作用

通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F页表长度M。进程未执行时,页表的始址和页表长度放在进程控制块(PCB) 中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。

在这里插入图片描述

2.2 地址转换过程

普通

基本流程:

  1. 系统调用得到逻辑地址
  2. 根据逻辑地址计算出页号页内偏移量(逻辑地址 / 页面长度 = 页号) (逻辑地址 % 页面长度 得到余数 = 页内偏移量)
  3. 根据页表寄存器的起始地址页表长度判断当前页号是否越界
  4. 查询页表,找到页表对应的页表项,获得对应的内存块号
  5. 用内存块号和页内偏移量得到物理地址(地址块号起始地址 + 页内偏移量 = 物理地址
  6. 最终访问内存单元

3. 基于快表的的地址交换机构

在这里插入图片描述

  1. 基本流程与上诉流程基本一致
  2. 不同点在于两处,第一处是在寄存器判断是否越界之前进行快表查询,是否有页号对应的内存块,有直接返回,不往下查询
  3. 第二处在于同一个页号第一访问的时候,获得块号之后, 会将页号和块号放到快表中,下次再来访问的时候,就可以直接从快表中获取块号,加快了地址转换速度。

慢表和快表比较:

在这里插入图片描述

4.两级页表

4.1 单级页表存在的问题

问题一: 页表必须连续存放,当页表很大的时候,需要占用很多个连续的页框

问题二: 没有必要让整个页表常驻内存,因为进程在一段时间内只需要访问几个页框就可以正常运行

在这里插入图片描述

因此:

根据内存分配占用一大块内存的原理,我们可以对页表进行分组,使每个内存块刚好可以放入一个分组,页面大小4KB,每个页表项4B,每个页面可以存放1000个页表项,因此以1000个页表项为一组,每组刚好占用一个页面(内存块)为了能够找到页表分组,我们就需要建立一张表来对它进行管理,方便查找,这张表就叫做页目录表,或者称为外层页表,或称顶层页表。

4.2 二级页表的原理和地址结构

问题一分析:

在这里插入图片描述

实现:

在这里插入图片描述

问题二:

在这里插入图片描述

4.3 二级页表地址转换
  1. 按照地址结构将逻辑地址拆分为三部分
  2. 在PCB中读取出页目录表的起始址,根据一级页号查询页目录表,找到下一级目录表在内存中的存放位置
  3. 根据二级页号查表,找到最终的访问内存块号
  4. 结合业内偏移量得到物理地址
4.4 几个细节

在这里插入图片描述

5. 基本分段存储管理方式

5.1 分段
  1. 进程的地址空间:按照程序的自身逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址

  2. 内存分配规则: 以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻

  3. 由于按逻辑功能模块划分,用户编程更方便,程序可读性高

在这里插入图片描述

分段系统的逻辑地址:

分段系统的逻辑地址由**段号(段名)**和 段内地址(段内偏移量)组成。
在这里插入图片描述

其中:

  • 段号的位数决定了每个进程最多可以多少段
  • 段内地址位数决定了每个段的最大长度

在这里插入图片描述

5.2 段表

问题:

程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中,.找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表, 简称**“段表”**。

  1. 每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称为“基址”)和段的长度
  2. 各个段表项的长度长度是相同的,例如:某系统按照字节寻址,采用分段存储管理,逻辑地址结构为(段号16位,段内地址16位),因此用16位即可以表示最大段长,物理内存大小位4GB(可用32位表示整个物理地址)。因此,可以让每个段表项占16+32位,即6B,由于段表项长度一致,因此段号可以隐含的,不占内存空间,若段表存放的起始地址位M,则K号段对应的段表项存放的地址为 M+K*6

在这里插入图片描述

5.3 段表地址结构

在这里插入图片描述

5.4 段表地址变换流程

段表的地址变换了流程和页表的变换流程基本一致
在这里插入图片描述

5.5 分段、分页管理的对比

分页:

  1. 页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的
  2. 分页的用户进程地址空间是一维的,程序员只需要给出一个记忆符即可表示一个地址
  3. 页的大小固定且由系统决定

分段:

  1. 段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
  2. 分段的用户进程是二维的,程序员在标识一个地址的时,纪要给出段名,也要给出段的段内地址。
  3. 段的长度却不固定,决定于用户编写的程序。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
2. 分段的用户进程是二维的,程序员在标识一个地址的时,纪要给出段名,也要给出段的段内地址。
3. 段的长度却不固定,决定于用户编写的程序。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值