对于计算机系统来说,IO到底是个啥玩意。in out,进进出出的是啥呢?

其实这个IO是很多人都没有弄清楚的问题,也是定义很混乱的一个问题。其根本原因就在于一次IO在系统路径的每个层次上都有自己的定义。

计算机系统是由一个一个的层次模块组合而成的,每个模块之间都有各自的接口,而在接口间流动的数据就是IO。那么如何才算“一次”IO呢?以下列举了各个层次上的“一次”IO的定义。

1.应用层。
应用程序向操作系统请求:“读取C:\wuhao.txt
到我的缓冲区”。操作系统读取后返回应用程序一个信号,这次IO就完成了。这就是应用程序做一次IO。

2.文件系统。
文件系统向磁盘控制器驱动程序请求:“读取从LBA10000开始后的128个扇区”,然后“请读取从LBA50000开始的后64扇区”,这就是文件系统向下做的两次IO。这两次IO,假设对应了第一步里那个应用程序的请求。(计算机系统管理的最小单元可不是bit,是扇区)

3.磁盘。
磁盘控制器驱动程序用信号来驱动磁盘控制器向磁盘发送SCSI指令和数据。对于SCSI协议来说,完成一次连续LBA地址扇区的读写就算一次IO。但是为了完成这次读或者写,可能需要发送若干条SCSI指令帧。从最底层来看,每次向磁盘发送一个SCSI帧,就算一次IO,这也是最细粒度的IO。但是通常说磁盘IO都是指完成整个一次SCSI读或者写。
对于磁盘来说,每次IO就是指一次SCSI指令交互回合。一个回合中可能包含了若干SCSI指令,而这一个回合里却只能完成一次IO,比如“读取从LBA1000开始的后128个扇区”。

4.卷管理层,RAID层。
如果在文件系统和磁盘之间再插入一层卷管理层,或在磁盘控制器和磁盘之间再插入一层RAID虚拟化层,那么上层的一次IO就往往会演变成下层的多次IO。