【操作系统复习】Unit 3-2:页式内存管理

文章详细阐述了操作系统中进程的分类,包括系统进程和用户进程,以及作业与进程的区别。重点讨论了分页存储管理,包括页表、页框、地址变换过程以及页大小选择的优化。此外,提到了快表(TLB)在提高地址转换速度中的作用,以及多级页表在处理大逻辑地址空间时的应用。最后,介绍了页目录自映射的概念和页表在虚拟地址空间中的映射方式。

通常把进程分为系统进程和用户进程两大类

  • 系统进程:完成操作系统功能的进程
  • 用户进程:完成用户功能的进程

作业与进程的区别

  • 作业的完成:提交——>收容——>执行——>完成。进程是对已提交的程序所执行过程的描述,是资源分配的基本单位。
  • 作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业后,系统将它放入外存中的作业等待队列中等待执行。而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中
  • 一个作业可由多个进程组成,且必须至少由一个进程组成,反之不成立。
  • 作业的概念主要在批处理系统中,进程几乎所有的多道程序设计系统都有

作业、进程和程序之间的联系

  • 一个作业包括程序、数据、操作说明

  • 一个进程由进程控制块PCB、程序、数据集合组成

  • 这说明程序是进程的一部分,是进程的实体。一个作业可以划分为若干个进程来完成,而每个进程有其实体——程序和数据集合

分页:把主存空间划分为大小相等且固定的块/分区,是主存的基本单位。进程以块为单位申请主存的块空间

【每个分区就是一个“页框”(/页帧/内存块/物理块/物理页面),每个页框有个编号,称为“页框号”】

分页式存储管理的基本思想

  • 将逻辑地址连续的程序分散存放到若干个不连续的内存区域内,并保证程序的正确运行

  • 优点:充分利用内存空间、减小移动带来的开销

  • 针对问题:动态分配内存、碎片和紧凑问题

纯分页系统

  • 概念:如果不具备页面对换功能,必须把它的所有页一次装到主存的页框内;如果当时页框数不足,则该作业必须等待,系统再调度另外作业

  • 优点:

    • 没有外碎片,每个内碎片不超过页大小(平均产生半个块的内碎片)
    • 程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)
  • 缺点:

    • 程序全部装入内存
  • 逻辑地址连续,物理地址不连续

页、页表

  • 页:在分页存储管理系统中,把每个作业的地址空间分成一些大小相等的片,称之为页面或页(进程中的块)
  • 存储块:在分页存储管理系统中,把主存的存储空间也分成与页面相同大小的片,这些片称为存储块/页帧/内存块/物理块/物理页面/页框
  • 【每个分区就是一个“页框”(/页帧/内存块/物理块/物理页面),每个页框有个编号,称为“页框号”】
  • 页大小=块大小

页表

  • 系统为每个进程建立一张页表,记录页面在内存中对应的物理页号/物理块号,页表一般存放在内存中(在PCB中)

  • 进程的每个页面对应一个页表项,每个页表项由“页号”和“块号”组成

  • 页表负责记录进程页面和实际存放的内存块之间的映射关系

  • 页表的基址及长度由页表寄存器给出

分区地址结构:页号+偏移量

在这里插入图片描述

若页面较小:

  • 减少页内碎片和总的内存碎片,有利于提高内存利用率
  • 每个进程页面数增多,使页表长度增加,占用内存较大
  • 页面换进换出速度将降低

若页面较大

  • 每个进程页面数减少,页表长度减少,占用内存较小
  • 页面换进换出速度将提高
  • 增加页内碎片增大,不利于提高内存利用率。

内存分配的基本思想

  • 以页为单位进行分配,并按程序(作业)的长度(页数)进行分配

  • 逻辑上相邻的页,物理上不一定相邻

数据结构

  • 进程页表:
  • 物理页面表
    • 整个系统有一个物理页面表,描述物理内存空间的分配使用状况
    • 位示图,空闲页面链表
  • 请求表
    • 整个系统有一个请求表,描述系统内各个进程页表的位置和大小,用于地址转换,也可以结合到各进程的PCB里

地址变换

在这里插入图片描述

在这里插入图片描述

  • 访问一个数据需访问内存2次(页表1次,内存1次)

地址变换机构

  • 当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分。
  • 将页号与页表长度(页表长度是一共有多少页)进行比较,如果页号>=页表长度,则表示产生地址越界中断。(越界保护)
  • 页表始址F+页号P∗页表项长度页表始址F+页号P*页表项长度页表始址F+页号P页表项长度,得到该表项在页表中的位置,取出该页表项内容可得到该页的物理块号b,将之装入物理地址寄存器中。(地址变换)
  • 将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。

页表项的内容

在这里插入图片描述

页面大小的选取

  • 假定进程平均占用s个字节,页面大小是p个字节,一个页表项约占e字节
  • 分页开销为:sep+p2\frac{se}{p}+\frac{p}{2}pse+2p
  • 最优的页面大小p=2sep = \sqrt{2se}p=2se

如何提高分页的频率

  • 减小页表的大小
  • 提高虚拟地址到物理地址的映射速度

快表(TLB)

专门针对页表项的高速缓存,又称联想存储器/相联存储器,是一种特殊的高速缓冲存储器(cache),内容是页表中的一部分或全部内容。

相对的,主存中的页表称为慢表。快表的有效性基于局部性原理

CPU产生逻辑地址的页号,首先在快表中寻找,若命中就找出其对应的物理块;若未命中,再到页表中找其对应的物理块,并将之复制到快表。若快表中内容满,则按某种算法淘汰某些页。

快表示例:

在这里插入图片描述

有的TLB允许有些条目固定下来。通常内核代码的条目是固定下来的

TLB的其他特性

  • 有的TLB在每个TLB条目中还保存地址空间标识码(address-space identifier,ASID)。ASID可用来唯一标识进程,并为进程提供地址空间保护。当TLB试图解析虚拟页号时,它确保当前运行进程的ASID与虚拟页相关的ASID相匹配。如果不匹配,那么就作为TLB失效。
  • 除了提供地址空间保护外,ASID允许TLB同时包含多个进程的条目。如果TLB不支持独立的ASID,每次选择一个页表时(例如,上下文切换时),TLB就必须被冲刷(flushed)或删除,以确保下一个进程不会使用错误的地址转换【切换进程时,让上一个进程的TLB全部失效】

哈希页表、反置业表

一级页表

  • 若逻辑地址空间很大,则划分的页比较多。页表就很大,页表占用的存储空间大(要求连续) ,实现较困难。

  • 解决方法:

    • 动态调入页表:只将当前需用的部分页表项调入内存,其余的需用时再调入。

    • 多级页表

两级页表

  • 32位系统,页面大小为4K,则需要1M(二级页表项)+1K(页目录表)

  • 地址结构10 10 12

  • 页目录表/顶级页表/外层页表:建立的是二级页表的页号与其存放的物理块号的映射关系(告诉你第几张页表该上哪里去找)

    【规定:顶级页表最多只能有一个页面】

    【若采用多级页表机制,则各级页表的大小不能超过一个页面】

  • 访存次数(无快表):3(页目录表1次+二级页表1次+目标内存单元1次)

  • 地址变换

    • 按照地址结构将逻辑地址划分为三部分
    • 从PCB中读出页目录始址F,根据一级页号查页目录表,找到下一级页表在内存中存放的位置(得到物理块号)
    • 根据二级页号查表,找到最终想访问的内存块号
    • 结合页内偏移量得到目的物理地址,取对应内存单元的值

多级页表

  • 多级页表:继续破除页表存储的连续性假设
  • 多级页表结构中,指令所给出的地址除偏移地址之外的各部分全是各级页表的页表号或页号,而各级页表中记录的全是物理页号,指向下级页表或真正的被访问页
  • 无TLB时,n级页表访问次数n+1次(多级页表把一次访存变为多次访存)

在这里插入图片描述

页表机制带来的问题:内存访问效率严重下降

页表快速访问机制——MMU

  • 为了提高地址转换效率,CPU内部增加了一个硬件单元,称为存储管理单元MMU(Memory Management Unit)。其内部主要部件:

    • 页表Cache:又称TLB,用于存放虚拟地址与相应的物理地址

    • TLB控制单元:TLB内容填充、刷新、覆盖,以及越界检查

    • 页表(遍历)查找单元:若TLB未命中,自动查找多级页表,将找到的物理地址送与TLB控制单元。

MMU的工作过程

  • MMU得到VA后先在TLB内查找,若没找到匹配的PTE条目就到外部页表查询,并置换进TLB;
  • 根据PTE条目中对访问权限的限定,检查该条VA指令是否符合,若不符合则不继续,并产生异常;
  • 符合后根据VA的地址分段查询页表,若该地址已映射到内存中(根据PTE的标识),保持offset不变,组合出物理地址,发送出去。
  • 若该地址尚为映射到内存中,则产生缺页异常。

由于TLB的主导作用,一些OS教科书不区分MMU和TLB

页共享与保护

  • 各进程把需要共享的数据/程序的相应页指向相同物理块。
  • 页表项存的是物理地址的页框号

共享带来的问题

  • 若共享数据和不共享数据划在同一块,则有些不共享的数据也被共享,不易保护

  • 实现数据共享最好的方法:分段存储管理

页的保护

  • 地址越界保护

  • 在页表中设置保护位(定义操作权限:只读、读写、执行)

页目录自映射

  • 对于32位地址长度,可寻址空间为4GB
  • 采用12位页内偏移,表明内存页大小为4KB
  • 每个页表项负责记录1页(4KB)的地址映射关系
  • 整个4GB地址空间被划分为4GB/4KB=1M页,所以需要1M个页表项来记录逻辑-物理映射关系

PS:页表项:在页表中,一个页号与其对应的物理块号称为页表项。

在这里插入图片描述

在这里插入图片描述

1KB=210B1KB=2^{10}B1KB=210B 1MB=220B1MB=2^{20}B1MB=220B

1GB=230B1GB=2^{30}B1GB=230B 1TB=240B1TB=2^{40}B1TB=240B

1PB=250B1PB=2^{50}B1PB=250B 1EB=260B1EB=2^{60}B1EB=260B 1ZB=270B1ZB=2^{70}B1ZB=270B

页表在虚拟地址空间中映射

  • 每个页表项需要4字节,所以1M个页表项需要4MB,所以整个页表占用的地址空间大小就是4MB
  • 4MB页表进行分页存储,需要4MB/4KB=1024=1K个页表页【每一个页表页占4KB】
  • 每一页中存储4KB/4B=1024=1K项页表项
  • 由于一个页表项对应4KB内存,所以每一个页表页对应1024*4KB=4MB内存。这1024个页表页中有一个为页目录

页目录:页表页(存储页表的页)的地址映射

  • 1024个页表页逻辑上连续,物理上可以分散,其对应逻辑-物理映射关系记录在页目录中
  • 页目录占1页(4KB)空间,有1024项(页目录项),每一项指向一个页表页
  • 每一页目录项对应4MB内存(一页页表内1K个页表项,每个页表项对应4KB内存),1024个页目录项正好对应4GB内存(整个地址空间)

关键点

  • 存储页表的4MB地址空间中是整个4GB虚拟地址空间中的一部分,OS设计者可规定其所在位置(4MB对齐)
  • 一方面根据页目录的定义:记录这4MB(连续)地址空间到物理地址空间映射关系的,是一个4KB的页目录
  • 另一方面根据页表页的定义:记录这4MB(连续)地址空间到物理地址空间映射关系的,是一个4KB的页表页(当然,它属于整个4MB页表的一部分)
  • 所以,页目录和上述页表页内容相同,页目录无需额外分配单独的存储空间
  • 页目录就是上述4MB页表中的一页

页目录自映射:

  • 页目录中有一条PDE指向自身地址(即页目录基址)
  • "页目录自映射"的含义是页目录包含在页表当中,是我们采用的映射(或组织)方法的一个特征,是虚拟地址空间内的映射,与虚拟地址到物理地址的映射无关!

在这里插入图片描述

在这里插入图片描述

构建方法

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

推广:更多级页表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

X86初始系统页表建立

### 关于操作系统内存管理复习要点 #### 一、内存管理基本概念 内存管理系统负责管理和分配计算机系统的主存储器资源给各个进程。其主要目标是在多个程序之间公平有效地共享有限的物理内存空间,同时提高整体性能并保护各进程的数据安全[^1]。 #### 二、逻辑地址与物理地址转换机制 为了实现虚拟内存功能,现代操作系统采用了页表结构来完成从逻辑地址到物理地址之间的映射工作。每当CPU执行指令访问某个特定位置时,MMU(Memory Management Unit)会依据当前运行上下文中保存的信息查询相应的页表项,从而得到实际存在于RAM中的确切位置[^2]。 #### 三、分段和分页的区别及其优缺点分析 - **分段方**:将整个应用程序按照自然边界划分为若干独立部分,每一段都有自己的起始偏移量;优点是可以更好地支持模块化编程风格以及便于实施保护措施;缺点在于容易造成外部碎片问题。 - **分页方**:把连续线性地址区间分割成固定大小的小块——页面(Page),再通过硬件辅助快速定位对应的帧(Frame);这种方法能够有效减少内部零散未利用区域浪费现象的发生概率,但也增加了额外开销用于维护复杂的映射关系表格数据结构[^3]。 #### 四、请求调页技术原理说明 当一个正在被执行的任务试图读取尚未加载入实存的工作集成员时就会触发缺页异常事件(Paging Fault),此时内核接管控制权并将所需页面由磁盘交换区搬移到可用空闲区块之中,之后更新对应条目状态标志位以便下次可以直接命中缓存而无需再次经历相同过程[^4]。 ```python def handle_page_fault(page_number, process_id): # 假设已经实现了获取空闲帧函数 get_free_frame() frame_index = get_free_frame() # 将指定编号的页面载入选定的目标帧中 load_page_to_memory(page_number, frame_index) # 更新该进程中有关此页面的位置记录 update_process_pagetable(process_id, page_number, frame_index) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值