BIO

 部分转自http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=30282771&id=5144166

 

 

一个BIO所请求的数据在块设备中是连续的,对于不连续的数据块需要放到多个BIO中。
一个BIO所携带的数据大小是有上限的,该上限值由bi_max_vecs间接指定,超过上限的数据块必须放到多个BIO中。


bio_vec
里面的数据肯定是至少扇区对齐的,比如扇区是512,那么offsetlen至少是512对齐的。我们平常遇到的绝大多数情况都是off=0len=4K,因为文件系统层有缓冲、有预读。

 

struct bio_vec {

structpage    *bv_page; /* 在内存中的page实例 */

unsigned int    bv_len; /* 该向量元素关联的数据长度,最大为一个page */

   unsigned int    bv_offset;/* 该向量元素关联的数据在page中的偏移 */

};

 

数组个数由bi_vcnt指定,而bi_idx则表示当前处理的vec索引,因此根据而且即可跟踪该BIO的处理进度。
每个vec对应一个page,它所描述的数据长度由bv_len指定,而bv_offset则用来说明数据块在page中的偏移。

 

1)为什么需要bv_offsetbv_len呢?(我们假定以下的讨论中page size都为4K,当然对于其他的page size,道理是一样的)
   
我们知道对于块设备来说,它处理数据的最小单位是扇区,而不同介质的扇区大小也是不同的,定义bv_offsetbv_len就是为了将数据块的粒度切分到扇区大小。例如机械硬盘,它的扇区大小为512,所以为了描述一个扇区,bv_len必须设置为512,而bv_offset可以为0/512/1024等等,总之是512的倍数且不超过一个page,也就是说bv_lenbv_offset必须是扇区对齐的。
2
)在用户态操作一个块设备的时候不是也能读写几个字节?
   
其实这涉及到文件的cache操作,当从应用层下发几字节的读请求时,文件系统会向块设备下发4k甚至更多的读请求,待块设备返回后,将返回的数据缓存到内存中,并向应用层返回请求的数据,这也是常说的buffer-IO模式;对于另一种模式dircet-IO,是不能读写几个字节的,它请求的数据必须是扇区对齐的。

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值