概述
虚拟存储是通过把进程中不需要立即使用的部分存到外存来扩大内存空间的一种技术。
局部性原理:
- 时间局限性:因为程序里存在大量的循环,所以一个内存部分被访问过一次还会再被访问。
- 空间局限性:访问某个内存部分的时候,通常会接着访问内存附近的部分。
虚拟存储的实际容量=Min(内存+外存之和,CPU的寻址范围),比如某计算机的CPU是32位的,内存是4GB,外存是512MB,那么虚拟存储的大小就是Min(222,232)=2^22。虚拟内存的最大容量就是CPU的寻址范围确定的。
虚拟存储的特点:
- 多次性:允许程序多次被调入内存,而不是一次全部调入。
- 对换性:允许在作业允许过程中,将作业调入调出。
- 虚拟性:逻辑上扩充了内存容量,但不等于物理上的内存容量。
请求页面与页面置换
虚拟内存的实现:
-
请求分页:所需的作业不在内存时,将其从外存调入内存。
页面置换:在内存不够用时,把不用的作业调出到外存。 -
请求分页页表:状态位是表示作业是否在内存里。访问字段是表示访问访问次数或上次访问的时间,影响是否页面置换。修改位是表示是否页面调入后是否被修改,如果被修改那么就需要调出去覆盖原来的内容。

请求分页的过程:
- 在请求分页表里查看分页是否在内存里
- 如果不在,就进行缺页中断,保留CPU环境,然后阻塞进程,分页调入后再唤醒进程,放入就绪队列。
- 分页调入后,如果由空闲分段,就分配给分页,如果没有就进行页面置换算法选择一个页面淘汰,把修改过的页面写回外存。
- 分页调入后,要修改相关页表项。
页面置换算法:
- 最佳置换:只置换以后不可能再用或最长时间内不适应的页面。不太容易找到这样的页面。很难实现。
先入先出置换:把进入内存的分页按先后顺序组成一个队列,把最先进入队列的分页置换掉。有可能先进入的是最常访问的页面,这样就导致开销很大。 - 最近最久未使用置换(LRU,least recently used):每个页面被访问后,用访问字段计时,如果再次被访问那么就重置。淘汰页面时,把时间最长的那个页面淘汰。算法的性能很好,但实现比较复杂。
- 时钟置换(CLOCK):淘汰最近未访问的页面。把访问字段改为访问位,访问过的为1,否则为0。将各个页面组成一个循环链表,第一轮扫描时,淘汰访问位为0的页面,并把为1的改为0,如果第一轮扫描到的页面的访问位都为1,就进行第二轮扫描,一定可以找到为0 。
- 改进型的时钟置换:还考虑页面是否被修改过,优先淘汰没有被修改过的页面。用(访问位,修改位)表示,第一轮淘汰(0,0),如果没有进行第二轮扫描,淘汰(0,1),并把访问位为1的改为0,如果没有进行第三轮扫描,淘汰(0,0),如果没有进行第四轮扫描,淘汰(0,1),第四轮一定可以找出需要淘汰的页面。
调入调出页面
驻留集是内存给进程分配的内存块的集合,一般小于进程的总大小。
驻留集分配策略:
- 固定分配局部置换:给进程分配固定大小的驻留集,一旦缺页而驻留集没有空闲,只能选择淘汰驻留集内的页面,给要使用的页面腾出空间。
- 可变分配全局置换:只要缺页就分配新的内存块,这些物理块来自内存的空闲内存块队列,如果没有空闲分区,就调出某个未锁定的页面(一些存放重要数据的页面会被操作系统锁定,无法被调出外存),这个页面还可能来自其他进程。
- 可变分配局部置换:只允许从驻留集内置换页面给调入页面腾出空间。如果缺页率较高,系统就给进程增加内存块;如果缺页率较低,就减少进程分配到的内存块。最后调整到进程的缺页率达到合适的水平。
何时调入页面:
- 预留页策略:在调入一个页面时,按照局部性原理,一起调入附近的其他几个页面。一般用于进程首次调入内存时,由程序员指定调入哪些页面。
- 请求调页策略:只在缺页时调入页面。
从何处调入页面:
一般从外存的对换区调入,对换区的存储是连续的,文件区的存储是离散的,所以对换区的速度比文件区要快。
如果对换区已满,那么就把不需要修改的页面放在文件区,这样就可以避免I/O操作,即写回磁盘区,需要时从磁盘调入就可以,不需要写回。
UNIX策略:第一次使用的页面存在文件区,从文件区调入,需要写回磁盘的文件就调出到对换区,再次使用时从对换区调入。

抖动(颠簸)现象:因为分配给进程的驻留集太小,导致频繁的调入调出操作,甚至出现刚调入就得调出的情况。
工作集是进程运行期间实际被访问的内存块的集合,一般小于驻留集,否则会造成抖动现象。。操作系统根据“窗口尺寸”计算工作集,经过一段时间监测发现窗口尺寸小于工作集,就更改窗口尺寸。

虚拟内存利用局部性原理扩大内存空间,实际容量由内存和外存之和的最小值决定。请求分页和页面置换是其核心,其中LRU和CLOCK置换算法常见。调入调出策略涉及驻留集分配,防止抖动现象,优化进程内存使用。
1117

被折叠的 条评论
为什么被折叠?



