linux块I/O层

块I/O层:内核子系统,用于管理块设备的IO操作。
块设备:随机访问固定大小数据片(块)的设备,如硬盘,对应字符设备(按字符流有序访问,仅需控制当前位置)。
扇区(设备物理属性,设备寻址最小单位) 块(文件系统访问最小单位) 页(内存管理最小单位)
驱动程序以上,没有扇区这个概念。
(块)缓冲区:内存页上的一部分区域,存放块读入内存后的数据。
buffer_head: 描述块设备的哪个块存放在哪个内存页的哪块区域里,表达一种映射关系。
io操作: 不方便直接使用buffer_head,1 buffer_head重,含io操作不需要的信息,内核更倾向操作页面结构。2 大块数据读取按buffer_head拆分,造成负担且空间浪费
考虑用bio结构体作为块(设备)io操作的容器,即一个bio就是一个块 io操作。
bio:多个segment,每个segment是内存页一块区域。一个segment可含1至多个缓冲区。
块io操作其实就是访问块设备上一连续区域(物理位置相邻的块/扇区,但这些块内存中不必连续)
块设备的请求队列:含request,高层代码(如文件系统)放入,设备驱动取出
request同样对应访问块设备上一连续区域,可含一至多个bio,io合并(若有些bio读取的磁盘位置是连续的,一个bio的结尾刚好是下一个bio的开头,可放入一个请求内)

I/O调度程序:管理请求队列,负责提交I/O请求(到磁盘)的子系统
缩短寻址时间,提高性能,合并与排序(按扇区增长方向)预操作。
linus电梯:已被取代,作为例子
1 检查队列所有请求,看是否可以合并(向前或向后)
2 队列存在驻留很长的请求,新请求插入队尾(并没有实际解决饥饿,只是这个新请求不加剧饥饿)
3 以扇区增长方向存在插入位置,插入那个位置
4 队尾

四种I/O调度程序:
deadline: 解决linus电梯的饥饿问题(1 位置上的饥饿 2 写-饥饿-读,读请求一般应用程序会阻塞等待数据,所以需快速响应读请求,且读请求多相互依靠,读取到数据后再发出下一个读请求)
读fifo队列(按请求加入时间),写fifo队列(按请求加入时间),排序队列(按扇区增长方向),派发队列
新请求加入排序队列和其中一个fifo队列,一般从排序队列头取出请求,推入派发队列再提交给驱动
fifo队列:头部请求超时,请求从fifo队列进入后续流程。默认:读超时时间短,500ms, 写5s

预测:适用写操作频繁,基于启发和统计来预测
问题:来了一个读请求,超时得到处理,应用解除阻塞发下一个读请求(相邻位置),继续超时得到处理。对于应用来说很慢,对于磁盘来说每处理一次读请求就做一次很远的寻址
在deadline的基础上,响应读请求后,不立即返回处理剩余请求(不移动磁头,避免二次寻址),等待一会(6ms),应用很可能在这空隙发下一读请求(相邻位置),立刻处理

完全公正的排队I/O调度程序:cfq, 为专有工作负荷设计,每个发起io请求的进程一个队列,队列内依然有合并和排序, 时间片轮转调度,每个队列选几个(4), 然后下一轮,提供进程级公平

空操作:有合并无排序,fifo,某些块设备寻址开销小,没必要排序

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值