8.非连续存储分配(基本分页、请求分页、基本分段、段页式)
基本分页存储管理
引入分页的原因
尽量避免碎片的产生,增大内存利用率
对换
是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,调入内存。对换是提高内存利用率的有效措施
对换的类型:
- 整体对换(进程)
- 部分对换(页、段)
(程序可以被切块,内存也可以被切块;切块越小,浪费越小)
基本概念:
- 页(页面):进程中的块
- 页框(页帧):内存中的块
- 块(盘块):外存中的块
- 页面大小:一页的大小,通常为4KB,例如win7,xp都是
- 页表:页表项=页号+物理块号,页表放在内存
- 页内碎片:作业的最后一页放在内存的块里有可能占不满一个块的情况下会产生页内碎片。如果已经产生了页内碎片,那只能是由于作业的最后一页没有占满一个内存块而导致产生的。
★ ★分页存储管理逻辑地址结构
- ★ 逻辑地址为 \(A\) ,页面大小为 \(L\) ,则页号= $ P=A/L $ ,页内偏移= \(W=A\%L\)
- ★逻辑地址=页号+页内偏移,页表项=页号+物理块号,物理地址=物理块号+页内偏移
★ ★分页存储管理地址变换机构(硬件自动完成)
地址变换过程如下:
逻辑地址为 \(A\) ,页面大小为 \(L\)
- 页号= $ P=A/L $ ,页内偏移 = \(W=A\%L\)
- 比较页号 \(P\) 和页表长度 \(M\) ,若 \(P \geq M\) ,越界中断
- 查表位置=页表起始地址 \(F\) +页号 \(P\) × 页表项长度,取出页表项内容(物理块号\(b\))
- 物理地址 \(E=b × L+W\) ,用得到的物理地址去访问内存
- 注意!:页表放在内存中。页表长度:一共多少页。页表项长度:页地址占多大存储空间
具有快表的地址变换机构
- 快表:又称相联存储器、联想寄存器(TLB),快表是一种特殊的高速缓冲存储器(Cache),内容是页表中的一部分或全部内容。
地址变换过程:
先通过快表寻找匹配的页号,若存在匹配页号,取出块号和偏移量拼接形成物理地址,存取数据一次访存即可实现。
若不存在,则访问主存中的页表,读出页表项后,同时将其存入快表。
- 命中率高的原因->程序运行的局部性原理
程序运行的局部性原理:
- 时间局部性:在一小段时间内,最近被访问过的程序和数据很可能再次被访问
- 空间局部性:这些被访问的程序和数据往往集中在一小片存储区
引入两级页表的原因:
一级页表要占用相当大的内存空间,而且还要求是连续的
如何设计两级页表
- 按照最大程序进行分块
- 页表切块,块大小=页面大小
- 当一个页表可以装在一个页面内,页表设计结束
- 逻辑地址切块,块位数=该级页表每块容纳的页表项
注意:
-
n级页表地址结构=一级页号+二级页号+...+n级页号+页内偏移量
-
页表是一级一级,有需要再调入内存的。
-
重点: 构建多级页表的根本前提 -> 顶级页表最多只能有一个页面
请求分页存储管理
引入请求分页的原因:
常规存储器特征
- 一次性:作业必须一次性全部装入内存后方能正常运行
- 驻留性:装入内存的作业在其运行完毕之前永久驻留内存
虚拟存储器的特征
- 离散性:即非连续性,这是实现的技术前提
- 多次性:一个作业被分成多次调入内存
- 对换性:允许作业运行过程中换入、换出
- 虚拟性:能够从逻辑上扩充内存容量
驻留集和工作集
驻留集:OS给某个进程分配的几个物理页框所装的页面集合(驻留集大小不能太大,也不能太小)
工作集:在某段时间间隔里,进程实际所要访问页面的集合
内存分配策略
- 固定分配局部置换:为每个进程分配一定数目的物理块,在进程运行期间都不改变。若进程在运行时发生缺页,则只能从分配给该进程在内存中的页面中选出一页换出,然后再调入一页,难以保证分配给该进程的空间不变
- 可变分配全局置换:先为每个进程分配一定数目的物理块,在进程运行期间可以根据情况适当增加减少。若进程在运行时发生缺页,系统从空闲物理队列中取出一块分配给该进程,并将所缺页调入
- 可变分配局部置换:先为每个进程分配一定数目的物理块,若进程在运行时发生缺页,只允许从该进程在内存中的页面中选出一页换出
缺页率与物理块数之间的关系:
页表改进
-
状态位P(亦称存在位):指示该页是否已调入内存
-
访问字段A:记录一段时间内该页被访问的次数或时间(页面置换参考)
-
修改位M:指示该页调入内存后是否被修改过(页面置换参考)
-
外存地址(磁盘块号):指示该页在外存上的地址
缺页中断
在请求分页系统中,每当要访问的页面不在内存时,便产生缺页中断; 缺页中断作为中断,需要:
(1)需要保护CPU环境
(2)分析中断原因
(3)转入缺页中断处理程序进行处理
(4)恢复CPU环境
缺页中断除具备一般中断的所有特征外,还有其特殊性,主要表现在:
- 在指令执行期间产生和处理中断信号
- 一条指令执行期间可能产生多次中断
页面调入时机
-
预调页策略:主要用于进程的首次调入
-
请求调页策略(页面置换算法):每次只调入所缺的一页
从何处调入页面
在请求分页系统中,通常将外存划分为文件区和对换区两部分,前者用以存放文件,后者用于存放对换页面
- 对换区足够大:全部从对换区中调入页面(但进程运行前必须将其从文件区拷贝至对换区)
- 对换区不够大:对不会被修改的文件从文件区调入,否则从对换区调入
- Unix方式:凡是未运行过的页面,都从文件区调入;而对于曾经运行过但又被换出的页面,在下次调入时,应从对换区调入
★ ★页面置换算法:
- 最佳(OPT)置换算法:其所选择的被淘汰页面,将是以后永不使用的, 或者是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。该算法实际中无法实现,但可以利用该算法区评价其它算法。
- 先进先出置换算法(FIFO):每次置换都是选择最先进入内存的页面进行淘汰,即选择在内存中驻留时间最长的页进行淘汰。该方法虽然简单,易于实现,但往往效果不太好
- 最近最久未使用算法(Least Recently Used,LRU)置换算法:选择内存中最久未被访问的页面予以淘汰。实现时在每个页面上设置一个访问字段,用来记录该页面自上次访问至今所经历的时间
- Clock页面置换算法:LRU近似算法,为每个页面设置一个访问位,初值为0,再将内存中的所有页面通过链接指针构成一个循环队列,当某页被访问时,其访问位被置1。置换算法在选择淘汰页面时,只需检查其访问位,若为0,就淘汰该页,若为1,则重新将它置0,再检查下一个页面。
抖动
每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作
虚拟内存大小
- 虚拟内存≤逻辑地址支持的最大空间(软件限制)
- 虚拟内存≤内存卡+磁盘大小(硬件限制)
虚拟地址到物理地址翻译
直接映射、全相联映射、组相连映射
基本分段存储管理
引入分段的原因
从用户(程序员)的角度来考虑的:方便程序共享、动态链接等
- 分段:按照进程中的自然段进行划分(段内连续,段间不要求连续)
段表
每个进程都有自己的一张段表
★ ★分段存储管理逻辑地址结构
**★页式、段式逻辑地址转化成物理地址 **:
分段地址变换机构
地址变换过程如下:
- 取逻辑地址 \(A\) 前几位,得到段号 \(S\)
- 若 $S\ge M $ ,产生越界中断,否则继续执行
- 段表项地址=段表起始地址 \(F\) + 段号 \(S\) × 段表项长度,取出段长 \(C\) 。若段内偏移量 \(\ge\) 段长,则产生越界中断,否则继续执行。
- 取出该段的起始地址 \(b\) ,物理地址 \(E=b +W\) ,用得到的物理地址去访问内存
基本段页式管理
先将程序按自然段划分,再将每段切成等大的页,集二者之长(把段式存储中的段内偏移量再用分页的方式管理)
- 每个进程都有且仅有一张段表
- 每个段都有一张页表
段表
★ ★段页式存储管理逻辑地址结构
**★段页式逻辑地址转化成物理地址 **:
段页式地址变换机构
碎片问题
- 使用分页管理的内存系统中有少量的内部碎片,无外部碎片
- 使用分段管理的内存系统中有少量的外部碎片,无内部碎片
- 段页式存储管理既可能产生内部碎片,也可能产生外部碎片
★★★重要区别:地址空间维度
- 分页的地址空间是一维的(因为只需给出页面大小这一个参数,就能划分逻辑地址的结构)
- 分段的地址空间是二维的(不能通过段长计算段内偏移 \(W\) 和段号 \(S\) 的位数,因为每段长度不一样,必须给 \(W\) 和 \(S\) 这两个参数)
- 段页式地址空间是二维的(必须给段号和偏移量这两个参数)
★ ★ ★地址越界保护
- 分页管理1次(页表长度和页号比较)
- 分段管理2次(段表长度和段号比较,段长和段内偏移比较)
- 段页式管理2次(先判断段号是否越界,再判断页号是否越界)
★ ★ ★访存次数:
- 分页存储管理方式中 ,从内存中存取一次数据需要访问几次内存?答:两次(一次访问页表,一次访问内存)
- 分段存储管理方式中 ,从内存中存取一次数据需要访问几次内存?答:两次(一次访问段表,一次访问内存)
- 段页式存储管理方式中 ,从内存中存取一次数据需要访问几次内存?答:三次(一次访问段表,一次访问页表,一次访问内存)
本文来自博客园,作者:风雨zzm,转载请注明原文链接:https://www.cnblogs.com/zzmxj/p/17922508.html