磁盘I/O原理
磁盘每个盘片为双面,每个面上分布一圈一圈的同心圆磁道,磁道由扇区组成。外围的扇区更宽,扇区的存储空间是一样的,一般每个扇区600字节,数据存储区512字节,其余存放控制信息。磁臂头移动遍历磁道,盘片旋转遍历扇区。
寻道时间:将磁臂头移动到指定磁道上所经历的时间
旋转延迟时间:盘片转动时扇区移动到磁头下所经历的时间
传输时间:将数据从磁盘读出或写入数据所经历的时间(与每次读/写的字节数和磁盘转速有关)
随机I/O:有一串随机数据文件(在磁盘上的位置分布随机的数据文件),需要从磁盘上一一读取。这样寻道时间很长,会导致I/O读取时间过长。
比如,在磁道2扇区3读取了第一个数据文件,接下来,磁头臂向外移动去磁道14扇区5读取第二个数据文件,接下来磁头臂又要向里移动到磁道8扇区4读取第三个数据文件,之前读取第二个数据文件时从磁道2移到14,现在又从磁道14移到8,可见这样重复走了8-14的磁道。可以知道,如果后面还有数据存在于走过的磁道上,会有很多的重复寻道,极大增加了寻道时间。
顺序I/O:就像是随机I/O的优化版,我们可以将我们要读取的数据文件按照其磁盘存放顺序排序,从第一个文件的位置开始向一个方向读取,我们依次读完每个磁道直到所有文件读取完,不必再有随机I/O带来的重复寻道时间。
在许多的开源框架如 Kafka、HBase 中,都通过追加写的方式来尽可能的将随机 I/O 转换为顺序 I/O,以此来降低寻址时间和旋转延时
提升磁盘I/O速度
磁盘高速缓存
目前,磁盘I/O速度远低于对内存的访问速度,为了提高磁盘I/O速度,利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。
存储管理相关
- 分页存储管理:将一个进程的逻辑地址空间分成若干大小相等的片,称为页或页面,并给各页加上编号0,1,2等。
- 分段存储管理:编译程序将作业的地址空间划分为若干个段,如主程序段MAIN,子程序段X,数据段D及段栈S等。每个段大小可以不一样。分段地址由段号和段内地址组成。
- 段页式存储管理方式:组合分段和分页管理,先将用户程序分为若干段,再把每个段分为若干页。段页式地址结构由段号,段内页号,业内地址三部分组成。
- 虚拟存储器:程序作业很大,内存容量无法容纳,因此在应用程序运行前,仅将当前要运行的少数页面装入内存便可运行,其余暂留磁盘,程序运行时,需要哪个页面的数据,就再调入内存,如果内存空间已满,则利用置换功能将老页面调出。
相应的也把内存空间(虚拟存储器)分成与页面大小相等的存储块,称为(物理)块或页框,同样加以编号。虚拟存储器和高速缓存空间(Disk Cache)类似。
当有进程访问某部分程序和数据时,会先在内存(缓存)中读取其所在的页面,没有则由OS将磁盘中的所需页面调入内存。当内存空间已满,应选择将哪个页面调出内存,由页面置换算法确定。
置换算法
- 最佳(Optimal)置换算法:淘汰未来最长时间不再被访问的页面(理想算法)
- 先进先出(FIFO)页面置换算法:淘汰最先进入的页面
- 最近最久未使用(LRU)置换算法:淘汰最长时间未使用的页面
- CLOCK置换算法:
简单CLOCK:LRU近似算法,从上次淘汰页面后,到现在还没有被使用过的页面会被淘汰
改进的CLOCK置换算法:是从上次淘汰页面后,到现在还没有被使用过且未被修改过的页面会被淘汰(如果被修改过则将该页重新写回磁盘) - 最少使用(LFU)置换算法:和LRU算法差不多,只是页面的使用情况采用移位寄存器方式存储,具体的使用次数无法得知,移位最小的即为淘汰的页面。
提升磁盘I/O速度的其他方法
- 提前读
在读取当前块数据的情况下,将下一块数据也读入缓冲区中。
在一些DBMS中会使用提前读(通常叫动态预读)的方式,DBMS可能注意到select语句正以顺序或或几乎顺序的方式访问索引或表页,于是DBMS 便开始向前多读取几个页。 - 延迟写
维护一个空闲缓冲区队列,每次会将缓冲区队列头的数据写回磁盘,将新加入的数据放入缓冲区队列末尾。 - 优化物理块分布
存储文件时,将文件所在的物理块在磁盘上连续分布,减少磁头在多个磁道间的无效移动,大大提高两个物理块的连续访问速度。 - 虚拟盘
利用内存空间去仿真磁盘,是易失性存储器(断电数据丢失),俗称内存条。通常用于存放临时文件,如编译程序所产生的目标程序等。与高速缓存的区别:虚拟盘中的内容由用户控制,而磁盘高速缓存的内容由OS控制。
参考:
磁盘i/o
http://www.dataguru.cn/article-11561-1.html
顺序随机I/O原理
http://blog.itpub.net/24486203/viewspace-2130182/