8. 外部存储器
HDD的数据读写机制
HDD用磁片信息表示数据,并将这些磁片数据记录在被称为盘片的磁盘上。HDD读写数据的单位是扇区,而非字节。在HDD的盘片上,沿半径方向与圆周方向划分出了多个扇区,并为每个扇区分配了序列号。

HDD通过名为磁头的部件读写磁盘上各个扇区的数据。磁头安装在磁头摆臂的部件上,该部件令磁头可以在盘片上沿直径方向移动。在此基础上,通过转动盘片,即可把磁头定位到想要读取的任意一个扇区的上面。
- 设备驱动程序将读写数据所需的信息传递给HDD,其中包含扇区序列号,扇区数量以及访问类型(读取或写入)等信息。
- 通过摆动磁头摆臂并转动盘片,将磁头对准需要访问的扇区。
- 执行数据读写操作
- 在执行读取的情况下,执行完HDD的读取处理就能结束数据传输

HDD能在一次访问请求中读取多个连续扇区上的数据。因此磁头通过磁头摆臂在径向上对准位置后,只需转动盘片,就能读取多个连续扇区上的数据。一次读取的数据量取决于各个HDD自身。
如果需要访问的扇区是连续的,却要分成多次来访问,就会增加访问处理的时间开销。

与访问连续的扇区时的情形不同,在访问扇区0、11、23这种不连续的扇区时,则需要将访问请求分成多次发送给HDD,这时访问轨迹会变长。

把这些处理各自消耗的时间排列到时间轴上。

由于HDD具有这样的特性,所以各种文件系统都会尽量把文件中的数据存放在连续的区域上。大家在编写程序时也一样,尽量设计称下面这样比较好。
- 尽量将文件中的数据存放在连续的或者相近的区域上
- 把针对连续区域的访问请求汇集到一次访问请求中
- 对于文件,尽量以顺序访问的方式访问尽可能大的数据量
通用块层
块设备可以通过设备文件直接访问,也可以通过在其上构建的文件系统来间接访问。
由于各种块设备通用的处理有很多,所以这些处理并不会在设备各自的驱动程序中实现,而是被集成到内核中名为通用块层的组件上来实现。

I/O调度器
通用块层中的I/O调度器会将访问块设备的请求积攒一定时间,并在向设备驱动程序发出I/O请求前对这些请求进行如下加工,以提高I/O的性能。
- 合并:将访问连续扇区的多个I/O请求合并为一个请求
- 排序:按照扇区的序列号对访问不连续的扇区的多个I/O请求进行排序
也存在先排序再执行合并的情况,那样可以更大程度地提高I/O性能。

有了I/O调度器,即便用户程序的开发人员不太了解块设备的性能特性,也能够在一定程度上发挥块设备的性能。
预读
在程序访问数据时具有空间局部性这一特征。通用快层中的预读机制就是利用这一特征来提升性能的。
当程序访问了外部存储器上的某个区域后,很可能继续访问紧跟在其后的区域,而预读机制正是基于这样的推测,预先读取那些接下来可能被访问的区域。

如果之后与推测的一样,程序申请读取后面那部分区域,就可以省略该读取请求的I/O处理,因为这些数据已经被预先读取出来了。

该机制有望提高顺序访问的性能。即使推测的访问没有到来,也只需丢弃预读的数据即可。
SSD
与HDD最大的不同是,在访问SSD上的数据时,不会发生任何机械处理,只需执行电子处理即可完成访问。


浙公网安备 33010602011771号