免费注册 查看新帖 |

Chinaunix

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

关于缓冲区的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-11 15:24 |只看该作者 |倒序浏览
我刚看linux内核的书,现在在看《Linux Kernel development》。
可能问的太幼稚,希望大家见谅。

在13章的块I/O层,前面说一个缓冲区对应一个磁盘块。按照buffer_head里的*b_page指针对应的struct page结构,也就是说一个缓冲区是b_page指向的内存页的(b-data,b_data+b_size)连续区域。后面又出现bio结构体,说有了segment来描述缓冲区,就不需要保证单个缓冲区一定要连续。
我的问题是:既然按照前面buffer_head表示的缓冲区时连续的,后面为什么要说“不需要保证单个缓冲区一定要连续”?而一个bio_vec结构正好可以表示一个缓冲区。这到底是什么回事,真是搞糊涂了。

论坛徽章:
0
2 [报告]
发表于 2007-11-11 17:28 |只看该作者

回复 #1 shenyan008 的帖子

连续是指数据在磁盘上连续, 不连续是指缓冲磁盘数据的内存可以不连续。

论坛徽章:
0
3 [报告]
发表于 2007-11-11 22:25 |只看该作者
原帖由 daemeon 于 2007-11-11 17:28 发表
连续是指数据在磁盘上连续, 不连续是指缓冲磁盘数据的内存可以不连续。

但缓冲对应的内存页内(b_data,b_data+b_size)是连续的。并没有不连续的块缓冲。
因为缓冲对应一个磁盘数据块,小于一个页,可以连续的在一个页内表示。

论坛徽章:
0
4 [报告]
发表于 2007-11-12 10:20 |只看该作者
原帖由 shenyan008 于 2007-11-11 22:25 发表

但缓冲对应的内存页内(b_data,b_data+b_size)是连续的。并没有不连续的块缓冲。
因为缓冲对应一个磁盘数据块,小于一个页,可以连续的在一个页内表示。

并非所有的文件系统都分配连续的sector来存放文件,并且在unix操作系统(以及类unix操作系统)中存在着file hole这个概念,即文件的一部分全部是空字符。在这些情况下,一个buffer page里面的block可能是不连续的。但由于DMA操作要求在一次DMA操作中的内存区域是连续的(注意scatter-gather DMA不过是把不连续的内存区域分成几次做了,每次DMA操作的内存还是连续的),所以内核不能以页为DMA的单位,这就引出了segment的概念,它表示一组连续的block。它们的关系可以参考下图:

block.jpg (61.52 KB, 下载次数: 31)

block.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP