深入浅出块I/O子系统(一)概述

块设备(Block Device)是支持以固定长度的块为单位读/写数据的存储设备的统称。块设备通常是支持随机访问和寻道的硬件设备,如磁盘、软盘、CDROM、内存区域等,或者是基于其他块设备之上的逻辑设备,如分区、MD、DeviceMapper等。

Linux内核中负责提交对块设备I/O请求的子系统被称为块I/O子系统,也被称为Linux块层。块I/O子系统可以被分为下面三层:

                                                        Linux块I/O子系统的分层架构

通用块层(Generic Block Layer)为各种类型的块设备建立了一个统一的模型。通用块层的主要工作是:接收上层发出的磁盘请求,并最终发出I/O请求。该层隐藏了底层硬件块设备的特性,为块设备提供了一个通用的抽象视图。 

I/O调度层:接收通用块层发出的I/O请求,缓存请求并试图合并相邻的请求(如果这两个请求的数据在磁盘上是相邻的),并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的I/O请求。为了优化寻址操作,内核既不会简单地按请求接收次序,也不会立即将其提交给磁盘。相反,它会在提交前,先执行名为“合并与排序”的预操作,这种预操作可以极大地提高系统的整体性能。(合并与排序I/O请求

块设备驱动层:具体I/O的处理交给块设备驱动层来完成,视块设备类型不同。对于大多数逻辑块设备,块设备驱动可能是一个纯粹的软件层,并不需要和硬件直接打交道,只是机械地重定向I/O。对于SCSI块设备,其块设备驱动即SCSI磁盘驱动,为SCSI子系统的高层驱动,从而将块I/O子系统和SCSI子系统联系了起来。

块I/O子系统的一般I/O处理流程是:上层调用通用块层提供的接口向块I/O子系统提交I/O请求,这些请求首先被放入I/O调度层的调度队列,经过合并和排序,最终将转换后的I/O请求派发到具体块设备的等待队列,由后者的驱动进一步处理。

这个过程涉及两种形式的I/O请求:

1.一种是通用块层I/O请求,即上层提交的I/O请求,在Linux内核中以bio结构描述;

2.另一种是块设备驱动层I/O请求,即经I/O调度层转换后的I/O请求,在Linux内核中以request描述。为叙述方便,我们有时都用“请求”来表达,但具体的含义因上下文有所不同。

I/O,简单地讲,就是将数据从磁盘读进内存,或者从内存写入磁盘。但是,为提升系统性能,块I/O子系统采用了聚散I/O(scatter/gather I/O)这样一种机制:将对磁盘上连续,但内存中不连续的数据访问由单次操作即可完成。也就是说,

分散读(scatter-read):在单次操作中,从磁盘的连续扇区中的数据读取到几个物理上不连续的内存缓冲区;

聚集写(gather-write):将几个物理上不连续的内存缓冲区中的数据写到磁盘上的连续扇区。

上层向通用块层提交的I/O请求是基于聚散I/O的,它包含多个“请求段(segment)”,一个“请求段”是一段连续的内存区域,其中包含了和其他“请求段”处于连续磁盘扇区的数据。

块I/O子系统的代码主要位于block/目录下。块I/O子系统的主要功能是:

1.在内存中构建通用磁盘、分区和块设备之间的关系;

2.向上层提供I/O请求API,并实现I/O调度,将请求派发到具体块设备的请求队列执行;

3.提供请求完成的下半部处理API,直至最终调用上层的请求完成回调函数结束I/O。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux技术芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值