【学习笔记】操作系统之分页

本人学习及复习笔记,内容参考自《操作系统导论》英文原版(图片来源)及中文译版第18-22章,仅供学习参考。

分页

概念名字与简介

  • 分页 paging···将一个进程的地址空间分割成固定大小的页(page)。
  • 页帧 page frame···把物理内存看成定长槽块的阵列,包含一个虚拟内存页。
  • 页表 page table···每个进程记录地址空间的每个虚拟页在物理内存中的位置的一个数据结构,作用是把虚拟页号映射到物理帧号。
  • 虚拟页面号 VPN(virtual page number)···选择第几个页。
  • 页内偏移量 offset···选择该页的哪个字节。
  • 物理帧号 PFN···对应的物理地址。
  • 线性页表···最简单的页表,本质上是数组。
  • 页表项 PTE···一个页号与其对应的物理块号。
  • 页表基址寄存器 PTBR···包含页表的初始位置的物理地址。
  • 地址转换缓存 TLB···频繁发生的虚拟到物理地址转换的硬件缓存。
  • 页目录 page directory···为每页页表包含了一项。记录页表的也在哪里,以及是否有效。
  • 页目录项 PDE···包含有效位和页帧号。
  • 页目录索引 PDIndex···索引页目录项的地址
  • 页表索引 PTIndex···索引页表本身

分页介绍

地址空间与页帧

在这里插入图片描述

地址转换过程

在这里插入图片描述
地址空间大小为 2M ,包含 2N 个字节 => 虚拟地址空间有 M 位,VPN有 N 位,偏移量有 M-N 位 => 线性页表有2N个项

页表项 PTE

在页表中,一个页号与其对应的物理块号称之为一个页表项。它包含了:

名称 name 作用
有效位 valid bit 该地址转换是否有效
保护位 protection bit 是否可以读取、写入、执行
存在位 present bit 在物理存储器或在磁盘上(被换出)
脏位 dirty bit 是否被修改过
参考位 reference bit 是否被访问

在这里插入图片描述

利用分页访问内存

1 // 从虚拟地址中挑选出VPN(利用掩码和位移)
2 VPN = (VirtualAddress & VPN_MASK) >> SHIFT
3
4 // 页表寄存器指向PTE数组的索引
5 PTEAddr = PTBR + (VPN*sizeof(PTE))
6
7 // 硬件从内存中获取PTE,形成物理地址
8 PTE = AccessMemory(PTEAddr)
9
10 // 若有效位为真切保护位为真
11 if (PTE.Valid == False)
12 		RaiseException(SEGMENTATION_FAULT)
13 else if (CanAccess(PTE.ProtectBits) == False)
14 		RaiseException(PROTECTION_FAULT)
15 else
16 		// 那么可以从内存中获取所需的数据并放入eax
17 		offset = VirtualAddress & OFFSET_MASK //详看上文地址转换过程图
18 		PhysAddr = (PTE.PFN << PFN_SHIFT) | offset
19 		Register = AccessMemory(PhysAddr)

快速地址转换(TLB)

TLB基本算法

使用线性页表和硬件管理的TLB。先提取VPN,然后检测TLB是否含有该转换映射:有则TLB命中,直接取出PFN转为物理地址并访问(快速);无则TLB未命中,则如上文利用分页访问内存做法一致。TLB更新成功后,系统重新尝试该指令,快速引用。

算法:硬件首先从虚拟地址获得VPN,检查TLB是否命中,若命中,则获得最终的物理地址并从内存中取回。如果TLB未命中,则硬件在内存中利用页表基址寄存器查找页表,并使用VPN查找该页的PTE作为索引。如果页有效并且存在于物理内存中,则硬件从PTE中获得PFN,将其插入TLB,并重试该指令,这次产生TLB命中。
在这里插入图片描述
地址空间有 M 位 ,页大小为 2P,页表项为2E字节 => 虚拟地址空间有 M 位,VPN有 M-P 位,偏移量有 P 位 => 虚拟内存页有 2M-P个 => 页表大小为2M-P+E字节

让页表更小

方法一:更大的页

使用更大的页,参考上文的计算方法,P增大,偏移量增长,VPN减小,页表也减小。
缺点:大内存页导致每页内的内部碎片问题。过快耗尽内存。

方法二:分页与分段

将分页与分段相结合,以减少页表的内存开销。为进程的每个逻辑分段(代码段、栈、堆)提供一个页表,栈与堆之间未分配的页不再占用页表中的空间了。
增加一个分段位SN,来确定要用那个基址和界限对,然后将物理地址与VPN结合形参PTE的地址:
在这里插入图片描述
缺点:要求使用分段;导致外部碎片出现。

方法三:多级页表

将页表分成页大小的单元,如果整页的页表项无效,就完全不分配该页的页表:
在这里插入图片描述
缺点:在TLB未命中时,需要从内存加载两次,一次用于页目录,一次用于PTE本身;复杂性,页表查找更复杂了。

PTE地址的计算
首先检索到页目录,从VPN的高位提取页目录索引PDIndex,从而计算页目录项PDE的地址,得到PDE,若有效,则通过该PDE指向的页的页帧号PFN计算PTE地址。
在这里插入图片描述
PDEaddr = PageDirBase + (PDIndex * sizeof(PDE))
PTEaddr = (PDE.PFN << SHIFT) + (PTIndex * sizeof(PTE))

多级页表
将页目录本身拆成多个页,然后在其上添加另一个页目录,指向页目录的页。从而达到 使页目录的每一部分都能放入一个页 的目标。
在这里插入图片描述

下面给出多级页表控制流算法的代码,标记部分为与上文中图19.1的TLB控制流算法的不同之处:多了从页目录对PDE寻址,页表项的寻址计算不一样,多了页表索引的计算。
在这里插入图片描述

超越物理内存

交换空间

为了支持更大的地址空间,在硬盘上开辟一部分空间用于物理页的移入和移出,这样的空间就叫交换空间

页错误

当硬件在PTE中寻找是,发现页不再物理内存中(页表项的存在未为0),而在硬盘上。页错误就是访问不在物理内存中的页。

需要通过操作系统的页错误处理程序来处理页错误:首先,操作系统为换入的页找到一个物理帧,如果没有,则通过交换算法从内存中提出一些页,释放帧供使用。获得物理帧后,处理程序发出I/O请求从交换空间读取页。最后,更新页表,重试指令,TLB未命中,再重试,TLB命中并访问。
在这里插入图片描述

替换策略

平均内存访问时间 AMAT = (PHit · T访问内存) + (PMiss · T访问磁盘)
替换策略:确定从内存中踢出那个页。

最优替换策略

替换内存中最远将来才会被访问到的页。
缺点:未来的访问无法预知,只能作为比较。

FIFO替换策略

页在进入系统时,简单地放入一个队列,发生替换时,队列尾部的页被踢出。

随机替换策略

在内存满的时候随机选择一个页进行特换。

LRU替换策略

替换最近最少使用的页面。

近似LRU

时钟算法:当进行页替换时,检查当前的页的使用位,若为1,则最近被使用不适合被替换,但改为0;时钟指针递增到下一页,直到找到使用位为0的页。

发布了10 篇原创文章 · 获赞 14 · 访问量 650

猜你喜欢

转载自blog.csdn.net/weixin_42368748/article/details/103393312