目录
-
- [1. 块设备基本概念](#1. 块设备基本概念)
- [2. 块I/O层架构](#2. 块I/O层架构)
- [3. 核心数据结构](#3. 核心数据结构)
-
- [3.1 bio结构体](#3.1 bio结构体)
- [3.2 request结构体](#3.2 request结构体)
- [4. I/O调度算法](#4. I/O调度算法)
- [5. 请求队列处理流程](#5. 请求队列处理流程)
- [6. 性能优化技术](#6. 性能优化技术)
- [7. 实验:跟踪块I/O请求](#7. 实验:跟踪块I/O请求)

1. 块设备基本概念
- 定义:以固定大小数据块为单位进行寻址和访问的设备
- 典型设备:硬盘、SSD、CD-ROM等
- 与字符设备区别 :
- 可随机访问
- 通常需要缓冲
- 支持复杂的I/O调度
2. 块I/O层架构
用户空间 VFS 文件系统 块I/O层 I/O调度层 设备驱动 物理设备
3. 核心数据结构
3.1 bio结构体
c
struct bio {
struct bio *bi_next; // 请求链表
struct block_device *bi_bdev; // 关联的块设备
unsigned long bi_flags; // 状态和命令标志
struct bvec_iter bi_iter; // 当前处理位置
struct bio_vec *bi_io_vec; // bio向量数组
unsigned short bi_vcnt; // bio向量数量
// ...
};
3.2 request结构体
c
struct request {
struct list_head queuelist; // 请求队列链表
struct request_queue *q; // 所属请求队列
struct bio *bio; // 关联的bio
struct bio *biotail; // 最后一个bio
// ...
};
4. I/O调度算法
算法名称 | 特点 | 适用场景 |
---|---|---|
Noop | 简单FIFO队列 | SSD设备 |
CFQ | 公平队列,时间片轮转 | 桌面系统 |
Deadline | 读写请求分离,保证延迟 | 数据库系统 |
Anticipatory | 预测性调度,减少磁头移动 | 传统机械硬盘 |
5. 请求队列处理流程
- bio提交到块I/O层
- 合并到现有request或创建新request
- 进入I/O调度队列
- 驱动处理request
- 完成中断处理
- bio完成回调
6. 性能优化技术
- 请求合并:前后相邻请求合并
- 预读机制:预测性读取后续数据
- 写回缓存:延迟写入提升吞吐量
- 多队列(blk-mq):现代SSD优化技术
7. 实验:跟踪块I/O请求
bash
# 使用blktrace工具
blktrace -d /dev/sda -o trace
blkparse -i trace.blktrace.* > output.txt
# 查看调度器
cat /sys/block/sda/queue/scheduler