磁盘这块主要有几个部份的概念:
1. 磁盘的基本结构和工作原理
2. 如何在虚拟内存机制下与内存高效地交换数据
3. 磁盘如何保证数据存储的可靠性及故障恢复
磁盘的基本结构和工作原理
从单个磁盘来讲,由1个个的同心圆组成,1个同心圆就是1个磁道,每一个磁道由多个扇区组成,每一个扇区之前由没有磁性的间隙分隔。扇区有磁性物资,支持读和写操作。
每一个磁道的扇区数量是1个常量,每一个扇区的大小1般是4KB。扇区是磁盘基本的物理单元。
每个盘面对应1个传动臂,传动臂的头部有1个读/写头可以读和写磁盘介质。 传动臂可以覆盖所有的磁道,通过旋转盘面和移动传动臂,就能够访问到盘面所有扇区的数据。
1般的硬盘都有多个盘面构成,每一个盘面都有上述的结构。1个硬盘上的多个传动臂是固定在1起的,也就是同时移动的半径都是1样的。这样同1时刻位于多个磁头下的的各个磁道构成1个柱面,采取多个盘面的好处是可以同时读取同1个柱面的数据。
我们知道存储系统都采取逻辑单元块来表示基本的数据单位,这样可以提高存储的效力,比如虚拟内存采取页为基本的存储单位。一样在磁盘领域,也用块这个逻辑单元来管理磁盘。扇区是基本的物理单元,大小为4KB。磁盘块1般为4KB - 64KB,包括1个或多个扇区。主存和磁盘交换数据时以块为基本单位。
每个磁盘都有1个磁盘控制器来管理1个或多个磁盘。磁盘处理器的作用有:
1. 控制传动臂,将磁头定位到1个特定的半径位置
2. 选择1个准备读写的盘面,定位到特定的扇区
3. 将从所要求的扇区读取的2进制数据传送到主存,或将主存的数据写回到磁盘的扇区
看1个实际的磁盘的参数,Megatron 747磁盘有以下参数:
1. 8个圆盘,16个盘面
2. 每一个盘面有2^16次个磁道
3. 每一个磁道平均有256个扇区
4. 每一个扇区有4KB个字节
所以它是 16个盘面 * 2^16个磁道 * 256个扇区 * 4KB个字节 = 1TB的大小。1个磁道寄存1MB字节。如果1个块是16KB,那末1个块使用4个连续的扇区,1个磁道上有32个块
磁道的读写有3个步骤,即 寻道时间 + 旋转延迟 + 传输时间
1. 磁盘控制器将磁头组合定位在磁盘块所在磁道的柱面上所需要的寻道时间
2. 磁盘控制器等待访问块的第1个扇区转到磁头下,即旋转延迟
3. 磁盘控制器读写数据时,数据所在的扇区和扇区间的空隙经过磁头,即传输时间
寻道时间取决于磁头到它访问位置的距离,如果磁头恰好在要访问的柱面,那末寻道时间为0,但需要1ms的时间来启动磁头。磁头需要10ms的时间来经过所有的磁道,所以寻道时间在 0 - 10ms,平均5ms
磁盘旋转1圈的时间约为10ms,因此旋转延迟是0 - 10ms,平均为5ms
传输时间相对很小,在毫秒1下。
所以读取磁盘的1个字节的平均延迟是10ms,最大延迟差不多是它的两倍。
可以很自然地想到提高磁盘读写速度方法就是尽可能减小寻道时间和旋转延迟,比如以下方式:
1. 按柱面组织数据,将要1起访问的块放在同1个柱面,这样可以常常避免寻道时间,也可能避免旋转延迟
2. 将数据分隔存储在多个相对较小的磁盘而不是放在1个大磁盘,这样可让更多的磁头组装备分别区访问磁盘块,可增加单位时间内的磁盘块访问量
3. 镜像磁盘,把两个或更多的数据副本放在不同的磁盘上,1方面保证了数据的冗余存储,另外一方面也能够让我们1次访问多个磁盘块
4. 把连续的快预加载到主存的缓冲区,这是空间局部性的使用,从缓存原理的角度来加速磁盘访问
从虚拟内存的角度理解磁盘和主存的数据交换
首先理解1下CPU是如何来向磁盘IO要求数据的。我们知道计算机的各个组件通过总线连接,总线包括数据总线,地址总线,控制总线等。CPU采取内存映照IO的技术来访问IO装备。虚拟地址空间有专门的地址,称为IO端口,来于IO装备通讯,当1个装备连接到总线后,它被映照到1个或多个端口。
假定磁盘控制器被映照到0xa0端口,CPU发起IO读的流程以下:
1. CPU把命令,逻辑块号,目的虚拟内存地址写到0xa0端口,发起1个磁盘读要求
2. 磁盘控制器把逻辑块号翻译成对应的扇区位置读取扇区,由DMA(直接内存访问,Direct Memery Access)控制器履行磁盘数据到内存的传输,不需要CPU的参与
3. 当DMA传输结束后,磁盘控制器采取中断的方式通知CPU读取终了
有几个注意点:
1. CPU只发起读要求和最后由中断获知读操作结束,其他时间可以履行其他任务,提高了CPU的使用率
2. 内存1般都会有1个缓冲区来于磁盘交互,这实际也是缓存原理的使用,在内存中开辟了1个缓冲区,实际的内存读写与缓冲区交互,缓冲区和磁盘交互,这样提高了内存读写的效力
3. 内存和磁盘的传输数据以块为最小单位,这个也是缓存原理的利用,1次传输1个或多个块。从虚拟内存的角度来讲,虚拟页和磁盘中的块映照起来,当虚拟页被加载到内存的物理页的时候,就由DMA把虚拟内存对应的磁盘块加载到内存的对应地址的物理页中。当物理页写回到磁盘时,也是由DMA把数据传输到磁盘控制器,由磁盘控制器写到磁盘块对应的扇区。内存和磁盘交换数据的时候实际采取了内存的缓冲区来加速磁盘的访问速度。
缓冲区的目的是适配两个速度不1致的装备,从磁盘的工作原理我们看到磁盘操作是1个很慢的操作,内存操作相比磁盘操作是1个很快的操作,为了让内存对磁盘的读写没必要等待磁盘操作返回再返回,操作系统设置了内存缓冲区来加速对磁盘的访问速度。
内存缓冲区是缓存原理的使用,它是磁盘和内存之间传输数据的1个重要的组件。后面会单独写1篇文章介绍内存缓冲区的原理。这里简单说1下,内存缓冲区由缓存块组成,缓存块的大小和磁盘块的大小是1样的。每一个缓存块都有1个buffer_head数据结构,里面存储了这个缓存块对应的磁盘的deviceId和磁盘块,这样相当于把1个缓存块和1个物理的磁盘块绑定了。磁盘和内存缓冲区之间交换数据以块为基本单位。
有了内存缓冲区,CPU要访问某个磁盘文件的某些数据,只需要提供该数据所处的磁盘块号,就能够从内存缓冲区寻觅是不是已缓存了该磁盘块的内容。
另外磁盘还专门设置了1块交换区swap来寄存从内存中交换出来的页,swap是和操作系统的页面回收子系统相干的,和内存缓冲区没有直接关系,后面也会单独写1篇介绍磁盘上的交换区swap的机制。
磁盘如何保证数据的可靠性和故障恢复
磁盘保证数据存储的可靠性主要就是靠冗余。而冗余又有很多策略,比如
1. 单块磁盘的稳定存储,把扇区依照两两结对,比如X和Y成对,每次写的时候X和Y都要写一样的数据,这样当其中之1出现故障,就能够用另外1块来恢复。两个扇区同时出现故障的情况很小
2. 多块磁盘组成的磁盘阵列RAID,RAID0就是采取冗余镜像的方式
3. 软件保证的冗余,比如HDFS采取了3份冗余存储的策略
磁盘故障通常有几种
1. 间歇性故障,读或写1个扇区的某次尝试没有成功,但是经过反复尝试又能成功地读写
2. 介质破坏,磁盘的1位或多个位永久地破坏了,致使读不可能读取某些扇区
3. 写故障,尝试写1个扇区时,即不能正确地写,也不能检索先前写入的扇区,多是写的时候供电中断引发的
4. 磁盘崩溃,全部磁盘永久不可读
对间歇性故障,采取奇偶校验的方式,可以快速地检查出某次读写是不是成功。磁盘控制器会通过奇偶校验的方式来检查读写是不是正确,失败的话会进行重试,如果超过尝试次数,就返回读写失败
对磁盘中部份位的破坏,或写故障,可以采取上面说的单块磁盘稳定存储的方式,把扇区结对存储,这样可以下降介质破坏和写故障的影响
对全部磁盘的崩溃,可以采取硬件方式的RAID磁盘阵列,或则软件保证的多个磁盘的冗余存储,来应对全部磁盘崩溃的影响,并可以快速回复破坏磁盘的数据
下一篇 jQuery遍历DOM