免费注册 查看新帖 |

Chinaunix

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

[内核入门] 如何保证文件缓冲区与磁盘内容一致? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-22 19:38 |只看该作者 |倒序浏览
代码太多,一时半会看不懂,所以先请问一下思路。

先看以下几行代码:
buffer_uptodate(bh)

#define buffer_uptodate(bh)        __buffer_state(bh,Uptodate)
#define __buffer_state(bh, state)        (((bh)->b_state & (1UL << BH_##state)) != 0)

可见,内存中的数据块是否最新,是通过BH_Uptodate标志判断的。
请问BH_Uptodate的赋值,是驱动程序负责吗?驱动程序中写磁盘的接口,会检查所写数据块是否在内存缓存了一份,如果是,就修改对应的buffer_head的BH_Uptodate标志吗?这样的话,由于这些bh是定义在内核的,岂不是要底层的程序(驱动)知道上层程序(内核)定义的变量?
如果不是驱动负责,那就得内核自己轮循检查,这样就存在2个问题:①不能及时知道缓存的数据块与磁盘不一致了;②需要对比数据才能知道是否一致,并且即使没有修改也要轮循的做“无谓”的对比操作。所以感觉不太可能。

想请教一下,这个过程到底是怎样的?

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
2 [报告]
发表于 2015-12-22 21:18 |只看该作者
BH_Uptodate由具体fs决定,抛开partition的读写访问,常规的以page为单位的读写,BH_Uptodate还是很容易理解的。
只要保证cache中数据是新的,就可以设置update位的,如一个对齐的4K写操作,那么不用感知磁盘上是啥数据,它是直接设置update标示的。读大体也差不多。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
3 [报告]
发表于 2015-12-23 09:46 |只看该作者
本帖最后由 _nosay 于 2015-12-23 09:51 编辑
镇水铁牛 发表于 2015-12-22 21:18
BH_Uptodate由具体fs决定,抛开partition的读写访问,常规的以page为单位的读写,BH_Uptodate还是很容易理解 ...



拿从交换分区换入的page来说,好像只有内存的数据被修改了,才认为该page脏了,不用考虑因磁盘内容修改而导致变脏。猜测可能是因为既然磁盘的这块区域用途交换分区了,那么很容易保证不可以从磁盘方面去修改这块数据。但普通的文件不行呀,无法预测什么时候用vi之类的编辑保存一下,也就是说,无法限制内存数据被修改,也无法限制磁盘数据被修改,而不管哪种情况都会导致两份数据不一致。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
4 [报告]
发表于 2015-12-23 10:10 |只看该作者
本帖最后由 _nosay 于 2015-12-23 10:27 编辑

#define BH_Uptodate       0       /* 1 if the buffer contains valid data */
#define BH_Dirty             1       /* 1 if the buffer is dirty */

BH_Uptodate与BH_Dirty区别是什么?是不是“BH_Uptodate、BH_Dirty都可以表示内存与磁盘的数据不一致,但BH_Uptodate表示的不一致,是由于磁盘数据的修改导致的,而BH_Dirty表示的不一致,是由于内存数据的修改导致的”?

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
5 [报告]
发表于 2015-12-23 20:59 |只看该作者
BH_Uptodate与BH_Dirty区别是什么?互不影响,dirty不一定就是update,update不一定就是dirty。只是说只要是update,那么就不要访问磁盘,数据可以直接返回,dirty说明数据必须刷盘

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
6 [报告]
发表于 2015-12-24 08:22 |只看该作者
镇水铁牛 发表于 2015-12-23 20:59
BH_Uptodate与BH_Dirty区别是什么?互不影响,dirty不一定就是update,update不一定就是dirty。只是说只要是 ...


噢,那为什么要用2个位,只需要1个位,0/1表示刷盘/不刷盘,不就可以了?

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
7 [报告]
发表于 2015-12-24 09:21 |只看该作者
BH_Uptodate与BH_Dirty可以同时成立的,而且含义不同,两个bit是必要的。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
8 [报告]
发表于 2015-12-24 09:46 |只看该作者
镇水铁牛 发表于 2015-12-24 09:21
BH_Uptodate与BH_Dirty可以同时成立的,而且含义不同,两个bit是必要的。


噢,我再继续看看书再找你问。那修改BH_Uptodate或BH_Dirty,确定是驱动程序负责吗?是不是内核在启动驱动程序时,把内核变量的地址传给驱动(比如buffer_header结构的链表头),驱动写了某个数据块时,就从这个链表头找到对应的bh,然后修改BH_Uptodate?

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
9 [报告]
发表于 2015-12-24 22:38 |只看该作者
修改BH_Uptodate或BH_Dirty是由具体的FS决定的,文件offset-->page index-->bio-->bh的关系你需要理解。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
10 [报告]
发表于 2015-12-25 09:20 |只看该作者
回复 9# 镇水铁牛

  好的。


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP