2.虚拟内存管理
1.几个虚拟内存的基本概念
1.传统存储管理的方式特征:多进程同时保存在内存中用来实现多线程并发,所以有一次性:必须全部装入才运行;驻留性:一直存储在内存中,不会置换出去;
2.原理:快表、页面高速缓存、虚拟技术都属于高速缓存技术;都是依赖局部性原理:有时间+空间的局部性;
3.虚拟存储器:只是提供部分装入、请求调入、置换功能后,但是感觉好像存在一个比实际大的物理内存的存储器;
4.要用离散分配的内存的方式来存储;
5.实现:请求页面管理的方式
2.页面置换算法
最有意思也是最好玩的来了!
都以7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1举例
1.最佳置换算法(OPT)
不可预知进程后面需要哪个页面, 所以不可实现,但是作为评价标准,用来衡量其他算法!
简单计算:根据后面的页面先换出1.永不使用2.最长时间内不在访问的页面;
2.先进先出页面置换算法(FIFO)
用队列数据结构实现依次进入的页面,置换出队头元素;
问题:有时候会出现物理块增加,但是页面置换次数更多的现象,称为Belady异常;
3,最近最长时间未使用置换算法(LRU)
实现:为每个进来的页面设置一个访问字段,来记录自上次被访问以来所经历的时间,每次置换出去字段值最大的,也就是最长时间未使用的;
优缺点:性能好、用堆栈来实现,堆栈算法,实现起来困难;
4.时钟算法(Clock)(NRU最近未用算法) (折中的选择,介于LRU和FIFO之间)
思想:循环扫描每帧(就是存放页面的地方):给每帧加个使用位,
只要页面装入帧中,就设置为1,意思是使用了他,当后面访问到时,也设置为1;
替换算法:让指针指向集合的下一帧,,当要替换就开始扫描,总体是把使用为0的给替换掉,如果循环到某个为1的就重新设置为0,这样子全循环完毕,回到开始位置就把第一个换出去了;
5.升级版CLOCK算法:
就是给每帧额外加个修改位:这样子每帧就有4中情况:(按照顺序依次替换)
1)u = 0,m = 0;最近未被访问,也未被修改
2)u = 0,m = 1;最近未被访问,被修改
3)u = 1,m = 0;最近被访问,未被修改
4)u = 1,m = 1;最近被访问,也被修改
也是同理CLOCK算法,依次循环,依次取1,2,3,4的顺序执行,
期间也是循环不是想要的话 需要把使用位(u)置为0;
这样子最后总是把1,2给换出去了;
备注添加:晚自习回来的路上和舍友讨论这个问题,我自己在脑海中想了遍阐述了遍:大概得到的结果是:升级版的CLOCK,考虑这么一种情况:假如扫描的缓冲区都使用了,则需要循环遍历1整遍回到起点才替换掉, 但是 因为添加了修改位,就不需要遍历1整遍了,同是1的情况下,看下修改位就可以确定要不要替换掉了,所以升级了!
总结:原则:
尽可能保留曾经使用过的页面,淘汰未使用过的页面!