下面我们来讨论磁盘缓存
磁盘缓存是放在内存里的
磁盘数据的缓存
那这些缓存呢 是为了避免
对同一块磁盘扇区里的内容
进行反复引用时候的多次磁盘访问
我们先说什么是缓存
缓存实际上是数据传输过程当中
双方速度差异比较大的时候
我在中间为了匹配速度
引入的一个中间层
我们这里磁盘缓存呢
就是把磁盘扇区的内容
在内存当中做一个缓存区
如果内存里有
我就可以直接用内存里的缓存数据了
在这儿我们可以看到这种做法
和我们前面讲的虚拟存储很类似
虚拟存储是用磁盘空间
来存内存里存不下的这些数据
而现在这个磁盘缓存是倒过来
所以从这个角度来讲呢
它们俩有很多地方是相似的
但是它们也有很多地方是不一样的
比如说内存和磁盘缓存
磁盘的访问频度呢
它是要远低于虚拟存储的访问频率的
由于访问频率比较低
这个算法我就会做的
比虚拟存储会复杂
磁盘缓存的置换算法到底怎么来做
也就是说我到底该
把哪些磁盘块的内容在内存里做缓存
哪些不做
在具体讨论
一种磁盘缓存置换算法之前
我们先讨论一下单缓存和双缓存
这里单缓存和双缓存呢
指的是这个缓存区
到底是一个还是两个
首先我们来看单缓存
它的做法是什么呢
设了一个缓存区
然后有两头
一头是CPU 一头是设备
设备往这缓存区里写数据的时候呢
由于我只有单缓存
这时候CPU这头呢是不能操作的
等CPU这一头能够从缓存区里
读数据的时候
设备这一头是不能往里写的
大家还记得吗
我们前面讨论到的生产者 消费者问题
就是跟这儿是很类似的
由于在这里我任何一个时刻
只有一个可以对这个缓存区进行操作
它的速度就很受限制
如果说你两边交互频繁的话
那这时候就有我们这里的双缓存
它是设置两个缓存区
在一个缓存区
由一头在进行操作的时候
比如说这里头I/O设备
往缓存区1里头写数据
那么这时候缓存区2呢
就可以由CPU来从里读数据
这两个是可以同时进行的
因为它俩在不同的缓存区里头
一旦是我写完了 这回也读空了
它两头做一个切换
我们两头又都可以继续进行了
这样的话它的交换速度就会更快
有了这个讨论之后 我们来看
磁盘缓存的访问频率置换算法
在这里设计这个算法
要解决的问题是在于
在磁盘访问的时候
我有可能访问某一个扇区里的数据
我频繁的访问
这个频繁的访问如果说我们用LFU的话
那这个计数就会很快速的增加到很大
这时候你再往后用LFU它就不能反映
当前你进行引用的真实情况
我怎么来做呢
它的思路是这样
对于密集访问的这一段
我不对它进行引用计数
基本上说起来就是
在短周期之内我用LRU
在长周期里我用LFU
这样的话我就可以在短周期里头
靠特殊的栈的处理
来描述我的访问顺序
然后在长的时间尺度里
我用LFU来进行访问次数的计数
具体怎么做呢 我们来看
这是访问频率置换算法的示意图
首先这是LRU里的那个特殊的栈
这是栈底 这是栈顶
和前面的LRU不同的地方是在于
我把这个栈分成了三段
第一段叫新区域
第二段叫中间区域
然后第三段叫旧区域
分三段的目的呢
是为了这三段我做不同的处理
具体这种不同的处理在什么地方呢
每一次访问的时候
访问某一块数据块
那我把这一块放到这个栈顶
这是LRU的要求
然后我又附着上两个
如果说你这个引用的这一块
是在新区域里头
它往前移的时候
它的计数是不变的
这就是我们真正的LRU
如果说不是在这新区域里头
是在中间区域或者是旧区域里头
那么引用的时候
不但挪过去并且把计数要加一
那么这样一来我们就可以实现
在新区域里头不加一
避免了你这密集访问所带来的
引用计数的快速增加
而在中间区域和旧区域里头我加一
那这是我们LFU的要求
有了这两个之后呢
我新加入的这些块
我直接把它放到栈顶
这是LRU的要求
并且把它引用计数置为1
然后说我淘汰的时候怎么办呢
原来淘汰说我在这里栈底的
现在它是在旧区域里去找计数最小的
这是LFU的要求
但是和LFU的区别是在于
我不在整个栈里去找计数最小的
有可能这个密集访问
和中间这种新加进来的它的计数很小
这样一来的话就定义这个中间区域
就是为了避免
我的计数刚进来用了没多长时间
它正是我们频繁要使用的
但是由于计数比较小
你把它置换出去的这种情况
我只是在旧区域里头
我才按照计数大小来选
使得这个中间区域呢
变成是一个过渡的
有了这样一种做法之后
我们就把原来在虚拟存储里的算法
改造成一个更复杂
可以用来做磁盘缓存置换算法的
这个访问频率置换算法
这是磁盘缓存置换算法
那到这儿我们就讲完了
I/O子系统里的磁盘缓存
我们把刚才讲过的内容总结一下
我们在这节课里呢
首先对I/O访问的特征进行了一个介绍
我们有多种不同的设备
然后这些设备的访问方式呢
各有各的特点
针对块设备 字符设备
和网络设备这三种不同情况
我们进行不同的处理
然后数据传输我们可以分成
轮询方式 中断方式 DMA方式
这几种方式
是我们在I/O子系统里常用的
然后接下来我们介绍了
我们常用的一种设备
磁盘设备里头的优化
这里面优化又分成两个
一个是我对I/O请求
到底我哪个先去访问
这是磁盘调度讨论的问题
第二个是磁盘缓存
我把磁盘上的数据
哪些放到内存里做缓存
也给了一个算法
I/O设备有很多种
其它各种各样的设备
也有针对各自的特点进行的一些优化
只是由于时间的缘故
我们在这儿没有做深入的讨论了
那到这个地方呢
我们这学期的课就讲完了
好 谢谢大家
我们这节课就上到这里 下课