Linux块设备概念篇
基础概念
- 扇区、磁道、磁头、盘面
- 磁盘块
- 页
一个磁盘分为多个盘面,每个盘面包括上下两个面。每个面都可以存储数据,每个盘面又都对应一个读写磁头。盘面中一圈一圈的同心圆为磁道,将磁道划分为若干弧段,每个弧段称为扇区。扇区是磁盘的最基本单位,通常为512字节。
块是文件系统的的抽象,文件系统操作磁盘的最小单位就是块。扇区是磁盘的最小单位,所以块不能比扇区小,只能是数倍于扇区大小。另外,内核还要求块大小为2的整数次幂,并小于页面的大小。所以,块通常为512字节,1KB或4KB。
页是作为MMU映射最小单位,内核是以分页来管理内存的。所以,总结起来:扇区<=块(磁盘块)<=page
读写一次磁盘信息所需要时间可分解为:寻道时间、延迟时间和传输时间。寻道时间是磁头移动到所需磁道所花费的时间,IO寻道时间越短,IO就越快。一般,磁盘的平均寻道时间在10ms。延迟时间是指磁头指向到所需的扇区上所花费的时间,它取决于磁盘的转速。目前,普通硬盘是7200rpm和5400rpm。数据传输时间是指完成数据传输所花费的时间。综上,为了提高磁盘传输效率,应该着重减少寻道时间和延迟时间。
设备分类
- 字符设备
- 块设备
- 网络设备
linux将设备分为三类:字符设备、块设备和网络设备。字符设备只能按顺序访问,不支持随机访问,它是面向流的设备,如鼠标、键盘、串口等。块设备可以从任意位置发起读写,支持随机访问,如磁盘、U盘等。
块设备的层次
linux是支持多种不同存储介质,所以对于每种硬件,在内核空间都适配有块设备驱动程序,来读写块设备。往上是IO调度层,将文件系统的读写请求排序,合并用以提高磁盘读写效率。接着是,通用块层,对应于bio结构,它将一次IO请求进行抽象,描述对应IO操作涉及到的多个页,他们可以是地址不连续的。文章主要是对IO调度层涉及到的调度算法和重要的结构体作介绍。
重要数据结构
- bio
- buffer_struct
缓冲区和缓冲区头
每个缓冲区都对应一个磁盘块,当磁盘块被调入内存时,就存储在缓冲区中。块包含一个或多个扇