Linux内核设计与实现 - 第14章 块I/O层

目录

    • [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. 请求队列处理流程

  1. bio提交到块I/O层
  2. 合并到现有request或创建新request
  3. 进入I/O调度队列
  4. 驱动处理request
  5. 完成中断处理
  6. 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
相关推荐
xcLeigh9 分钟前
KES运维自动化与脚本体系实战
运维·数据库·自动化·脚本·数据迁移·kes
七夜zippoe10 分钟前
OpenClaw 实战案例:数据分析平台构建
服务器·网络·数据分析·openclaw·平台构建
luj_176812 分钟前
草酸与烟酸对消化及糖代谢的影响解析
服务器·c语言·开发语言·经验分享·算法
潘正翔14 分钟前
docker基础_镜像使用
linux·运维·服务器·docker·容器·centos·devops
勉灬之31 分钟前
利用双网卡服务器搭建 Verdaccio 中转,解决内网 npm 依赖下载问题
运维·服务器·npm
24计网1王仔寿38 分钟前
Linux运维与云计算全栈系统化学习指南(Shell+虚拟化+OpenStack+Docker+公私云实战)
linux·课程设计·数据库开发·微信公众平台·neo4j·命令模式·sequoiadb
江湖有缘44 分钟前
Lunalytics部署指南:使用Docker快速搭建私有监控面板
运维·docker·容器
DB哥讲数据库1 小时前
rocky linux安装教程:VMware虚拟机图文讲解部署Rocky Linux 9(附镜像包)
linux·运维·服务器
未*望1 小时前
【Linux入坑(二)—全志T133开发板适配USB-电容屏触摸屏驱动(多点触控) 】
linux·运维·服务器
懒鸟一枚1 小时前
为什么 useradd -rs /bin/false service 创建的用户无法用 su 切换?
linux·服务器·数据库