欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

时钟算法中的贝拉迪现象

最编程 2024-07-02 08:53:36
...

clock算法是有belady现象的。

belady现象是指局部置换算法中,发现某进程缺页率变高,于是操作系统给它又分了几个物理页,原以为缺页率的增高是由于工作集变大,物理页帧不够用,结果增加了物理页以后,缺页率不降反而升高。

belady现象的出现,是由于置换算法将需要经常访问的页面置换了出去导致的。例如FIFO算法,即便最开始进入内存的那个页面是最近以及未来要经常访问的,但是FIFO还是选择把它换出去。

FIFO选择替换最早进入内存的页面,没有考虑到这个页面未来是否可能会经常访问,所以导致了belady现象。

类似的算法还有clock算法,clock算法本质跟FIFO一样,假如物理页帧数为4,并页面p1、p2、p3、p4先后被访问并被载入物理页帧,从p4被载入内存的时刻t1开始,直到下一次发生缺页的时刻t2为止这段时间内最经常访问的页是p1,根据局部性原理,未来p1有很大可能要继续访问。但是clock算法给这四个页面都设置了访问位,而且很遗憾的是,这个访问位只有一个比特,它根本区分不了这个四个页面中谁被访问最频繁,这4个页面的访问位都是1,根据clock算法,t2时候发生缺页,clock算法按照被载入内存的时间先后扫描所有页帧,将第一个访问位为0的页面置换出去,但是显然这四个页面的访问位都是1,所以clock算法会将这4个页面的访问位依次置为0,然后循环扫描,将p1置换出去。所以clock算法是存在belady现象的。

clock算法的提出就是因为觉得LRU为了维持对访问局部性(谁是最近第一个被访问的、谁是最近第2个被访问的、...)的感知,开销太大,LRU需要经常修改页面链表,确保是按照最近访问时间排序。FIFO不需要费这种功夫,所以开销比较小,但是缺点是FIFO感知不了访问局部性。

clock算法是LRU和FIFO的折中,但是还是偏向于FIFO,它不像LRU那样能够区分页面的访问时间的先后顺序,它只能够区分有没有被访问过,至于在那些都被访问过的页面中,谁是最频繁被访问的、谁是最近被访问的,clock算法区分不了。所以导致它经过一轮扫描以后退化成为FIFO。