免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: qtdszws

映射的冲突 [复制链接]

论坛徽章:
0
发表于 2007-06-19 19:19 |显示全部楼层
发现在hash_table中的都是metadata块,而属于文件的数据块和设备文件的块的buffer_head都不进入hash_table

因此出现两份拷贝是有可能的:文件系统出错导致文件交叉等

以前总是认为所有的块都进入, 所有我有buffer层这一说,理解错了.

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2007-06-20 11:23 |显示全部楼层
确实有bufferCache这一层呀。

在page的hash表中的page既为pagecache,在buffer_head的hash表中的buffer_head既为bufferCache。

但是在2.4.x版本的kernel中,对buffer_head这个结构的处理变化很大。

以下的讨论中,我们假设memory足够大,大到可以把所有磁盘中的所有内容都cache到memory中来,所有释放cache的过程均不起作用。

2.4.0中,
1)  普通文件的inode->I_mapping中,才有page,这些page全部进入page的hash表,构成了pagecache;而块设备文件的inode->I_mapping为空,没有任何page。

2)pagecache中的page全部关联4个buffer_head,这些buffer_head最终将全部进入
buffer_head的lru链,但是决不会进入buffer_head的hash表,既普通文件的page所关联的buffer_head,绝对不属于buffercache;

3) 在page的lru链中,另有一部分page,它们的(mapping,index)均为空,既所谓的匿名页,这些匿名页只在page的lru链,而不在page的hash表。这些匿名页分两部分,一部分匿名页影射到了0~3G上,swap_out最终会将它们变成有名页,进入swapcache,既进入page的hash表,不考虑;另有一部分匿名页不存在0~3G的影射,永远不会变为有名页,永远不会进入pagecache,他们的存在,只是为了关联4个buffer_head,这4个buffer_head,必须全部都在buffer_head的hash表中。既这部分匿名页所关联的buffer_head,构成了bufferCache。

2.4.32中
1)无论普通文件,还是块设备文件,其inode->I_mapping中,均有page,并且这些page均在pagecache中。既2.4.0没有为块设备文件建立page级的缓存,但是2.4.32建立了。
2)pagecache中的page分为两类,一类是普通文件的page,一类是块设备文件的page。所有这些page全部关联4个buffer_head,但是只有块设备文件的page所关联的buffer_head,才能进入buffer_head的hash表;普通文件的page所关联的buffer_head,依然绝对不能进入buffer_head的hash表。

3)2.4.32中,已经没有了真正的匿名页。所有匿名页最终将全部进入swapcache。


说的不太清楚,简而言之,从所占用内存空间的角度来看:
   2.4.0:buffercache与pagecache是两个不同的内存空间的集合。但是这两个内存集合中,有可能每个集合里边,都有一小块内存影射到了同一小块磁盘上。
   2.4.32:buffercache是块设备文件的inode->i_mapping的的子集,而块设备文件的inode->I_mapping又是pagecache的真子集。这样,在pagecache这个最大的集合中,可能有两个不同的元素,影射到了同一小块磁盘。

论坛徽章:
0
发表于 2007-06-20 11:36 |显示全部楼层
原帖由 塑料袋 于 2007-6-20 11:23 发表于 12楼  
确实有bufferCache这一层呀。

在page的hash表中的page既为pagecache,在buffer_head的hash表中的buffer_head既为bufferCache。

但是在2.4.x版本的kernel中,对buffer_head这个结构的处理变化很大。

以 ...


在2.4.10之前,buffer cache和page cache是分开的,但在此之后buffer page属于page cache的一部份,没有单独的page cache了。

论坛徽章:
0
发表于 2007-06-20 17:22 |显示全部楼层
当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
??

详细的解释?


原帖由 zx_wing 于 2007-6-19 14:38 发表于 6楼  

首先没有所谓的buffer层,其次buffer_head只是把page cache中的page细分成以block为单位。当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需 ...

论坛徽章:
0
发表于 2007-06-20 17:47 |显示全部楼层
塑料袋 2.4.32中
2)...但是只有块设备文件的page所关联的buffer_head,才能进入buffer_head的hash表...

没找到具体的代码,能否指定一下

论坛徽章:
0
发表于 2007-06-20 18:02 |显示全部楼层
原帖由 思一克 于 2007-6-20 17:22 发表于 14楼  
当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
??

详细的解释?



以页为单位是针对page cache这一层来说的。在linux中,只要不是以DIRECT I/O的方式操作文件,都要和page cache打交道。当以文件的形式进行读写时,如果文件没有hole,则当你发起一次读/写操作,即使只有1个字节,kernel也会在page cache中为你分配一个页面,将多余的部分清零。因为read/write首先是和page cache打交道,所以说是以页为单位。
当然,最终的I/O操作还是以segment或sector为单位的。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2007-06-20 18:05 |显示全部楼层
原帖由 思一克 于 2007-6-20 17:22 发表于 14楼  
当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
??

详细的解释?




写一个page的最一般化,理想化的过程:

1) 写了page后,置PG_Dirty

2) 将page关联的buffer_head置bh_dirty后,清PG_Dirty

3) 由bdflush启动写磁盘,或者进程自己直接submit_bh


表现在kernel中,经常省略了置PG_Dirty这一步,写有两种形式。

1)sys_write:根本不置PG_Dirty,直接找到/分配buffer_head,将buffer_head记bh_dirty,然后由bdflush启动写磁盘。

2)sys_mmap2:影射后,swap_out已经将page记PG_Dirty。

                 kswapd直接就清了PG_Dirty,然后又根sys_write一样,找到/分配buffer_head,将buffer_head记做bh_dirty,不同的是然后直接由submit_bh启动写。



不管有洞没洞,所影响的只是找到/分配buffer_head的过程,不影响其他。

论坛徽章:
0
发表于 2007-06-20 18:08 |显示全部楼层
原帖由 塑料袋 于 2007-6-20 18:05 发表于 17楼  



写一个page的最一般化,理想化的过程:

1) 写了page后,置PG_Dirty

2) 将page关联的buffer_head置bh_dirty后,清PG_Dirty

3) 由bdflush启动写磁盘,或者进程自己直接submit_bh


表现在kerne ...

这是块设备的情况,以regular file操作的读写不需要buffer_head的

论坛徽章:
0
发表于 2007-06-20 18:10 |显示全部楼层
原帖由 塑料袋 于 2007-6-20 18:05 发表于 17楼  



写一个page的最一般化,理想化的过程:

1) 写了page后,置PG_Dirty

2) 将page关联的buffer_head置bh_dirty后,清PG_Dirty

3) 由bdflush启动写磁盘,或者进程自己直接submit_bh


表现在kerne ...

bdflush ??? 看来兄弟确实用的是2.4内核

论坛徽章:
0
发表于 2007-06-20 18:58 |显示全部楼层
我是问
"则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP