为了提高Linux块设备读写的效率,Unix会在内存中建立块高速缓存,块高速缓存存储了系统最近读的数据块和刚刚写入的数据块,也就是说IO访问其实是和块高速缓存打交道的(直接IO除外),块高速缓存会适时同步脏的数据页面(如果是同步模式则立刻同步),也就是常说的Unix延迟写,这样会极大提高系统读写的效率。有人或许问,数据不直接写在设备上的话断电的话数据丢失怎么办,只能说,对不起,没办法。

下面介绍三个重要的内核读函数。

(1)__find_get_block().函数__find_get_block()的参数有:block_device描述符地址bdev,块号block和块大小size。函数返回页高速缓存中的块缓冲区对应的缓冲区首部的地址;如果不存在指定的块,就返回NULL.

(2)__getblk().__getblk()其与__find_get_block()接收相同的参数,并返回与缓冲区对应的缓冲区首部的地址。与__find_get_block()不同的是,如果块不存在,__getblk()会分配块设备缓冲区页并返回将要描述块的缓冲区首部的指针。注意,__getblk()返回的块缓冲区不必存有有效数据(因为还没读磁盘)。

struct buffer_head * __getblk(struct block_device *bdev, sector_t block, int size)

{

……

      __find_get_block(bdev, block, size);

……

grow_buffers()

……

}

grow_buffers()这个函数就是将分配的缓冲区加入块高速缓存中,参数与__find_get_block相同。grow_buffers()调用流程如下:grow_buffers---->grow_dev_page--->find_or_create_page在块高速缓存中搜索需要的页,如果需要,就把新的页插入高速缓存--->add_to_page_cache_lru将块缓存加入lru链表--->add_to_page_cache将块缓存加入块高速缓存中.

(3) __bread(). __bread()的参数也与前两个相同,返回与缓冲区对应的缓冲区首部的地址,与__getblk()不同的是,__bread()会从读取相应的磁盘块,并将其填充到缓冲区。

struct buffer_head * __bread(struct block_device *bdev, sector_t block, int size)

{

……

      __getblk(bdev, block, size);

……

__bread_slow(bh);

}

__bread_slow()函数调用submit_bh()函数填充块缓存bh.

从三个函数可以看出来,它们的关系是递进的,第一个函数只负责在块高速缓存中查找,第二个则多了一个分配高速缓存块的操作,最后多了一个从磁盘中读取相应块并填充缓存块的操作。

参考资料:《深入理解linux内核》

最新文章

  1. Bootstrap CDN推荐
  2. struts2标签
  3. volcanol_Linux_ 问题汇总系列_4_Thinkpad_E40_0578MDC_在Fedora 13 Linux(FC13)中如何安装无线网卡驱动
  4. 【转】TestFlight APP测试(IOS如何让上架前给其他人测试)
  5. mybatis 的if else
  6. 一个csrf实例漏洞挖掘带你了解什么是csrf
  7. B2C电子商务网站技术框架
  8. C. Ilya and Sticks
  9. 总结几种C#窗体间通讯的处理方法
  10. javascript里的几种常见的数组方法
  11. 关于NOIP2014“无线网络发射器选址”一题的衍生题目的思考及思维方向
  12. 什么是副作用(Side Effect)
  13. JavaScript Html页面加载完成
  14. [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
  15. Python条件判断 if-else for循环 while循环 break continue
  16. java结合testng,利用yaml做数据源的数据驱动实例
  17. 【HAOI2015】 T1
  18. 逻辑回归(LR)和支持向量机(SVM)的区别和联系
  19. vue-webpack 引入echarts 注意事项
  20. Jack Clark 的几句名言

热门文章

  1. SQL Server 本地时间和UTC时间的相互转换的代码
  2. typecho博客出404页面修改方法
  3. load Event
  4. YY语音从4.0版本开始是基于Qt的开发过程,以及碰到的问题
  5. 软件架构 "4+1" 视图模型
  6. 2015第9周三html5学习0
  7. UESTC_Frozen Rose-Heads CDOJ 791
  8. Min Stack 解答
  9. 今日成长笔记2016-11-18 - 关于java开发
  10. 【转】10个你必须掌握的超酷VI命令技巧