前面所介绍的各种存储管理方式有一个共同的特点,即他们要求将一个作业全部装入内存后方能运行,于是出现了以下情况:
1>有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入,致使作业无法运行
2>有大量作业要求运行,但由于内存容量不足,只能将少数作业装入内存,而其他大量的作业留在外存等待.
一个办法就是从物理上增加内存容量,但往往会受到机器自身的限制,另一种就是从逻辑上扩充内存容量,即虚拟技术.
虚拟存储器:
应用程序在运行之前,没有必要全部装入内存,仅须将将当前那些要运行的少数页面或者段装入内存便可运行,其余部分就在磁盘上.(装过系统的朋友都知道无论是linux还是windows分区时我们都要给它分交换分区,交换分区其实就是暂存物理内存中不用的内容).当所要访问的页面或者段在内存中找不到的时候,利用调页功能将其调入内存然后运行,若内存已满,则需利用置换功能将内存中暂时不用的页调至交换区,在将需要访问的页或段调入内存运行.这样便使一个大的程序在一个较小的内存空间运行,但用户的感觉是内存很大,但这种是虚的.
调页策略
1>预调页策略:根据局部性原理,如果进程的许多页是存放在外存的一个连续区域中,则一次调入若干个相邻的页,会很高效.但如果调入的页很多未被访问,则又是低效的.目前调入成功率仅为50%.
2>请求调页策略:需要的时候从外存调入,但这种策略每次仅调入一页,系统开销比较大.
置换策略
页面置换算法是针对内存和磁盘交换页面的,目的是为了尽量少交换页面,少产生缺页异常,因为访问磁盘是非常耗时的,这个后面会说到.网上讲的页面置换算法的很多了,这里简单叙述下。
OPT理想页面置换算法
将未来不使用的或者很久后才使用的页面置换出内存。
我们可以看出这样发生缺页异常会少很多,但是这个算法是不能实现的,它的意义是用来作为一个衡量的标准,评判其他算法的好坏。
FIFO先进先出算法
思想很简单,当需要置换页面时,将最早到来的置换出去,因为它存在的最久,这个算法是最简单的,但是缺不高效,因为我们不能保证停留最久的页面不是最常访问的。
第二次机会算法
在FIFO算法的一种改进,按照FIFO思想,本身轮到你置换出去了,现在我在给你一次机会,我访问你页表项中的访问位,如果访问位为1说明你最近被访问过,我这次不将你置换出去,把你的访问位设置为0,然后从队头放到队尾。下次再次轮到你时我在判断。如果你的访问位为0说明你最近没有被访问过,置换出去。
时钟算法
是在第二次机会算法上的一种结构的改进,将链式结构改造成环状,类似环形数组,这样就想一个时钟一样转即可,不需要像第二次机会算法一样每次每次还要将队头放到队尾这种耗时的操作。
LRU
LRU是Least Recently Used的缩写,即最少使用页面置换算法
将近期使用次数最少的页面置换出去,这种算法也是不能实现的,只有接近它的算法
老化算法
老化算法就是接近LRU的一种算法,它是给每个页面一串bit位,比如8位00000000,当每访问一个页面时,我就将每个页面的bit位向右移动一位,然后被访问的页面首位补1。
其实就像高低信号一样,随着时间右移,有新信号为1,没有则为0,长时间没有的就慢慢衰减的00000000。
NRU
NRU也是近似LRU的一种算法,不过它是根据页面的标记位来判断,比如修改位和访问位,最近访问的和最近修改的都会被置为1,没有被访问和修改这两位都为0。根据2位4中情况来判断淘汰页面。