《UNIX操作系统设计》第三章
数据缓冲区高速缓冲(buffer cache)简称高速缓冲。内核通过保持其内部数据缓冲池来减小对磁盘的存取频率,高速缓冲中含有最近被使用过的磁盘块的数据。
概述
数据缓冲区高速缓冲(buffer cache)简称高速缓冲。内核通过保持其内部数据缓冲池来减小对磁盘的存取频率,高速缓冲中含有最近被使用过的磁盘块的数据。
这里这是一个软件结构,和cache硬件不同。
高速缓冲模块位于文件子系统与设备驱动程序之间,如图:
高层内核算法让告诉缓冲模块把数据预先缓存起来,或者延迟写数据以扩大高速缓冲的效果。
缓冲头部
缓冲区组成:一个含有磁盘上的的数据的存储器数组 + 一个用来标识该缓冲区的缓冲头部。缓冲头部到数据数组一对一映射,所以统作为“缓冲区”。
一个缓冲区的数据与文件系统上体格逻辑磁盘块中的数据对应,缓冲区是磁盘块在主存中的拷贝。
缓冲头部包含一个设备号字段和一个块号字段,两者指令了文件系统与磁盘上的数据的块号,并唯一标识该缓冲区。
- 设备号是逻辑文件系统号,而不是物理设备(磁盘)号。
- 指向数据数组的指针至少有磁盘块那么大。
- 缓冲区状态是如下条件的组合
- 缓冲区当前为“上锁”
- 缓冲区包含有效数据
- 延迟写,内核把某缓冲区重新改分配出去之前必须把缓冲区内容写到磁盘上。
- 正在读或写,内核正从磁盘往缓冲区读或者把缓冲区写道磁盘上。
- 一个进程当前正在等候缓冲区变为闲。
缓冲池结构
空闲表
- 内核维护一个缓冲区的空闲表,保存最近使用的次序
- 采用双向循环链表
- 哑缓冲区头标,标志缓冲区空闲表的开始和结束
- 内核按最近最少用算法把数据缓存于缓冲池
- 缓冲区还给缓冲池时,添加到尾部。申请时,从头部取出。
- 空闲表头部是最近最少使用的
散列队列
为了方便内核搜索相应的缓冲区,内核使用设备号和块号的组合找相应的缓冲区,它把缓冲区组织成多个队列,这些队列以设备号和块号散列。
一个缓冲区总是在某个散列队列上,但是可以在或不在空闲表中。