一.虚拟存储器的基本概念
1.程序执行的局部性:
- 时间局部性
- 空间局部性
2.虚拟存储器的定义:是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
3.虚拟存储管理:允许将一个作业分多次调入内存。
若采用连续分配方式,需申请足够空间,再分多次装入,造成内存资源浪费,并不能从逻辑上扩大内存容量。
4.虚拟存储器的特征:离散分配方式是基础
- 多次性
- 对换性
- 虚拟性
二.请求分页式存储管理方式
1.硬件支持
基本分页 + “请求调页”和“页面置换”功能。
换入和换出基本单位都是长度固定的页面。
2.页表的基本功能不变:逻辑地址映射为物理地址
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址
- 状态位P:指示该页面是否已调入内存 (调入内存1,否则0)
- 访问字段A :用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问。(置换时考量的参数)
- 修改位M :该页在调入内存后是否被修改过。(关系到置换时调出的具体操作)
- 外存地址:用于指出该页在外存上的地址。
3.缺页中断机构:
每当要访问的页面不在内存时,便产生一缺页中断通知OS,OS则将所缺之页调入内存。
作为中断,需经历几个步骤:
- “保护CPU环境”
- “分析中断原因”
- “转入缺页中断处理程序”
- “恢复CPU环境”等。
4.地址变换机构
分页系统地址变换机构的基础上增加:
- 产生和处理缺页中断(请求调入)
- 从内存中换出一页的功能(置换)
5.内存分配
1)物理块的分配策略
a.固定分配、局部置换
为每个进程分配一定数目的物理块,在整个运行期间不再改变(基于进程的类型,或根据程序员、程序管理员的建议)
运行中缺页时,只能从该进程内存中n个页面中选出一页换出,然后再调入一页。
b.可变分配、全局置换
先为每个进程分配一定数目的物理块
OS管理一个空闲物理块队列,发生缺页时,系统从队列中取出一块分配给该进程,将欲调入的页装入(动态增长型,全局空闲空间都可分配使用)
空闲空间不足时,可与其他任何进程页面置换。
- 会使其他进程缺页率提高,影响运行
c.可变分配、局部置换
为每个进程分配一定数目的物理块
缺页时,只允许换出该进程在内存的页面,不影响其他进程执行。
根据缺页率增减进程的物理块数:若频繁缺页中断,则系统再为进程分配若干物理快;若缺页率特别低,则适当减少分配给该进程的物理块。
6.物理块的分配算法
固定分配策略时,分配物理块可采用以下几种算法:
- 平均分配算法
将所有可供分配的物理块平均分配给各进程。
- b.按比例分配算法
根据进程的大小按比例分配物理块。
三.页面置换算法
1.缺页率=页面调入次数(缺页次数)/总的页面使用次数
2.最佳Optimal置换算法
换出以后永不再用的,或在最长(未来)时间内不再被访问的页面。作为参照标准,评价其他算法。
3.先进先出置换算法(FIFO)
先进入的先淘汰,即选择内存中驻留时间最久的页面予以淘汰。(队列)
- 优点:实现简单,把一进程已调入内存的页面按先后次序组织成一个队列,并设置一个指针(替换指针),使它总是指向队首最老的页面。
- 不足:与进程实际运行规律不相适应(较早调入的页往往是经常被访问的页,频繁被对换造成运行性能降低)
Belady现象:出现分配的页面数增多,缺页率反而提高的异常现象。
Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征矛盾,即被置换的页面并不是进程不会访问的。
4.最近最久未使用(LRU)置换算法
•LRU置换算法选择最近最久未使用(least recently used)的页面予以淘汰。
a.寄存器记录时间的原理
页面被访问后的操作:将该页对应的寄存器的Rn-1位置为1
如何记时:
- 由系统发出定时信号,每隔一定时间将所有寄存器右移1位。
- 某一时刻,比较各寄存器的值,被用到的标志1逐渐往低位上积累,若高位上没有1,就说明最近没用过。所以最近最久未使用的就是寄存器值最小的那个页。
b.栈记录时间的原理
某页面被访问,便将该页面的页面号从栈中移出,将它压入栈顶。因此:栈顶始终是最新被访问页面的编号,越久未使用,页面越被压在栈底。
5.轮转算法(clock)(最近未使用算法(NRU, Not Recently Used))
- 每个页设一个使用标志位(use bit),若该页被访问则将其置为1。
- 设置一个指针,从当前指针位置开始按地址先后检查各页,寻找use bit=0的页面作为被置换页。
- 若指针经过的页use bit=1,修改use bit=0(暂不凋出,给被用过的页面驻留的机会 ),指针继续向下。到所有页面末尾后再返回队首检查。
6.其他置换算法
a.最少使用 (LFU, Least Frequently Used)
- 每页设置访问计数器,每当页面被访问时,该页面的访问计数器加1;
- 缺页中断时,淘汰计数值最小的页面,并将所有计数清零;
b.页面缓冲算法PBA(page buffering algorithm)
- 仍用FIFO算法选择被置换页但并不将其马上换入外存。
- 系统将页面放入两个链表之一:如果页面未被修改,就将其归入到空闲页面链表的末尾;否则将其归入到已修改页面链表。
- 需要调入新的物理页面时,将新页面内容读入到空闲页面链表的第一项所指的页面,然后将第一项删除(从空闲链表摘下)。
- 空闲页面和已修改页面,仍停留在内存中一段时间,如果这些页面被再次访问,只需较小开销,而被访问的页面可以返还作为进程的内存页。
- 当已修改页面达到一定数目后,再将它们一起调出到外存,然后将它们归入空闲页面链表,这样能大大减少I/O操作的次数。
7.影响缺页率的主要因素
- 分配给作业的主存块数:多则缺页率低,反之则高。
- 页面大小:大则缺页率低;反之则高。
- 页面调度算法:对缺页中断率影响很大,但不可能找到一种最佳算法。
- 程序编制方法
8.抖动:
a.为了提高处理机利用率,可增加多道程序并发度;
b.但进程数目增加过多,每个进程分配得到的物理块太少,在某个临界点上,会出现刚被淘汰的页很快又需重新调入;而调入不久又被淘汰出去;出现频繁缺页
c.大部分处理器时间都用在来回的页面调度上,这种局面称为系统抖动或颠簸(thrashing)
根本原因:
页面淘汰算法不合理;分配给进程的物理页面数(驻留集)太少。
工作集:某段时间间隔中,进程实际要访问的页面的集合。
驻留集>工作集可使进程顺利的运行。
四.请求分段存储管理方式
1.硬件支持
- 段表机制
- 缺段中断机构
- 地址变换机构
2.段表机制
3.缺段中断机构
- 由缺段中断机构产生一缺段中断信号
- 进入OS,由缺段中断处理程序将所需的段调入内存。
- 缺段中断同样在一条指令的执行期间产生和处理中断,一条指令执行可能产生多次缺段中断。但不会出现一条指令被分割在两个分段中或一组信息被分割在两个分段中的情况。
4.地址变换机构
基于分段系统地址变换机构的基础
- 段调入内存
- 修改段表
- 再利用段表进行地址变换。
5.分段的共享和保护
- 实现共享:共享段表
- 共享段如何分享与回收
- 分段保护