虚存的概念、局部性原理
- 虚拟存储器(Virtual Memory)是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统
- 逻辑内存和物理内存分离
- 执行程序只有部分在内存中
- 逻辑地址空间远大于物理地址空间
- 局部性原理
遵循结构化设计的程序具有时间局部性和空间局部性两个特征:- 时间局部性:
刚被访问的主存单元,不久会再次被访问:循环操作 - 空间局部性:
刚被访问的主存单元,其临近单元不久会被访问:程序的顺序执行
- 时间局部性:
请求分页存储管理方式——基本思想、页表机制、地址变换机构
-
基本思想
- 在分页系统的基础上增加了请求调页功能和页面置换功能
- 整个用户程序驻留在磁盘(二级存储)上,只装入少量页面入内存即可启动运行
- 程序运行中,由调页程序(pager)根据需要将单个页面从磁盘调入内存, 将不需要的页面换出到磁盘上
- 置换时以页为单位
- 硬件支持
- 请求页表机制
- 缺页中断机构
- 地址变换机构主存
-
页表机制
- 状态位P(有效-无效位):用于指示该页是否已经调入内存
- 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,以供置换算法在选择置换页面时参考
- 修改位M(脏位):标识该页在调入内存后是否被修改过
- 外存地址:该页在外存上的地址,一般指物理块号
-
地址变换
- 借助页表、页表寄存器完成作业的逻辑地址(虚地址)到内存物理地址的变换
- 页表基址寄存器( Page-table base register,PTBR) 页表长度寄存器( Page-table length register,PRLR)
- 存储保护检查:页号>页表长度?
- 是,越界中断
- 否则2
- 查快表
- 找到,修改访问位对于写操作置修改位,形成物理地址访问
- 若未找到,查页表状态位
- 在主存,将表目写入快表
- 否则,缺页中断
页面置换算法——基本思想和分析
- 先进先出置换算法(FIFO)
- FIFO算法总是淘汰最早进入内存的页面,即选择在内存中驻留时间最久的页面进行置换
- 最佳置换算法
- 1966年,Belady提出的一种理论上最优的页面置换算法,用于评价其他算法
- 最佳置换算法将置换未来最长时间内不会访问的页面
- 一般无法预知进程在内存中的页面未来的访问情况,算法实际无法实现
- 最近最久未使用置换算法
- 最近最少使用(Least-recently-used,LRU)页面置换算法选择过去最长时间没有访问的页面进行置换
- LRU算法实现
- 计数器:为每一个页表项关联一个使用时间域
- 栈:页码栈,每当访问一个页面,就将该页面从栈中删除并从顶上重新压入,栈底总是LRU页
- Clock置换算法
- 页表中的每一页有一个访问位(页面被访问后将其置
为1)
按照FIFO的方式选择置换页,如果该页的访问位为1,则给予第二次机会,将其访问位置为0二次机会算法(Clock置换算法)
请求分页系统的性能分析
- 有效访问时间计算
M e m o r y a c c e s s t i m e = 200 n s Memory access time = 200ns Memoryaccesstime=200ns
A v e r a g e p a g e − f a u l t s e r v i c e t i m e = 8 m s Average page-fault service time = 8ms Averagepage−faultservicetime=8ms
E A T = ( 1 – p ) × 200 n s + p × ( 8 m s ) = ( 1 – p ) × 200 + p × 8 , 000 , 000 = 200 + p × 7 , 999 , 800 n s EAT = (1 – p)× 200 ns + p× ( 8ms ) = (1 – p )× 200 + p× 8,000,000 = 200 + p × 7,999,800 ns EAT=(1–p)×200ns+p×(8ms)=(1–p)×200+p×8,000,000=200+p×7,999,800ns
- 如果每1,000访问中产生1次缺页,则EAT = 8.2μs
- 则计算机的页面访问将慢41倍!!
- 抖动——产生原因、解决方案(工作集)
- 产生原因:同时在系统中运行的进程太多,分配给每个进程的页框太少,不能满足进程正常运行的基本要求
- 工作集:进程在某段时间内实际访问页的集合
请求分段——基本思想
- 基本思想
如同请求分页储存管理方式一样,在进程开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。