Chapter 7 主存管理
7.1 主存管理概述
7.1.1 主存分片共享
主存分为:
- 物理主存:由0~(m-1)个物理地址组成,是计算机主存单元的真实地址。
- 逻辑主存:由0~(n-1)个逻辑地址组成,是一个虚拟地址空间。虚地址又称为相对地址。
主存分片的方式:
- 按区划分:划分为大小不等的区域,根据用户程序的实际需要决定分区大小。
- 按页划分:划分为大小相等的块,以块为单位进行划分,根据用户程序的实际需要决定应分配的块数。
用户所看到的虚存与主存之间有一定的映射关系。
程序执行时,必须将逻辑地址正确地转换为物理地址,这就是地址映射。
7.2 主存管理的功能
现代操作系统的主存管理实现了:地址映射,主存分配,主存保护,虚拟主存等功能。
7.2.1 虚拟存储器
虚拟存储器将用户的逻辑主存与物理主存分开,在程序运行时,由操作系统完成主存和辅存之间信息的动态调度。
7.2.2 地址映射
处理机在执行指令时,必须使用物理地址才能从主存获取信息,而应用程序使用的地址是逻辑地址,因此需要将逻辑地址转换为物理地址。
定义:将程序地址空间中的逻辑地址变换成主存中的物理地址的过程。
映射方式:
- 编程或编译时确定地址映射关系:不可浮动的程序模块,所包含的全部地址都是主存的实地址。
- 静态地址映射:可浮动的程序模块,当将这一程序地址空间装入主存时,由主存装入程序对有关地址部分进行调整。缺点:再次装入主存必须在同一位置。
- 动态地址映射:在程序执行过程中每次访问存储器时,都通过一个地址变换机构将虚拟地址变换为主存的物理地址。是一种动态的重新定位。
7.2.3 虚拟存储器的实现
物质基础:
- 相当容量的辅存:足以存放应用程序的虚地址空间
- 由一定容量的主存:存放进入主存的多进程的信息
- 地址变换机构
7.2.4 存储保护
定义:保证每个程序只能在给定的存储区域内活动以保证应用程序之间互不影响。
保护手段:
-
上、下界防护
硬件为每个应用程序设置一对上下界寄存器。
-
基址、限长寄存器
基址寄存器存放当前进程的地址空间的起始地址,限长寄存器存放的时该地址空间的长度。
7.3 分区存储管理
7.3.1 动态分区
在处理程序的过程中,建立分区,依用户请求的大小分配分区。分区长度不固定,分区个数不固定。 动态分区存储以及它的内存释放如下图。
7.3.2 分区分配机构
主存资源信息块(m_rib):
分区描述器(pd):
7.3.3 分区分配与放置策略
-
分区分配
依据申请者所要求的主存区的大小,在空闲区队列中找一个足以满足此要求的可用空闲区。
如果可用空闲区的大小与要求大小相等,直接将空闲区从空闲队列中删除。
如果可用空闲区的大小大于要求大小,则将空闲区分为两部分,一部分成为已分配区,另一部分仍为空闲区,并修改描述器信息。
-
分区回收
检查释放分区在主存中的邻接情况
- 如果上下邻接空闲区,则合并,成为一个连续的空闲区
- 若回收区不与任何空闲区相邻接,则建立一个新的空闲区,并加入空闲区队列
-
放置策略
-
首次适应算法
定义:按地址顺序(从低地址到高地址)查找到第一个能装入它的空闲区
特点:尽可能地利用存储器的低地址部分的空闲区而尽量保存高地址部分的大空闲区,好处是当需要一个较大分区,有大概率能满足要求
-
最佳适应算法
定义:空闲队列按照分区大小递增排序,找与程序所需大小最接近(大于)的空闲区
特点:如果有空闲区刚好满足要求,则必然被选中。如果不存在这样的空闲区,也会选择一个相对要求较大的空闲区进行分割。
缺点:分割时使剩下的空闲区非常小,基本不能使用,造成浪费。
-
最坏适应算法
定义:空闲区队列按照分区大小递减排列,将程序放入最大的空闲区内。
特点:放入大空闲区后,剩下的空闲区也很大,也能装下一个较大的新程序。
至于哪种方法最优,不能一概而论,具体问题具体分析。
-
7.4 页式存储管理
7.4.1 基本思想
将主存分成若干大小相同的块,程序的地址空间分成一系列的页面(虚页),然后将页面放入到主存块中,主存块大小和页面大小相同。
问题:
- 页式系统的地址映射
- 请调策略:当前当问的信息是否在主存中
- 放置策列
- 淘汰策略
7.4.2 页式地址变换
页表: 为了实现从地址空间到物理主存的映象,系统建立的记录页与内存块之间对应关系的地址变换的机构称为页面映像表,简称页表。
当程序按页划分装入存储器时,操作系统为该程序建立一个页表,记录程序虚页与其在主存中块的对应关系。一般页表尺寸为1KB,2KB或4KB。
虚地址结构:
由页号与偏移组成。偏移的位数取决于页表大小。如页表大小4KB,则偏移应该为12位。因为4KB转换成bit是2^12bits。页号位数由机器地址长度减去偏移位数。
页式地址转换:
- CPU给出操作数地址
- 由分页机构自动把逻辑地址分为页号和偏移
- 根据页表始址寄存器知识的页表始地址为索引,找到相应的块号
- 将块号和偏移拼接在一起得到物理地址
联想存储器:
就是组原中的cache。
7.4.3 请调页面
解决的问题:一个程序只有一部分在主存中。
扩充页表:
加一个中断位和辅存地址,中断为用来标识该页是否在主存,若i=1,则不再主存,反之,在主存。
缺页处理:
- 中断位为1,发生缺页中断
- 用户程序被中断,控制转到操作系统的调页程序
- 调页程序将页面从磁盘调入主存
- 把页表中该页面登记项中的中断位改为0,填入实际块号
- 继续执行被中断的程序
7.4.4 淘汰机制与策略
情况:主存块被用完,需要淘汰一页。
进一步扩充页表: 引用位表示该页是否被访问过,改编为表示该页是否被改变过。
7.4.5 几种置换算法
-
最佳算法(OPT)
当要调入一新页而必须先淘汰一旧页时,所淘汰的那一页应是以后不再要用的,或者是在最长的时间以后才会用到的那页。
-
先进先出淘汰算法
总是选择在主存中居留时间最长 (即最早进入主存)的一页淘汰。
实现:
- 建立一个页面进入主存的先后次序表
- 建立一个替换指针,指向最早进入主存的页面
- 当需要置换一页时,选择替换指向的那一页,然后调整替换指针的内容。
-
LRU算法(最久未使用算法)
总是选择最长时间未被使用的那一页淘汰。
实现:
方法1 计时法:用引用位考察页面的使用情况;当访问页面时,将引用位置1,并记时,当要淘汰一页时,选择时间最长的一页淘汰。
方法2 多位寄存器法:为每页设置一个R位的寄存器,每次访问一页时,将该页所对应的寄存器最左位置1,每隔时间间隔T,所有寄存器右移一位。选择R值最小的页淘汰。
方法3 栈法:用一个栈来登记主存中的可淘汰页号,访问某个页面即将它的页号记在栈的顶部,栈中原有页号与新记入的栈顶页号相重时,抽出重号,栈中原有页号依次下移,选择栈底元素淘汰。
-
LRU近似算法
- 为每一个存储块(存储分块表)或页面(页表)设立一个引用位。
- 当访问某页时,就将该页引用位置1
- 页面管理软件周期性地(设周期为T)将所有引用位重新置0
- 在T内,被访问过的页面引用位为1,否则为0
- 选择引用位为0的页面淘汰。
7.5 段式和段页式存储管理
7.5.1 段式地址
段式系统中程序的地址空间由若干个逻辑分段组成,每个分段有自己的名字,对于一个分段而言,它是一个连续的地址区。
7.5.2 段式地址变换
段式地址结构: 由段号和段内位移组成。
段式地址变换:
7.6 段页式系统(linux)
在段式存储管理中结合分页存储管理技术,在一个分段内划分页面,就形成了段页式存储管理。