分类: LINUX
2009-09-29 17:07:50
磁盘缓冲区中的dirty和update标志的作用
struct bufferhead* bh
bh是一个磁盘缓冲区中的一个缓冲块的头,记录着缓冲块的使用情况
struct {
char * b_data; //指向一个1024bytes的缓冲块
unsigned long b_blocknr; //块的数量?
unsigned short b_dev; //设备号,=-1就说明这块空闲
unsigned char b_uptodate;//有没有更新
unsigned char b_dirt; // 0-清洁,1-脏
unsigned char b_count; //记录当前有几个用户在使用这个块
unsigned char b_lock; //0 – 没上锁, 1 –已上锁
struct * b_wait;
struct * b_prev;
struct * b_next;
struct * b_prev_free;
struct * b_next_free;
};
这是主要是讲 bh->b_uptodate和 bh->b_dirt标志,
bh->b_dirty
首先说一下缓冲区中的数据是怎么来的,顾名思义,磁盘缓冲区就是内存当中的一块区域,这块区域对应着硬盘当中的一块数据。当用户要操作磁盘上的数据时就会把磁盘中的数据读到内存的磁盘缓冲区中相应的位置。然后再进行读写操作。
这个标志是用来指示缓冲块中的数据有没有被修改过,这里说的修改是对于这个缓冲块在设备上对应的盘块来说的。因此修改了缓冲区中的数据后,缓冲区的数据就会和其对应的盘块上数据不同,这时候就置上 bh->b_dirty标志位。其字面意思就是你把这块数据弄脏了。那么这个标志位有什么做用呢?下面举几个例子:
1. 当有写盘操作时,就是要把这个缓冲块中的数据写磁盘上去。这时就会判断这块数据自从读到磁盘缓冲区中后有没有被修改过。也就是 bh->b_dirty有没有被置位,如果没有被置位,就不必写盘,节省了资源时间。
2. 在获取磁盘缓冲区的时候,如果找不到空闲的缓冲块(所有的缓冲块的
bh->b_dev都小于0),就会去寻找b_dev >0,的缓冲块,然后跟 bh->b_dirty,
bh->b_uptodate等标志判断,选一个最优的缓冲块。当然如果被选中的缓冲块的
bh->b_dirty标志被置位,那就要先把这个缓冲块写盘。
3. 当然,只要缓冲块中的数据被写盘了,写盘的函数会把 bh->b_dirty复位
bh->b_uptodate
如果你是从上面一直看下来的话,我就不必多说一些重复的话。 bh->b_uptodate就是更新标志,什么叫更新,这是针对磁盘上的数据来说的,举个例子,磁盘上的数据原为1,现在改成了2这就是更新了。现在不用我说你也明白,磁盘上的数据什么时候会更新,当然是有写盘操作成功的时候。也是说每次把缓冲区中的数据写磁盘上时,写盘的函数都会把 bh->b_uptodate置位。下面。下面也举个例子来说明
bh->b_uptodate的作用:
1. 当有读盘操作的时候,就是把磁盘上的数据读到相应的磁盘缓冲区中时,如果 bh->b_uptodate置位,就是说明磁盘上的数据和其对应的缓冲块上的数据是一样的,这时读盘函数就会返回,节约资源和时间
2. 这个和上面b_dirty是一样的
3. 这个和上面b_dirty是一样的
最后注明一下:
在new_block ()调用时会把bh->b_uptodate和 bh->b_dirt标志位置位,一切更改该缓冲块的函数都会使bh->b_dirt置位
当free_block()调用时会把bh->b_uptodate和 bh->b_dirt标志位复位
(本文完 转载请注明出处http://blog.chinaunix.net/u3/104431/showart.php?id=2062689)