操作系统-存储管理(4)段页式虚拟存储

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统-存储管理(4)段页式虚拟存储
物理地址:⼜称绝对地址,即程序执⾏所使⽤的地址空间(处理器执⾏指令时按照物理地址进⾏)
逻辑地址:⼜称相对地址,即⽤户编程所使⽤的地址空间,从0开始编号,有两种形式:⼀维逻辑地址(地址)
⼆维逻辑地址(段号:段内地址)
主存储器空间的分配与去配:
分配:进程装⼊主存时,存储管理软件进⾏具体的主存分配操作,并设置⼀个表格记录主存空间的分配情况
去配:当某个进程撤离或主动归还主存资源时,存储管理软件要收回它所占⽤的全部或者部分存储空间,调整主存分配表信息
主存储器空间的共享:
多个进程共享主存储器资源:多道程序设计技术使若⼲个程序同时进⼊主存储器,各⾃占⽤⼀定数量的存储空间,共同使⽤⼀个主存储器
多个进程共享主存储器的某些区域:若⼲个协作进程有共同的主存程序块或者主存数据块
多道程序设计需要复⽤主存:
按照分区复⽤:主存划分为多个固定/可变尺⼨的分区,⼀个程序/程序段占⽤⼀个分区
按照页架复⽤:主存划分成多个固定⼤⼩的页架,⼀个程序/程序段占⽤多个页架
装载程序/加载器(loader)把可执⾏程序装⼊内存的⽅式有:
绝对装载
可重定位装载
动态运⾏时装载
地址转换:⼜称重定位,即把可执⾏程序逻辑地址转换成绝对地址,可分为:
静态地址重定位:由装载程序实现装载代码模块的加载和地址转换(⽆需硬件⽀持),把它装⼊分配给进程的内存指定区域,其中所有指令代码和数据的逻辑地址在执⾏前⼀次全部修改为内存物理地址。

早期单任务单⽤户OS使⽤。

动态地址重地位:由装载程序实现装载代码模块的加载,把它装⼊进程的内存在指定区域,但对链接程序处理过的应⽤程序逻辑地址不做修改,程序内存起始地址被置⼊重定位寄存器(基址寄存器)。

程序执⾏过程中每当CPU访问程序和数据引⽤内存地址时,由硬件地址转换机构截取此逻辑地址并加上重定位寄存器的值。

运⾏时链接地址重定位
存储保护:为避免主存中的多个进程相互⼲扰,必须对主存中的程序和数据进⾏保护。

这⼀功能需要软硬件协同完成,CPU检查是否允许访问,不允许则产⽣地址保护异常,由OS进⾏相应处理。

数据段可指定R/W或RO;程序段可指定R/E或RO
私有主存区中的信息可读可写;公共区中的共享信息则需根据授权
⾮本进程信息、未获授权的信息(如OS内核、页表等)不可读写
以下情况会发⽣存储保护错:
访问越权(访问操作与所拥有的访问权限不符):页表中设定访问(存取)权限
地址越界(转换得到的物理地址不属于可访问范围)
为了对操作系统的存储保护提供⽀持,硬件必须具有以下三种基本功能:
⽀持⾄少2种运⾏模式
管理模式:执⾏系统程序(内核)时处理器所处的模式,或称管理程序模式,简称管态、管理态、核⼼态、内核态
⽤户模式:CPU执⾏⾮操作系统的⽤户程序时,处理器所处的模式,或称⽤户状态、⽬标程序状态,简称⽬态、⽤户态
使⼀部分CPU状态只能由内核程序⽤管态指令(特权指令)读写⽽不能由⽤户程序读写:User/SuperVisor模式位、页表⾸地址、TLB等。

提供让CPU在管理模式和⽤户模式相互转换的机制:异常和陷阱(系统调⽤)使CPU从⽤户态转到内核态;异常处理中的“返回”指令使CPU从内核态转到⽤户态。

动态重定位、存储保护等,若⽆硬件⽀撑在效率上是⽆意义、⽆实现价值的。

地址转换/存储保护的硬件⽀撑图
内存不⾜的存储扩充技术:
移动技术:把已在内存中的进程分区连接到⼀起,也叫内存紧凑。

需要移动的两种情况:
(1)进程撤销之后释放分区时,如果它不与空闲区邻接,⽴刻移动使系统只保持⼀个空闲区
(2)进程装⼊分区时,若空闲区总和够⽤,但没有空闲区能容纳进程。

对换技术:如果当前⼀个或多个驻留进程都处于阻塞态,将其暂时移出内存(通常换出时间⽚耗尽或优先级较低的进程),腾出空间
这⼀⼯作需要软硬件协作完成,对换进程决定对换,硬件机构调⼊
覆盖技术:程序执⾏过程中不同的模块在内存中相互替代,以达到⼩内存执⾏⼤程序的⽬的。

实现技术:⽤户空间分为固定区和⼀个或多个覆盖区,把控制或不可覆盖部分放在固定区,其余按调⽤结构及先后关系分段并存放在磁盘上,运⾏时依次调⼊。

系统提供覆盖控制程序及相应系统调⽤,当程序装⼊运⾏时,由系统根据⽤户给出的覆盖结构进⾏覆盖处理,程序员必须指明同时驻留在内存的是哪些程序段,哪些是被覆盖的程序段(声明从程序调⽤结构获得)
虚拟存储器:在具有层次结构存储器的计算机系统中,⾃动实现部分装⼊和部分替换功能,从逻辑上为⽤户提供⼀个⽐物理内存⼤得多的、可寻址的虚拟存储器。

虚拟存储器是⼀种地址空间扩展技术,通常意义上对⽤户编程是透明的,除⾮⽤户需要进⾏⾼性能的程序设计。

虚拟存储器思想的提出原因:
(1)主存容量限制带来诸多不便:⽤户编写程序必须考虑主存容量限制、多道程序设计的道数受到限制
(2)⽤户编程⾏为分析:全⾯考虑各种情况,执⾏时有互斥性;顺序性和循环性等空间局部性⾏为;某⼀阶段执⾏的时间局部性⾏为
因此可以考虑部分调⼊进程内容
存储管理把进程全部信息放在辅存中,执⾏时先将其中⼀部分装⼊主存,以后根据执⾏⾏为随⽤随调⼊。

如主存中没有⾜够的空闲空间,存储管理需要根据执⾏⾏为把主存中暂时不⽤的信息调出到辅存上去。

CPU处理到不在主存的地址,硬件发出虚拟地址异常,OS将其调⼊,重执指令。

需要建⽴与⾃动管理两个地址空间:(辅存)虚拟地址空间容纳进程装⼊、(主存)实际地址空间承载进程执⾏
“主存—辅存”层次与“Cache--主存”层次相⽐:
页⼤⼩(2KB~64KB)⽐Cache中的Block⼤得多,采⽤全相联映射:因为缺页时需要访问磁盘(约⼏百万个时钟周期),⽽cache缺失时访问主存仅需⼏⼗到⼏百个时钟周期,开销⽐Cache缺失开销⼤的多。

因此,页命中率⽐cache命中率更重要!“⼤页⾯”和“全相联”可提⾼页命中率。

通过软件来处理“缺页”:缺页时需要访问磁盘,慢,不能⽤硬件实现。

采⽤Write Back写策略:避免频繁的慢速磁盘访问操作。

地址转换⽤硬件实现:加快指令执⾏
存储管理是OS管理主存储器的软件部分
为获得更好的处理性能,部分主存程序与数据(特别是关键性能数据)被调⼊Cache,存储管理需要对其进⾏管理,甚⾄包括对联想存储器的管理
为获得更⼤的虚拟地址空间,存储管理需要对存放在硬盘、固态硬盘、甚⾄⽹络硬盘上的虚拟存储器⽂件进⾏管理
存储管理的基本模式可分为:
单连续存储管理:⼀维逻辑地址空间的程序占⽤⼀个主存固定分区或可变分区
段式存储管理:段式⼆维逻辑地址空间的程序占⽤多个主存可变分区
页式存储管理:⼀维逻辑地址空间的程序占⽤多个主存页架区
段页式存储管理:段式⼆维逻辑地址空间的程序占⽤多个主存页架区
单连续存储管理
每个进程占⽤⼀个物理上完全连续的存储空间(区域)
单⽤户连续存储管理
主存区域划分为系统区与⽤户区。

设置⼀个栅栏寄存器界分两个区域,硬件⽤它在执⾏时进⾏存储保护。

⼀般采⽤静态重定位进⾏地址转换。

硬件实现代价低,适⽤于单⽤户单任务操作系统,如DOS。

固定分区存储管理
⽀持多个分区,分区数量固定、⼤⼩固定。

可⽤静态/动态重定位。

存储保护⼀定是由硬件来做。

硬件实现代价低,⼀般为早期OS采⽤。

根据主存分配表进⾏主存分配与去配
硬件实现机制与动态重定位如图:
可变分区存储管理
固定分区存储管理不够灵活,既不适应⼤尺⼨程序,⼜存在内存内零头,有浪费。

按照进程实际内存需求动态划分分区,创建⼀个进程时,根据进程所需主存量查看主存中是否有⾜够的空闲空间,若有,则按需要量分割⼀个分区;若⽆,则令该进程等待主存资源。

由于分区⼤⼩按照进程实际需要量来确定,因此分区个数是随机可变的。

但可变分区⽅式也会随着进程的内存分配产⽣⼀些⼩的不可⽤的内存分区,称为内存外零头。

根据已分配区表和未分配区表进⾏主存分配与去配。

由于分区数量动态调整,起址也是动态可变的,因此两张表⼀定链接成链表。

硬件实现机制与动态重定位如图:
可变分区⽅式的内存分配可算法有:
最先适应(first fit)分配算法:空闲区表按照内存起址先后组织成链表,总是在最前⾯找⼀个⾜够的分区予以分配
邻近适应(next fit)分配算法:把空闲区表组织成循环的队列进⾏分配
最优适应(best fit)分配算法:按照分区⼤⼩组织成队列,找⼀个最⼩的能够容纳该进程的分区予以分配。

最容易产⽣外零头。

最坏适应(worst fit)分配算法
快速适应(quick fit)分配算法:该算法为那些经常⽤到的长度的空闲区设⽴单独的空闲区链表。

此算法查找⼗分快速,只要按照进程长度直接搜索能容纳它的最⼩空闲区链表并取第⼀块分配,但归还内存空间时与相邻空闲区的合并复杂费时,⽽且存在⼀定空间浪费。

前四个为顺序搜索法,快速适应算法⼜称为分类搜索算法。

任何适配算法都不能避免产⽣外零头,可以采⽤移动技术(程序浮动技术)移动分区以解决内存外零头(需要动态重定位⽀撑)。

页式存储管理
分页存储器将主存划分成多个⼤⼩相等的页架,受页架尺⼨限制,程序的逻辑地址也⾃然分成页。

不同的页可以放在不同页架(不需要连续)中。

页式存储管理的逻辑地址由两部分组成,逻辑地址形式为页号:单元号
页式存储管理的物理地址也由两部分组成:形式为页架号:单元号
地址转换可以通过查页表完成。

管理空闲主存空间:可⽤⼀张位⽰图来记录主存分配情况。

为每⼀个页架建⽴⼀个位来记载是否被占⽤(不需要记载被哪个进程占⽤);并记录主存剩余的空闲块数。

页式存储管理能够实现多个进程共享程序和数据
数据共享:不同进程可以使⽤不同页号共享数据页
程序共享:不同进程必须使⽤相同页号共享代码页,共享代码页中的JMP <页内地址>指令,使⽤不同页号做不到
页表放在主存,每次地址转换必须访问多次主存,先按页号读出页表中的相应页架号,再按计算出来的绝对地址进⾏读写,降低了存取速度。

因此可以利⽤Cache存放部分页表。


置⼀个专⽤的⾼速存储器,⽤来存放TLB/快表,这种⾼速存储器是联想存储器,即按照内容寻址,⽽⾮按照地址访问。

TLB全相联时,TLB中的页表项没有index,只有Tag,页号需与每个Tag⽐较;
TLB组相联时,则页号⾼位为Tag,低位为index,⽤作组索引。

基于快表的地址转换流程为:
按逻辑地址中的页号查快表
若该页已在快表中,则由页架号和单元号形成绝对地址
若该页不在快表中,则再查主存页表形成绝对地址,同时将该页登记到快表中
当快表填满后,⼜要登记新页时,则需在快表中按⼀定策略淘汰⼀个旧登记项
多道程序环境下需要有进程表登记每个进程的页表。

每个进程有⼀个页表⽤于维系进程的主存完整性。

进程占有处理器运⾏时,其页表起始地址和页表长度送⼊页表控制寄存器。

页式虚拟存储管理:把进程全部页⾯装⼊虚拟存储器,执⾏时先把部分页⾯装⼊实际内存,然后,根据执⾏⾏为,动态调⼊不在主存的页,同时进⾏必要的页⾯调出,是现代OS的主
流存储管理技术。

⾸次只把进程第⼀页信息装⼊主存,称为请求页式存储管理
需要扩产页表项,其中有装⼊位、修改(Dirt)位、替换控制位、访问权限位、禁⽌缓存位、页架号。

⼀个页表的项数=虚拟地址空间⼤⼩/页⼤⼩。

(1)未分配页:进程的虚拟地址空间中“空洞”对应的页(如VP0、VP4)
(2)已分配的缓存页:有内容对应的已装⼊主存的页(如VP1、VP2、VP5等)
(3)已分配的未缓存页:有内容对应但未装⼊主存的页(如VP3、VP6)
CPU处理地址,若页驻留,则获得块号形成绝对地址;
当装⼊位V=0时,页不在内存发⽣缺页,则CPU发出缺页中断,当前进程被挂起。

缺少的页从磁盘读到内存,若内存没有空间,则还要从内存选择⼀页替换到磁盘上,更新页表与快表,处理结束回到原指令继续执⾏。

替换算法类似于Cache,采⽤回写法,淘汰时,根据dirty位确定是否要写回磁盘。

当读写操作不符合存取权限(Access Right)时,发⽣保护违例或访问违例:在屏幕上显⽰“内存保护错”或“访问违例”信息;当前指令的执⾏被阻塞,当前进程被终⽌
缺页中断的处理流程如图:
当主存空间已满⽽⼜需要装⼊新页时,页式虚拟存储管理必须按照⼀定的算法把已在主存的⼀些页调出去。

选择淘汰页的⼯作称为页⾯调度 ,选择淘汰页的算法称为页⾯调度算法,
页⾯调度算法设计不当,会出现刚被淘汰的页⾯⽴即⼜要调⼊,并如此反复,这种现象称为抖动或颠簸。

全局页⾯替换策略:
最佳页⾯替换算法(OPT):理想的调度算法,只可模拟,不可实现。

当要调⼊新页⾯时,⾸先淘汰以后不再访问的页,然后选择距现在最长时间后再访问的页。

先进先出页⾯调度算法(FIFO):总是淘汰最先调⼊主存的那⼀页,或者说主存驻留时间最长的那⼀页(常驻的除外)。

模拟的是程序执⾏的顺序性,有⼀定合理性。

会出现Belady 现象(如果对—个进程未分配它所要求的全部页⾯,有时就会出现分配的页⾯数增多但缺页率反⽽提⾼)
最近最少⽤页⾯调度算法(LRU):淘汰最近⼀段时间内最久未被访问的那⼀页,认为那些刚被使⽤过的页⾯可能还要⽴即被使⽤,⽽那些在较长时间内未被使⽤的页⾯可能不会⽴即使⽤。

模拟了程序执⾏的局部属性,既考虑了循环性⼜兼顾了顺序性,但严格实现的代价⼤(需要维持特殊队列),模拟实现的⽅法为:
最近未使⽤页⾯替换算法(NRU)/引⽤位法:每页建⼀个引⽤位,供硬件使⽤;设置⼀个时间间隔中断,周期性地把所有页的引⽤位置0;地址转换时,页引⽤标志置1;淘汰页⾯时,从页引⽤标志为0的页中间随机选择。

该⽅法开销⼩但时间间隔多长是个难点。

最不经常使⽤页⾯替换算法(NFU)/计数法:基于时间间隔中断,并给每⼀页设置⼀个页引⽤计数器;时间间隔中断发⽣后,所有计数器置0;每访问页1次就给计数器加1;淘汰页⾯时,选择计数值最⼩的页⾯淘汰。

计时法:基于时间间隔中断,为每页增设⼀个计时单元;每当页⾯被引⽤时把当前绝对时间置⼊计时单元;时间间隔中断发⽣后,所有计时单元全部清除;淘汰页⾯时,选择绝对时间最⼩的页⾯淘汰。

⽼化算法:基于时间间隔中断,为每个页设置⼀个多位寄存器;每当页⾯被访问时,寄存器最左边位置0;时间间隔中断发⽣后,所有寄存器右移⼀位;淘汰页⾯时,选择值最⼩的寄存器对应的页⾯淘汰。

第⼆次机会页⾯调度算法(SCR):淘汰最先进⼊内存的页⾯如果最近还在使⽤,仍然有机会像新调⼊页⾯⼀样留在内存中。

页⾯调⼊主存时,其引⽤标志位置1;访问主存页⾯时,其引⽤标志位置1;淘汰页⾯时,从FIFO页⾯队列对⾸开始扫描,把所遇到的引⽤标志位是1的页⾯的引⽤标志位清0,并移⾄队尾(看作新调⼊的页再给⼀次机会),把所遇到的引⽤标志位是0的页⾯淘汰(其最早进⼊内存且最久未被使⽤)。

时钟页⾯替换算法(Clock):采⽤循环队列机制构造页⾯队列,形成了⼀个类似于钟表⾯的环形表。

队列指针则相当于钟表⾯上的表针,指向可能要淘汰的页⾯。

使⽤页引⽤标志位。

页⾯调⼊主存时,其引⽤标志位置1;访问主存页⾯时,其引⽤标志位置1;淘汰页⾯时,从指针当前指向的页⾯开始扫描循环队列,把所遇到的引⽤标志位是1的页⾯的引⽤标志位清0,并跳过,把所遇到的引⽤标志位是0的页⾯淘汰,指针推进⼀步。

页表及相关硬件机制在地址转换、存储保护、虚拟地址访问中发挥了关键作⽤
为页式存储管理设置专门硬件机构内存管理单元MMU:CPU管理虚拟/物理存储器的控制线路,把虚拟地址映射为物理地址,并提供存储保护,必要时确定淘汰页⾯
反置页表IPT:有些操作系统采⽤反置页表,它的优点是只需为所有进程维护⼀张表。

针对内存中的每个页架建⽴⼀个IPT表项,按照块号排序(页表按照页号做索引、记的是页架号,反置页表则按照页架号做索引、记进程号和页号),⽤来完成内存页架到访问进程、页号的对应,即物理地址到逻辑地址的转换
表项包括:
页号:虚拟地址页号
进程标志符:使⽤该页的进程号(页号和进程标志符结合起来标志⼀个特定进程的虚拟地址空间的⼀页
标志位:有效、引⽤、修改、保护和锁定等标志信息
哈希链指针
基于反置页表的地址转换的过程为:
MMU通过哈希表把进程标识和虚页号转换成⼀个哈希值,指向IPT的⼀个表⽬
MMU遍历哈希链找到所需进程的虚页号,该项的索引就是页架号,通过拼接位移便可⽣成物理地址(多个页号经哈希函数转换后可能获得相同哈希值,需要利⽤哈希链处理这种冲突)
若遍历整个反置页表中未能找到匹配页表项,说明该页不在内存,产⽣缺页中断,请求操作系统调⼊
选择淘汰页⾯在图中未显⽰,同样由MMU完成。

为了能让进程共享内存中的页⾯,必须扩展IPT表内容,使得每个表项可以记录多个进程。

IPT能减少内存的占⽤,但IPT只包含调⼊内存的页⾯,仍需为进程建⽴传统页表(放在磁盘上)。

当发⽣缺页异常时,把所需页⾯调⼊内存要多访问⼀次磁盘,速度会⽐较慢。

段式存储管理
段式程序设计:把⼀个程序设计成多个段(代码段、数据段、堆栈段等),⽤户可以⾃⼰应⽤段覆盖技术扩充内存空间使⽤量。

每⼀段都可以从“0”开始编址,段内的地址是连续
的。

分段存储器的逻辑地址由段号:单元号组成。

这⼀技术是程序设计技术,不是OS存储管理的。

段号和单元号是⽤户程序⾃⼰设计的,⽤户可控制,⽽页号和单元号是系统切割的⽤户不知道。

段式存储管理基于可变分区存储管理实现,⼀个进程要占⽤多个分区,硬件需要增加⼀组⽤户可见的段地址寄存器(代码段、数据段、堆栈段,附加段),供地址转换使⽤;存储管理需要增加设置⼀个段表,每个段占⽤⼀个段表项,包括:段始址、段限长,以及存储保护、可移动、可扩充等标志位。

通过不同进程段表中的项指向同⼀个段基址来实现段的共享。

对共享段的信息必须进⾏保护,如规定只能读出不能写⼊,不满⾜保护条件则产⽣保护中断。

段式虚拟存储管理:把进程的所有分段都存放在辅存中,进程运⾏时先把当前需要的⼀段或⼏段装⼊主存,在执⾏过程中访问到不在主存的段时再把它们动态装⼊。

段式虚拟存储管理中段的调进调出是由OS⾃动实现的,对⽤户透明,⽽段覆盖技术则是⽤户控制的主存扩充技术,OS不感知。

段式虚拟存储管理需要进⾏段表的扩充
特征位: 00(不在内存)01(在内存)11(共享段)
存取权限: 00(可执⾏)01(可读)11(可写)
扩充位: 0(固定长)1(可扩充)
标志位: 00(未修改)01(已修改)11(不可移动)
段页式存储管理
段式存储管理可以基于页式存储管理实现,每⼀段不必占据连续的存储空间,可存放在不连续的主存页架中段表不再记录基址与限长,⽽是记录页表的基址与限长
每⼀段有⼀个页表。

逻辑地址由段号:段内页号:页内偏移地址构成
还可以扩充为段页式虚拟存储管理,装⼊部分段,或者装⼊段中部分页⾯。

相关文档
最新文档