Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130105
  • 博文数量: 17
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-13 14:07
文章分类

全部博文(17)

文章存档

2011年(1)

2009年(5)

2008年(11)

我的朋友

分类: LINUX

2008-12-17 18:09:44

指数据缓冲区高速缓存。 内核通过buffer cache的内部数据缓冲区池来减少对磁盘的存取频率。高速缓冲含有最近被使用过的磁盘块的数据。

高速缓冲模块位于文件系统与块设备驱动之间。从磁盘读数据时,内核先试图从高速缓冲中读取。如果数据不在缓存中,则从磁盘读取并将其缓冲起来。要写入磁盘的数据也可被暂存与高速缓冲中,以便内核随后又试图读取它。或者数据可以延迟写入磁盘,一减少磁盘写操作频率。

1. 缓冲头部

一个缓冲区的数据与文件系统上一个逻辑磁盘块中的数据相对应。

buffer header包含:设备号、块号、指向数据区域的指针、状态

2. 缓冲池

当一个缓冲区分配给磁盘块之后,只要不是所有其他缓冲区都在更近的时间内被使用过了,它就不能让另一磁盘块使用该缓冲区。

每个缓冲区总是存在于一个散列队列中,该队列根据设备号和块号作为散列值。另外有一个空闲队列,缓冲区可以在或不在空闲队列中。

3. 缓冲区的检索

不能为同一个磁盘块分配两个缓冲区。

分配算法: getblk。读入磁盘数据时,首先获得一个空闲缓冲区,并标记为busy,把数据写入。

释放算法: brelse。将释放的缓冲区标为空闲,并放入空闲队列。唤醒那些因该缓冲区忙而睡眠的进程,也唤醒由于空闲表上没有缓冲区而睡眠的进程。

缓冲区分配的算法必须是安全的:必须使进程不永远睡眠,必须使他们最终能得到一个缓冲区。

4. 读写磁盘块

读磁盘块时: 1)进程使用getblk在高速缓冲中搜索这个磁盘块;若找到则立即返回;2)若找不到,则内核调用磁盘驱动程序,发起读请求,然后睡眠等候IO完成事件;3)磁盘驱动程序通知磁盘控制硬件,读取数据;4)磁盘控制器传回数据到缓冲区;5)IO完成,中断程序唤醒睡眠进程。这样,磁盘块内容已放入缓冲区。

breada:读块与提前读。提前读是异步的。

bwrite:写块。如果执行延迟写,则为该缓冲区做标记,使用brelese算法释放该缓冲区,并且不调度IO就继续向下执行。在被的进程可能把该缓冲区重新分配给另一个快之前,内核把该块写到磁盘上。(内核希望有进程在该缓冲区必须被写到磁盘上之前存取该块,如果那个进程后来又改变了该缓冲区内容,则内核节省了一次额外的磁盘操作)。延迟些不同于异步写,对于”延迟写“,内核尽可能长时间地推迟物理地往磁盘上写。

内核在中断处理程序中需要调用brelse。如getblk找到一个”延迟写“的缓冲区,则内核把它做好标记后,异步地写到磁盘上,由中断处理程序调用brelse释放该块到空闲表上。因此对空闲表的操作过程中需要禁止中断。

C中的fflush使数据从用户地址空间的缓冲区流转到内核。但由于"延迟写“的存在,进程不能断定数据究竟何时物理地记录到磁盘上。
















阅读(1073) | 评论(0) | 转发(0) |
0

上一篇:Unix操作系统

下一篇:Linux on IBM zSeries

给主人留下些什么吧!~~