第三章 数据缓冲区高速缓冲 硬件缓存(cache) 由一种高速寄存器(register). 组成,主要解 决CPU与RAM之间的速度差问题。 数据缓冲区高速缓冲(buffer) 由软件实现的解决文件系统和物理硬盘之间的 数据同步的一种方法。 数据缓冲区高速缓冲是UNIX特有的对数据并发访 问的一种控制机制。 1
第三章 数据缓冲区高速缓冲 硬件缓存(cache) 由一种高速寄存器(register)组成,主要解 决CPU与RAM之间的速度差问题。 数据缓冲区高速缓冲(buffer) 由软件实现的解决文件系统和物理硬盘之间的 数据同步的一种方法。 数据缓冲区高速缓冲是UNIX特有的对数据并发访 问的一种控制机制。 1
问题的提出: 1、磁盘机械运行速度大大低于处理机的运行 速度; 2、多进程并发运行,少量的磁盘(通道) VO成为瓶颈; 3、数据访问的随机性,磁盘忙闲不均 2
问题的提出: 1、磁盘机械运行速度大大低于处理机的运行 速度; 2、多进程并发运行,少量的磁盘(通道) I/O成为瓶颈; 3、数据访问的随机性,磁盘忙闲不均 2
解决办法: 1、建立一个被称为数据缓冲区高速缓冲(简称高速缓冲)的内 部数据缓冲区池(buffer pool)来存放要用的数据; 2、写数据时 把数据尽量多地尽量长时间地保存在缓冲池中 延迟写出到磁盘上 以备后续进程使用 3、读数据时 先在缓冲池中查找已有的数据 如没有,再从磁盘读取,并保存在缓冲池中 事先预读数据到缓冲池中 3
解决办法: 1、建立一个被称为数据缓冲区高速缓冲(简称高速缓冲)的内 部数据缓冲区池(buffer pool)来存放要用的数据; 2、写数据时 把数据尽量多地尽量长时间地保存在缓冲池中 延迟写出到磁盘上 以备后续进程使用 3、读数据时 先在缓冲池中查找已有的数据 如没有,再从磁盘读取,并保存在缓冲池中 事先预读数据到缓冲池中 3
3.1缓冲区及缓冲区首部 缓冲区池由若干个缓冲区组成,每一个缓冲区又由两部分 组成:一个实际存放数据的存储区和一个标识该缓冲区的 缓冲区首部。 缓冲区首部 因为缓冲区首部与数据 存储区之间有一一对应的 存 关系,所以通常把两者统 储区 称为缓冲区。 缓冲区是缓冲区池中数 据存储的基本单位。 4
3.1 缓冲区及缓冲区首部 缓冲区池由若干个缓冲区组成,每一个缓冲区又由两部分 组成:一个实际存放数据的存储区和一个标识该缓冲区的 缓冲区首部。 存 储 区 因为缓冲区首部与数据 存储区之间有一一对应的 关系,所以通常把两者统 称为缓冲区。 缓冲区是缓冲区池中数 据存储的基本单位。 缓冲区首部 4
缓冲区首部的定义: struct buf 缓冲区标志 标识缓冲区状态 缓冲区链接指针 向前向后串成链表 空闲缓冲区链表指针 联结空闲缓冲区 设备号 标识缓冲区 块号 union{ 缓冲区中的数据类型 数据块 超级块 柱面块 节点块 }b_un 其它控制信息 } 5
缓冲区首部的定义: struct buf { 缓冲区标志 标识缓冲区状态 缓冲区链接指针 向前向后串成链表 空闲缓冲区链表指针 联结空闲缓冲区 设备号 标识缓冲区 块号 union{ 缓冲区中的数据类型 数据块 超级块 柱面块 i节点块 }b_un 其它控制信息 } 5
3.2缓冲池的结构 1、最近最少使用(LRU)算法: ① 程序设计采用模块化和层次化结构,尽量避 免使用goto语句,程序跳转少,适应“流水线 (pipeline)”体系结构的系统; ② 特定时间段内,程序在一个相对集中空间 (代码段)内运行,涉及的数据(广义的:文 件名、变量、指针和数组等)的个数相对较少; 当前使用过的数据,马上还要使用的可能性 最大,较长时间未用过的数据,即将使用的可 能性最小。 6
3.2 缓冲池的结构 1、最近最少使用(LRU)算法: ① 程序设计采用模块化和层次化结构,尽量避 免使用goto语句,程序跳转少,适应“流水线 (pipeline)”体系结构的系统; ② 特定时间段内,程序在一个相对集中空间 (代码段)内运行,涉及的数据(广义的:文 件名、变量、指针和数组等)的个数相对较少; ③ 当前使用过的数据,马上还要使用的可能性 最大,较长时间未用过的数据,即将使用的可 能性最小。 6
2、缓冲池设计基本原则: 存放有刚使用过的数据尽量长时间地保留在内 存中,以便马上还要使用时能在内存中找到; 需要腾出内存空间时,把很久都未使用过(即 最近最少使用)的数据交换到磁盘上去。这些数 据马上还要使用的可能性最小 7
2、缓冲池设计基本原则: ① 存放有刚使用过的数据尽量长时间地保留在内 存中,以便马上还要使用时能在内存中找到; ② 需要腾出内存空间时,把很久都未使用过(即 最近最少使用)的数据交换到磁盘上去。这些数 据马上还要使用的可能性最小。 7
3、空闲缓冲区链表 核心维护了一个空闲缓冲区链表,它按照最近被使用的先 后次序排列。空闲链表是一个以空闲缓冲区链表头开始的“双 向循环链表”。链表的开始和结束都以链表头为标志。 链表头 空闲缓冲区1 空闲缓冲区2 空闲缓冲区3 空闲缓冲区n 8
3、空闲缓冲区链表 核心维护了一个空闲缓冲区链表,它按照最近被使用的先 后次序排列。空闲链表是一个以空闲缓冲区链表头开始的“双 向循环链表”。链表的开始和结束都以链表头为标志。 链 表 头 空 闲 缓 冲 区 1 空 闲 缓 冲 区 2 空 闲 缓 冲 区 3 空 闲 缓 冲 区 n 8
4、空闲缓冲区链表操作 取用任意空闲缓冲区 从空闲缓冲区链表的表头位置取下一个空闲缓冲区, 后面的空闲缓冲区依次向前移动。 释放一个空闲缓冲区 把这个装有数据的空闲缓冲区附加到空闲链表的链尾。 只有当该空闲缓冲区所装数据出错时才挂到链头。 取用装有指定内容的空闲缓冲区 从链表头开始查找,找到后取下使用,用完后放到链 尾。 当系统不断从链头取用空闲缓冲区,又把使用过的(装有 数据的)缓冲区挂到链尾,一个装有有效数据的缓冲区就会 逐渐向链表头移动。在链表头位置的就是“最近最少使用” 的空闲缓冲区。 9
4、空闲缓冲区链表操作 ① 取用任意空闲缓冲区 从空闲缓冲区链表的表头位置取下一个空闲缓冲区, 后面的空闲缓冲区依次向前移动。 ② 释放一个空闲缓冲区 把这个装有数据的空闲缓冲区附加到空闲链表的链尾。 只有当该空闲缓冲区所装数据出错时才挂到链头。 ③ 取用装有指定内容的空闲缓冲区 从链表头开始查找,找到后取下使用,用完后放到链 尾。 当系统不断从链头取用空闲缓冲区,又把使用过的(装有 数据的)缓冲区挂到链尾,一个装有有效数据的缓冲区就会 逐渐向链表头移动。在链表头位置的就是“最近最少使用” 的空闲缓冲区。 9
5、空闲缓冲区分类 系统中共设置了四个空闲缓冲区链表,根据缓冲区的不同 用途而把它的放入不同的空闲缓冲区链表中。避免在取用空闲 缓冲区时,逐个判断缓冲区中的内容。这四个空闲链表是: 0#空闲缓冲区链表一存放文件系统超级块 1#空闲缓冲区链表一 存放通常使用的数据块 2#空闲缓冲区链表一存放延迟写、无效数据或错误内容 3#空闲缓冲区链表—一 存放没有对应存储空间的缓冲区首部 如果某种类型的空闲缓冲区不够用时,核心也从其它空闲缓冲 区链表中取用空闲缓仲区。 10
5、空闲缓冲区分类 系统中共设置了四个空闲缓冲区链表,根据缓冲区的不同 用途而把它的放入不同的空闲缓冲区链表中。避免在取用空闲 缓冲区时,逐个判断缓冲区中的内容。这四个空闲链表是: 0#空闲缓冲区链表——存放文件系统超级块 1#空闲缓冲区链表——存放通常使用的数据块 2#空闲缓冲区链表——存放延迟写、无效数据或错误内容 3#空闲缓冲区链表——存放没有对应存储空间的缓冲区首部 如果某种类型的空闲缓冲区不够用时,核心也从其它空闲缓冲 区链表中取用空闲缓冲区。 10