页面置换算法
1、页错误
TLB未命中,需要查看页表,这时会检查存在位,查看页面是在物理内存还是在磁盘上。页表在磁盘上,会发起页错误。进程进入阻塞状态,控制权交给操作系统。
1)若物理内存有足够的空间,直接将页面调入该空间。
2)若物理内存空间不足,则挑选一些物理内存中现有的表项替换出去,需要的页换进来。这一过程需要页面置换算法减少经常使用的页面的交换,提高物理内存的命中率。
2、硬件缓存的指标
缓存管理的时间AMAT = P(hit)* T(M) + P(miss)* T(D)
P(hit)——在缓存中找到数据的概率
P(miss)——在缓存中找不到数据的概率
T(M)——访问缓存的时间成本
T(D)——访问硬盘的时间成本
3、页面置换算法
- 最优置换策略(OPT)
将最远的将来才会访问的页面替换出去。
由于无法预知未来,该算法不可实现,但是其效率可以用来衡量其他算法的效率。 - 先进先出策略(FIFO)
最放入内存的页面最先换出。
实现简单。
最先放入的页面可能是最多使用的,会降低命中率。 - 随机策略
随机将一个页面替换出去。
命中率也是随机,难以预测。 - 最近最少使用策略(LRU)
将最近没有使用的页面替换出去。
可以使用链表来实现:
维护一个链表来记录各个进程最近使用的情况,
将最近使用的节点放在链表的头部,
需要将页面移出的时候,要删除链表尾部的节点
同时在有新的进程进入程序,要新加节点的时候要看链表是否达到了最大的长度,否则可能会造成内存泄漏。
由于LRU开销较大,一般不使用
产生了一个问题:
如何精确的记录历史的时间?
1)额外增加一位来记录访问的历史
2)增设时间字段,利用硬件获得最新访问的时间。
查找到最先的时间成本较高,需要退而求次的寻找比较先的页面 - 时钟算法(clock)
这是近似LRU的算法
使用循环链表,每个节点表示一个进程,设置一个访问位表示过去一段时间是否访问过。
使用一个指针,当有页面需要替换出去的时候。按照一个方向移动指针,如果访问位为1(表示最近访问过)则将其设置为0,移动到访问位为0的页表将其替换出去。
改进版本,额外设置dirty位,表示近期有无修改,将近期没有访问且没有修改的页面置换出去。否则将页面置换出去之前需要修改磁盘中的数据,造成额外的开销。
(一直不理解磁盘上是否有相应的内存的备份)。
4、考虑局限性
1)不考虑局限性
最优置换算法效率领先,其他的一致。
2)考虑局限性
最优 > LRU > 其他
6、其他的相关策略
1)按需分页
进程需要多大的空间就为其分配多大的页面。
2)聚集
收集要写入磁盘的页面,一起写入磁盘。因为向磁盘中写入数据较慢,因此一次写入较多的数据比一次写入较少的数据更加有效。
3)抖动
运行所需的内存的大小 > 实际物理内存的大小
在运行的时候不停的将页面从物理内存置换到磁盘上面