这里总结一下学到的操作系统的存储管理模块中置换算法。

前提:

空间局部性:程序代码总是执行他附近的代码,因为程序是由(顺序结构,判断结构,循环结构)组成的

时间局部性:现在使用到的数据,最近,将来都有可能将会被用到。一般来说我们的现在的缓存都是根据这个设计的。

操作系统的内存一般采用的是段页式技术,段是因为程序员写程序都模块化了。页是内存真正的划分方式。一个内存区域被划分成了很多很多页。

操作系统将逻辑地址转化为物理地址的过程叫做重定位。

对于虚拟存储来说,对于一个进程运行,只是从辅存中拷贝一个进程的内容到主存中,因此,当主存的内容改变的时候,我们要将主存改变的内容写到辅存中。确保正确。

操作系统是如何来进行重定位的呢?

对于段页式技术来说,他的过程是这样的。

给定一个段号,给定一个偏移量。然后找到段表,根据段表中的内容找到页表,页表有几个字段分别是,页号,页框地址(frame),是否存在,是否修改。

根据偏移量,计算出是哪个页号,如果存在,那么得到叶框地址,再根据偏移量得到,这条数据。

如果不存在,那么就看是否有空闲页表,如果有,那么就请求,不存在的页面,放入空闲页表,如果页表已经满了,则采用置换算法。置换进来页面。

 

 

置换算法:

理想化的算法是根据未来最少最远利用的,把他置换出去。将要用到的页面置换进来,显然这是理论上的,毕竟不知道将来我们要用什么页面。

还有一种算法是LRU,中文全称是最近最少使用,就是说进行这个算法,我们要把使用页面的频率还有最近使用的时间都记下来,然后排序。(不管页面置换是全局置换,还是固定的区域置换)这种算法,显然对于系统来说是很耗资源的。显然不可能。

有一种用巧妙的算法是时钟算法。真佩服能想到这种算法的人。

时钟置换算法是这样的,初始所有的页面都标记为零,当有页载入,或者用到这个页时,就将这个标志位该为1;

时钟算法,然后是,每当有一个缺页请求或者,预测的页进来的时候,时钟就要开始走动,当遇到1的时候,将它改为零,遇到零的时候停止走动。将这个页面置换出去。

很显然这是一个很好的算法。但是有一个不足的地方,就是修改的页,保存回去的话,要进行写到辅存,如果页没有修改的话,那么就不用写到辅存。就可以减少资源的消耗了。

下面就是进阶的页时钟算法