UNIX操作系统设计-数据缓冲区高速缓冲

《UNIX操作系统设计》第三章

数据缓冲区高速缓冲(buffer cache)简称高速缓冲。内核通过保持其内部数据缓冲池来减小对磁盘的存取频率,高速缓冲中含有最近被使用过的磁盘块的数据。

概述

数据缓冲区高速缓冲(buffer cache)简称高速缓冲。内核通过保持其内部数据缓冲池来减小对磁盘的存取频率,高速缓冲中含有最近被使用过的磁盘块的数据。

这里这是一个软件结构,和cache硬件不同。

高速缓冲模块位于文件子系统与设备驱动程序之间,如图:

image-20201014171109809

高层内核算法让告诉缓冲模块把数据预先缓存起来,或者延迟写数据以扩大高速缓冲的效果。

缓冲头部

image-20201014172335559

缓冲区组成:一个含有磁盘上的的数据的存储器数组 + 一个用来标识该缓冲区的缓冲头部。缓冲头部到数据数组一对一映射,所以统作为“缓冲区”。

一个缓冲区的数据与文件系统上体格逻辑磁盘块中的数据对应,缓冲区是磁盘块在主存中的拷贝

缓冲头部包含一个设备号字段和一个块号字段,两者指令了文件系统与磁盘上的数据的块号,并唯一标识该缓冲区。

  • 设备号是逻辑文件系统号,而不是物理设备(磁盘)号。
  • 指向数据数组的指针至少有磁盘块那么大。
  • 缓冲区状态是如下条件的组合
    • 缓冲区当前为“上锁”
    • 缓冲区包含有效数据
    • 延迟写,内核把某缓冲区重新改分配出去之前必须把缓冲区内容写到磁盘上。
    • 正在读或写,内核正从磁盘往缓冲区读或者把缓冲区写道磁盘上。
    • 一个进程当前正在等候缓冲区变为闲。

缓冲池结构

空闲表

  • 内核维护一个缓冲区的空闲表,保存最近使用的次序
  • 采用双向循环链表
  • 哑缓冲区头标,标志缓冲区空闲表的开始和结束
  • 内核按最近最少用算法把数据缓存于缓冲池
  • 缓冲区还给缓冲池时,添加到尾部。申请时,从头部取出。
  • 空闲表头部是最近最少使用的

image-20201015012235788

散列队列

为了方便内核搜索相应的缓冲区,内核使用设备号和块号的组合找相应的缓冲区,它把缓冲区组织成多个队列,这些队列以设备号和块号散列。

image-20201015013622658

一个缓冲区总是在某个散列队列上,但是可以在或不在空闲表中。

缓冲区的检索

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×