免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1054 | 回复: 0
打印 上一主题 下一主题

高速缓存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-17 18:09 |只看该作者 |倒序浏览

                指数据缓冲区高速缓存。 内核通过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使数据从用户地址空间的缓冲区流转到内核。但由于"延迟写“的存在,进程不能断定数据究竟何时物理地记录到磁盘上。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/38597/showart_1726464.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP