_nosay 发表于 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个问题:①不能及时知道缓存的数据块与磁盘不一致了;②需要对比数据才能知道是否一致,并且即使没有修改也要轮循的做“无谓”的对比操作。所以感觉不太可能。

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

镇水铁牛 发表于 2015-12-22 21:18

BH_Uptodate由具体fs决定,抛开partition的读写访问,常规的以page为单位的读写,BH_Uptodate还是很容易理解的。
只要保证cache中数据是新的,就可以设置update位的,如一个对齐的4K写操作,那么不用感知磁盘上是啥数据,它是直接设置update标示的。读大体也差不多。

_nosay 发表于 2015-12-23 09:46

本帖最后由 _nosay 于 2015-12-23 09:51 编辑

镇水铁牛 发表于 2015-12-22 21:18 static/image/common/back.gif
BH_Uptodate由具体fs决定,抛开partition的读写访问,常规的以page为单位的读写,BH_Uptodate还是很容易理解 ...

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

_nosay 发表于 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表示的不一致,是由于内存数据的修改导致的”?

镇水铁牛 发表于 2015-12-23 20:59

BH_Uptodate与BH_Dirty区别是什么?互不影响,dirty不一定就是update,update不一定就是dirty。只是说只要是update,那么就不要访问磁盘,数据可以直接返回,dirty说明数据必须刷盘

_nosay 发表于 2015-12-24 08:22

镇水铁牛 发表于 2015-12-23 20:59 static/image/common/back.gif
BH_Uptodate与BH_Dirty区别是什么?互不影响,dirty不一定就是update,update不一定就是dirty。只是说只要是 ...

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

镇水铁牛 发表于 2015-12-24 09:21

BH_Uptodate与BH_Dirty可以同时成立的,而且含义不同,两个bit是必要的。

_nosay 发表于 2015-12-24 09:46

镇水铁牛 发表于 2015-12-24 09:21 static/image/common/back.gif
BH_Uptodate与BH_Dirty可以同时成立的,而且含义不同,两个bit是必要的。

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

镇水铁牛 发表于 2015-12-24 22:38

修改BH_Uptodate或BH_Dirty是由具体的FS决定的,文件offset-->page index-->bio-->bh的关系你需要理解。

_nosay 发表于 2015-12-25 09:20

回复 9# 镇水铁牛

{:yxh22:}好的。


   
页: [1]
查看完整版本: 如何保证文件缓冲区与磁盘内容一致?