Storage, Networks and Other I/O Topics¶
约 2820 个字 7 张图片 预计阅读时间 10 分钟
引入¶
I/O 操作是计算机系统中的一个重要组成部分,它是计算机与外部设备之间的数据传输。
I/O 设备的设计需要考虑许多方面,包括:
- 可拓展性
- 可靠性
- 性能
- 适应性
I/O 的性能主要由以下几个方面决定:
- 设备和系统之间的连接
- 内存层次架构
- 操作系统

每一个 I/O 设备都有一个对应的控制器,负责管理设备的操作。控制器通过总线(bus)与 CPU 进行通信,从而实现 I/O 设备与 CPU 的交互。
IO 的行为有输入(input)和输出(output),或者存储(storage)。
- Input: 从设备到主存,read once;
- Output: 从主存到设备,write only;
- Storage: can be reread and usually rewritten
如何评价一个 I/O 设备的性能主要取决于它的具体用途
Throughput
这里的吞吐量可以指单位时间传输的数据量,也可以指单位时间进行的 I/O 的操作的数量
Response time
响应时间,其实就是进行一次 I/O 操作所需的时间
both throughput and response time
同时考虑上面两个因素
硬盘的结构¶
硬盘(Hard Disk Drive, HDD)是计算机中常见的存储设备之一。它由多个盘片(platter)组成,这些盘片通过主轴(spindle)固定在一起,并且可以高速旋转。每个盘片的两面都覆盖有磁性材料,用于存储数据。
硬盘的主要组成部分包括:
- 盘片(Platter):硬盘内部的圆形磁盘,用于存储数据。盘片的数量可以有多个,通常为2到5个。每一个盘上都有很多同心圆,这些同心圆称为磁道(track),每一个磁道被划分为多个扇区(sector)。扇区是硬盘存储数据的最小单位。
- 主轴(Spindle):用于固定和旋转盘片的轴。主轴电机驱动盘片旋转,通常转速为5400 RPM(转每分钟)到7200 RPM,高性能硬盘可以达到10000 RPM甚至15000 RPM。
- 磁头(Read/Write Head):用于读取和写入数据的部件。每个盘片的两面都有一个磁头,磁头通过悬臂(actuator arm)固定在一起,并由伺服电机(servo motor)控制其移动。
- 悬臂(Actuator Arm):连接磁头并控制其在盘片表面上的移动。悬臂的移动由伺服电机驱动,可以在盘片的半径方向上移动,以便磁头能够访问盘片上的不同位置。
- 控制电路(Controller Circuit):硬盘内部的电路板,用于控制硬盘的读写操作、数据传输和错误校正等功能。
硬盘的工作原理如下:
- 当计算机需要读取或写入数据时,硬盘控制器会将相应的指令发送给硬盘。
- 主轴电机驱动盘片高速旋转,磁头在悬臂的控制下移动到指定的轨道(track)位置。
- 磁头通过感应盘片表面的磁性变化来读取数据,或通过改变盘片表面的磁性来写入数据。
- 读取或写入的数据通过控制电路传输到计算机的主存或其他设备。
硬盘的性能主要由以下几个方面决定:
- 转速(RPM):盘片的旋转速度,转速越高,数据访问速度越快。
- 磁头寻道时间(Seek Time):磁头移动到目标轨道所需的时间,寻道时间越短,数据访问速度越快。
- 数据传输率(Data Transfer Rate):硬盘与计算机之间的数据传输速度,传输率越高,数据访问速度越快。
- 缓存(Cache):硬盘内部的高速缓存,用于临时存储数据,提高数据传输效率。
硬盘的优点包括容量大、价格低廉、数据保存时间长等,但其缺点是速度较慢、易受震动影响、功耗较高等。

硬盘可靠性指标
- MTTF: Mean Time To Failure, 平均无故障时间,即两次故障之间的平均时间
- MTTR: Mean Time To Repair, 平均修复时间,即两次故障之间的平均修复时间
- MTBF: Mean Time Between Failure, 平均故障间隔时间,即两次可用时间之间的平均时间(MTTF+MTTR)
- Availability: 可用性,即硬盘在正常工作状态下的时间占总时间的比例(MTBF/(MTBF+MTTR))
- AFR: Annualized Failure Rate, 年化故障率,即硬盘在一年内的故障率,AFR=YEAR/MTTF
提升MTTF(平均无故障时间)的方法包括:
- Fault avoidance
- Fault tolerance
- Fault forecasting
Reliability of N disks = Reliability of 1 disk / N
硬盘的可靠性随着硬盘数量的增加而降低,这是因为每个硬盘都有可能发生故障.
RAID¶
RAID(Redundant Array of Inexpensive Disks,廉价磁盘冗余阵列)是一种将多个独立的物理硬盘组合成一个逻辑单元,以提高数据存储性能、可靠性和容量的技术。RAID有多个级别,每个级别都有不同的特点和应用场景。
RAID 0¶
RAID 0通过将数据条带化(striping)分布在多个磁盘上来提高性能。RAID 0没有冗余,因此数据的可靠性较低。如果其中一个磁盘发生故障,所有数据将会丢失。
- 优点:读写性能显著提高,存储利用率为100%。
- 缺点:没有数据冗余,可靠性低。

RAID 1¶
RAID 1通过将数据镜像(mirroring)到两个或多个磁盘上来提高数据可靠性。每个磁盘都有相同的数据副本,因此即使一个磁盘发生故障,数据仍然可以从其他磁盘中恢复。
- 优点:高数据可靠性,读性能有所提高。
- 缺点:存储利用率为50%,写性能略有下降。
RAID 2¶
RAID 2使用位级条带化(bit-level striping)和海明码(Hamming code)进行错误校正。RAID 2在现代系统中很少使用,因为其复杂性和对同步磁盘的需求。
- 优点:提供错误检测和校正。
- 缺点:实现复杂,存储利用率低。
RAID 3¶
RAID 3使用字节级条带化(byte-level striping)和一个专用的奇偶校验磁盘来提供数据冗余,当其中一个盘的数据出现问题时,可以通过其他盘的数据和校验位来恢复数据。RAID 3适用于大文件的顺序读写,但在处理多个并发请求时性能较差。
- 优点:提供数据冗余,适合大文件顺序读写。
- 缺点:并发处理性能较差,奇偶校验磁盘成为瓶颈;我们无法确定哪一个盘出现问题。

RAID 4¶
RAID 4使用块级条带化(block-level striping)和一个专用的奇偶校验磁盘。与RAID 3类似,但RAID 4在处理并发请求时性能更好。
-
优点:允许同时对不同的盘进行独立的读操作,RAID 4 让每一个 sector 都有自己单独的校验位,这样就可以确定出错的硬盘。对于 small read 和 large write 表现良好
-
缺点:奇偶校验磁盘仍然是瓶颈,对于 small write 表现不佳
RAID 5¶
RAID 5使用块级条带化和分布式奇偶校验。奇偶校验信息分布在所有磁盘上,消除了单一奇偶校验磁盘的瓶颈。RAID 5在性能和数据冗余之间取得了良好的平衡。
- 优点:提供数据冗余,读写性能较好,存储利用率高。
- 缺点:写操作需要计算和写入奇偶校验信息,性能略有下降。
RAID 6¶
RAID 6类似于RAID 5,但使用双重分布式奇偶校验,可以容忍两个磁盘同时发生故障。RAID 6提供了更高的数据可靠性,适用于对数据安全性要求较高的场景。
- 优点:提供更高的数据冗余,能够容忍两个磁盘故障。
- 缺点:写操作开销更大,存储利用率略低于RAID 5。
总线¶
总线并不只有单独一根线,实际上时多条线组合在一起,把各种设备相互连接起来。
- 控制线(Control Lines): 用于传输控制信号,如时钟信号、复位信号等。
- 数据线(Data lines): 用于上传输数据,例如地址和读写的数据。
总线工作:包括两个部分:发送地址和接收或发送数据
- 输入:从设备向内存输入数据
- 输出:从内存向设备输出数据
Bus transaction


同步和异步¶
- 同步(Synchronous):所有的设备都有相同的时钟频率,但由于数据传输有延迟,clock skew 无法避免,所以信号线的长度必须尽可能短
- 异步(Asynchronous): 设备不需要有相同的时钟频率,通过握手协议来进行数据传输

- 首先,I/O 设备发出
ReadReq
信号,请求从主存储器读取数据,并传输相应的内存地址。 - 主存储器接收到
ReadReq
信号并读取地址后,发出Ack
信号,表示已收到ReadReq
信号,并开始准备数据。 - I/O 设备收到
Ack
信号后,将ReadReq
信号置低,同时释放数据总线。 - 主存储器检测到
ReadReq
信号已被置低后,将Ack
信号置低。 - 当主存储器准备好数据后,将数据放到数据总线上,并升高
DataRdy
信号。 - I/O 设备收到
DataRdy
信号后,读取数据总线上的数据,并在数据读取完成后发出ACK
信号,表示数据已读取完毕。 - 主存储器收到
ACK
信号后,将DataRdy
信号置低,并释放数据总线。 - I/O 设备收到
DataRdy
信号后,将ACK
信号置低,表示整个数据传输过程已完成,总线可以用于其他操作。
Bus Arbitration¶
总线上由多个设备共享,其中如果多个设备同时需要使用总线,就会出现冲突,这时就需要总线仲裁(bus arbitration)来解决这个问题,总线可能有多个Master,来决定哪一个I/O设备可以访问总线。这些master拥有不同的优先级
Communication with the processor¶
- polling: 轮询,CPU 不断询问每个设备是否需要使用总线,直到有一个设备响应为止,轮询会浪费 CPU 大量的时间,因为大部分情况下 I/O 设备都没有请求或者还没有准备好。
- interrupt: 中断,当设备需要使用总线时,通过中断请求(interrupt request)来通知CPU,CPU 在处理完当前任务后,会立即响应中断请求,并处理设备的需求,中断驱动的 I/O 操作可以让 CPU 在 I/O 设备读写数据的时候做其他的事情。
- DMA: 直接内存访问,DMA 控制器直接从内存中读取数据,而不需要CPU的干预,DMA 控制器可以独立于CPU进行数据传输,这样可以提高数据传输的效率,DMA 不需要 CPU 的控制,所以不会占用 CPU 的时间,但 DMA 实际上只用于数据的传输,它与 polling 和 interrupt 并不冲突