Linux高速缓存详解(二)

[高速缓存的写操作]
对高速缓存的写操作,主要来自于其它函数对高速缓存的使用。写操作的使用方式很多,例如在inode.c的write_node函数。write_node函数在调用是需要传递一个指向inode节点的指针,并且设置好这个i节点的对应的设备号和节点号。write_node函数的作用是将一个i节点的信息写入设备中(其实是写入高速缓存中)。这里摘抄部分与高速缓存相关的部分
                        if  (!(sb=get_super(inode->i_dev)))
                                panic(  "trying to write inode without device"  );
              
                block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
                                (inode->i_num-1)/INODES_PER_BLOCK;
                 
                  if  (!(bh=bread(inode->i_dev,block)))
                                panic(  "unable to read i-node block"  );
      /*前面部分是得到了i节点所在逻辑块的高速缓存,bh指向这个高速缓存头*/
                ((  struct  d_inode *)bh->b_data)
                                [(inode->i_num-1)%INODES_PER_BLOCK] =
                                                *(  struct  d_inode *)inode;
              
                bh->b_dirt=1;
                inode->i_dirt=0;
                brelse(bh);
对高速缓存进行写操作的部分为 ((   struct  d_inode *)bh->b_data) [(inode->i_num-1)%INODES_PER_BLOCK] =  *(   struct  d_inode *)inode;
由于之前读入高速缓存的数据是i节点所在的逻辑块的整块数据,而这个逻辑块是由许多的设备i节点组成的。因此可以将这个逻辑块的数据看成设备上i节点的数组。所以(struct d_inode*)bd->b_data,将缓存数据块当作设备i节点数组来了解。inode->i_num%INODES_PER_BLOCK,根据i节点号计算这个i节点在设备i节点数组上的索引。最后 ((  struct  d_inode *)bh->b_data) [(inode->i_num-1)%INODES_PER_BLOCK] =  *(  struct  d_inode *)inode;将i节点数据写入了缓存中。在对缓存写操作结束之后,bh->b_dirt=1设置缓存信息,表明缓存中数据被修改,其它进程如果需要使用这个缓存,就需要先把数据同步到设备中。brelse(bh)在缓存使用结束后释放缓存,在后面将会介绍这个函数的代码实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值