《Linux内核设计与实现》读书笔记—块IO层

本文详细介绍了Linux内核中块设备的管理,包括块设备与字符设备的区别,块设备的最小寻址单位——扇区,以及内核中的块IO层。重点讲解了缓冲区和缓冲区头的概念,bio结构体在块IO操作中的作用,请求队列的管理和IO调度程序的工作原理,如Linus电梯调度、最终期限调度和预测IO调度。这些内容揭示了Linux如何高效地处理磁盘IO操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

块设备

  • 设备文件通常分为两大类型:块设备和字符设备。块设备指的是可以随机访问固定大小数据片的硬件设备,例如硬盘,软盘,闪存等。字符设备指的是以字符流方式被访问的硬件设备,比如键盘,串口和网卡。
  • 块设备的管理要比字符设备细致复杂得多,因为字符设备仅仅需要控制一个位置—当前位置,而块设备访问的位置可以在介质的不同区间前后移动。所以内核提供了一个专门的子系统来管理块设备,被称为块IO层。
  • 块设备中最小的可寻址单元是扇区,扇区大小一般是2的整数倍,比如最常见的大小为512字节。扇区的大小是设备的物理属性,块设备无法对比扇区还小的单元进行寻址和操作。
  • 块是文件系统的一种抽象,内核执行的所有磁盘操作都是按照块进行的。由于扇区是设备的最小可寻址单元,所以块不可能比扇区还小,同时内核要求块大小是2的整数倍,且不能超过一个页的长度。

缓冲区和缓冲区头

  • 当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于磁盘块在内存中的表示。
  • 每个缓冲区都有一个对应的描述符,存储缓冲区相关的控制信息和缓冲区到物理内存的映射关系,该描述符用buffer_head结构体表示,称作缓冲区头。
  • b_state域表示缓冲区的状态,b_count域表示了缓冲区的引用计数,与该缓冲区对应的磁盘物理块由b_blocknr域索引,其值为b_bdev域指明的块设备中的逻辑块号。
  • 与缓冲区对应的内存物理页为b_page域,b_data域直接指向对应的块,块的大小由b_size域表示。

bio结构体

  • 内核为块IO操作引入了一种新型的,灵活的,轻量级容器,即bio结构体。该结构体表示了正在现场的(活动的)以片段(segment)链表形式组织的块io操作。
  • 一个片段就是一小块连续的内存缓冲区,这样使得即使一个缓冲区的数据分散在多个离散的内存上,bio结构体也能对内核保证IO操作的执行。
  • bio结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值