计算机底层知识拾遗(三)理解磁盘的机制

磁盘是一种重要的存储器,位于主存结构的下方,是永久存储的介质。在计算机底层知识拾遗(一)理解虚拟内存机制 这篇中说了虚拟内存是面向磁盘的,理解磁盘的工作原理对理解计算机的很多概念有很大的帮助。尤其是在数据库和分布式存储领域,要经常和磁盘打交道。

磁盘这块主要有几个部分的概念:

1. 磁盘的基本结构和工作原理

2. 如何在虚拟内存机制下与内存高效地交换数据

3. 磁盘如何保证数据存储的可靠性及故障恢复

磁盘的基本结构和工作原理

从单个磁盘来说,由一个个的同心圆组成,一个同心圆就是一个磁道,每个磁道由多个扇区组成,每个扇区之前由没有磁性的间隙分隔。扇区有磁性物质,支持读和写操作

每个磁道的扇区数量是一个常量,每个扇区的大小一般是4KB。扇区是磁盘基本的物理单元

每一个盘面对应一个传动臂,传动臂的头部有一个读/写头可以读和写磁盘介质。 传动臂可以覆盖所有的磁道,通过旋转盘面和移动传动臂,就可以访问到盘面所有扇区的数据。

一般的硬盘都有多个盘面构成,每个盘面都有上述的结构。一个硬盘上的多个传动臂是固定在一起的,也就是同时移动的半径都是一样的。这样同一时刻位于多个磁头下的的各个磁道构成一个柱面,采用多个盘面的好处是可以同时读取同一个柱面的数据。

我们知道存储系统都采用逻辑单元块来表示基本的数据单位,这样可以提高存储的效率,比如虚拟内存采用页为基本的存储单位。同样在磁盘领域,也用块这个逻辑单元来管理磁盘。扇区是基本的物理单元,大小为4KB。磁盘块一般为4KB - 64KB,包含一个或者多个扇区。主存和磁盘交换数据时以块为基本单位。

每一个磁盘都有一个磁盘控制器来管理一个或多个磁盘。磁盘处理器的作用有:

1. 控制传动臂,将磁头定位到一个特定的半径位置

2. 选择一个准备读写的盘面,定位到特定的扇区

3. 将从所要求的扇区读取的二进制数据传送到主存,或者将主存的数据写回到磁盘的扇区

看一个实际的磁盘的参数,Megatron 747磁盘有下列参数:

1. 8个圆盘,16个盘面

2. 每个盘面有2^16次个磁道

3. 每个磁道平均有256个扇区

4. 每个扇区有4KB个字节

所以它是 16个盘面 * 2^16个磁道 * 256个扇区 * 4KB个字节 = 1TB的大小。一个磁道存放1MB字节。如果一个块是16KB,那么1个块使用4个连续的扇区,一个磁道上有32个块

磁道的读写有3个步骤,即 寻道时间 + 旋转延迟 + 传输时间

1. 磁盘控制器将磁头组合定位在磁盘块所在磁道的柱面上所需要的寻道时间

2. 磁盘控制器等待访问块的第一个扇区转到磁头下,即旋转延迟

3. 磁盘控制器读写数据时,数据所在的扇区和扇区间的空隙经过磁头,即传输时间

寻道时间取决于磁头到它访问位置的距离,如果磁头刚好在要访问的柱面,那么寻道时间为0,但需要1ms的时间来启动磁头。磁头需要10ms的时间来经过所有的磁道,所以寻道时间在 0 - 10ms,平均5ms

磁盘旋转一圈的时间约为10ms,因此旋转延迟是0 - 10ms,平均为5ms

传输时间相对很小,在毫秒一下。

所以读取磁盘的1个字节的平均延迟是10ms,最大延迟差不多是它的两倍。

可以很自然地想到提高磁盘读写速度方法就是尽量减小寻道时间和旋转延迟,比如以下方式:

1. 按柱面组织数据,将要一起访问的块放在同一个柱面,这样可以经常避免寻道时间,也可能避免旋转延迟

2. 将数据分隔存储在多个相对较小的磁盘而不是放在一个大磁盘,这样可以让更多的磁头组设备分别区访问磁盘块,可增加单位时间内的磁盘块访问量

3. 镜像磁盘,把两个或者更多的数据副本放在不同的磁盘上,一方面保证了数据的冗余存储,另一方面也可以让我们一次访问多个磁盘块

4. 把连续的快预加载到主存的缓冲区,这是空间局部性的使用,从缓存原理的角度来加速磁盘访问

从虚拟内存的角度理解磁盘和主存的数据交换

首先理解一下CPU是如何来向磁盘IO请求数据的。我们知道计算机的各个组件通过总线连接,总线包括数据总线,地址总线,控制总线等。CPU采用内存映射IO的技术来访问IO设备。虚拟地址空间有专门的地址,称为IO端口,来于IO设备通信,当一个设备连接到总线后,它被映射到一个或多个端口。

假设磁盘控制器被映射到0xa0端口,CPU发起IO读的流程如下:

1. CPU把命令,逻辑块号,目的虚拟内存地址写到0xa0端口,发起一个磁盘读请求

2. 磁盘控制器把逻辑块号翻译成对应的扇区位置读取扇区,由DMA(直接内存访问,Direct Memery Access)控制器执行磁盘数据到内存的传输,不需要CPU的参与

3. 当DMA传输结束后,磁盘控制器采用中断的方式通知CPU读取完毕

有几个注意点:

1. CPU只发起读请求和最后由中断获知读操作结束,其他时间可以执行其他任务,提高了CPU的使用率

2. 内存一般都会有一个缓冲区来于磁盘交互,这实际也是缓存原理的使用,在内存中开辟了一个缓冲区,实际的内存读写与缓冲区交互,缓冲区和磁盘交互,这样提高了内存读写的效率

3. 内存和磁盘的传输数据以块为最小单位,这个也是缓存原理的应用,一次传输一个或多个块。

从虚拟内存的角度来说,虚拟页和磁盘中的块映射起来,当虚拟页被加载到内存的物理页的时候,就由DMA把虚拟内存对应的磁盘块加载到内存的对应地址的物理页中。当物理页写回到磁盘时,也是由DMA把数据传输到磁盘控制器,由磁盘控制器写到磁盘块对应的扇区。内存和磁盘交换数据的时候实际采用了内存的缓冲区来加速磁盘的访问速度。

缓冲区的目的是适配两个速度不一致的设备,从磁盘的工作原理我们看到磁盘操作是一个很慢的操作,内存操作相比磁盘操作是一个很快的操作,为了让内存对磁盘的读写不必等待磁盘操作返回再返回,操作系统设置了内存缓冲区来加速对磁盘的访问速度。

内存缓冲区是缓存原理的使用,它是磁盘和内存之间传输数据的一个重要的组件。后面会单独写一篇文章介绍内存缓冲区的原理。这里简单说一下,内存缓冲区由缓存块组成,缓存块的大小和磁盘块的大小是一样的。每个缓存块都有一个buffer_head数据结构,里面存储了这个缓存块对应的磁盘的deviceId和磁盘块,这样相当于把一个缓存块和一个物理的磁盘块绑定了。磁盘和内存缓冲区之间交换数据以块为基本单位。

有了内存缓冲区,CPU要访问某个磁盘文件的某些数据,只需要提供该数据所处的磁盘块号,就可以从内存缓冲区寻找是否已经缓存了该磁盘块的内容。

另外磁盘还专门设置了一块交换区swap来存放从内存中交换出来的页,swap是和操作系统的页面回收子系统相关的,和内存缓冲区没有直接关系,后面也会单独写一篇介绍磁盘上的交换区swap的机制。

磁盘如何保证数据的可靠性和故障恢复

磁盘保证数据存储的可靠性主要就是靠冗余。而冗余又有很多策略,比如

1. 单块磁盘的稳定存储,把扇区按照两两结对,比如X和Y成对,每次写的时候X和Y都要写同样的数据,这样当其中之一出现故障,就可以用另外一块来恢复。两个扇区同时出现故障的情况很小

2. 多块磁盘组成的磁盘阵列RAID,RAID0就是采用冗余镜像的方式

3. 软件保证的冗余,比如HDFS采用了3份冗余存储的策略

磁盘故障通常有几种

1. 间歇性故障,读或写一个扇区的某次尝试没有成功,但是经过反复尝试又能成功地读写

2. 介质损坏,磁盘的一位或多个位永久地损坏了,导致读不可能读取某些扇区

3. 写故障,尝试写一个扇区时,即不能正确地写,也不能检索先前写入的扇区,可能是写的时候供电中断引起的

4. 磁盘崩溃,整个磁盘永久不可读

对于间歇性故障,采用奇偶校验的方式,可以快速地检查出某次读写是否成功。磁盘控制器会通过奇偶校验的方式来检查读写是否正确,失败的话会进行重试,如果超过尝试次数,就返回读写失败

对于磁盘中部分位的损坏,或者写故障,可以采用上面说的单块磁盘稳定存储的方式,把扇区结对存储,这样可以降低介质损坏和写故障的影响

对于整个磁盘的崩溃,可以采用硬件方式的RAID磁盘阵列,或则软件保证的多个磁盘的冗余存储,来应对整个磁盘崩溃的影响,并可以快速回复损坏磁盘的数据

时间: 2024-11-03 22:11:44

计算机底层知识拾遗(三)理解磁盘的机制的相关文章

计算机底层知识拾遗(四)理解文件系统

操作系统的很多核心组件都是相互关联的,比如虚拟内存管理,物理内存管理,文件系统,缓存系统,IO,设备管理等等,都要放在一起来看才能从整体上理解各个模块到底是如何交互和工作的.这个系列的目的也就是从整体上来理解计算机底层硬件和操作系统的一些重要的组件是如何工作的,从而来指导应用层的开发.这篇讲讲文件系统的重要概念,为后面的IO系统做铺垫. 文件系统主要有三类 1. 位于磁盘的文件系统,在物理磁盘上存储文件,比如NTFS, FAT, ext3, ext4 2. 虚拟文件系统,在内核中生成,没有物理的

计算机底层知识拾遗(二)深入理解进程和线程

关于进程和线程,大家总是说的一句话是"进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元".这句话理论上没问题,我们来看看什么是所谓的"资源"呢. 什么是计算机资源 经典的冯诺依曼结构把计算机系统抽象成 CPU + 存储器 + IO,那么计算机资源无非就两种: 1. 计算资源 2. 存储资源 CPU是计算单元,单纯从CPU的角度来说它是一个黑盒,它只对输入的指令和数据进行计算,然后输出结果,它不负责管理计算哪些"指令和数据". 换句话

计算机底层知识拾遗(六)理解页缓存page cache和地址空间address_space

在这篇计算机底层知识拾遗(五)理解块IO层 中讲了块缓存buffer cache块缓存,这篇说说页缓存page cache以及相关的地址空间address_space的要点. 在Linux 2.4内核中块缓存buffer cache和页缓存page cache是并存的,表现的现象是同一份文件的数据,可能即出现在buffer cache中,又出现在页缓存中,这样就造成了物理内存的浪费.Linux 2.6内核对两个cache进行了合并,统一使用页缓存在做缓存,只有极少数的情况下才使用到buffer

计算机底层知识拾遗(一)理解虚拟内存机制

这个系列会总结计算机,网络相关的一些重要的底层原理.很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了.随着工作的时间越久,越体会到这些基础知识的重要性.做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长.我自己深有体会,这些基础知识,底层原理是助你打破瓶颈的灵丹妙药.当理解了一些底层原理之后,会发现现在很多热门技术,原理,常见的设计都是在底层基础上发展而来的. 这篇总结一下单机系统的

计算机底层知识拾遗(十)理解进程调度【转】

转自:http://www.cnblogs.com/zfyouxi/p/4504042.html 这篇说说内核的进程调度机制,进程调度是内核的一个重要工作,由调度器完毕. 进程状态 内核调度器调度的实体(KSE, kernal schedule entry)是进程和线程.内核必须知道全部进程和线程的状态,比方把时间片给一个堵塞的进程是没有意义的.从内核的角度来看,进程的状态有3种: 1. 执行,表示正在执行的进程 2. 等待,没有执行,可是等待时间片执行的进程 3. 睡眠,也就是堵塞,包含可中断

计算机底层知识拾遗(七)页缓存数据同步和页回收机制

这篇说说Linux的页缓存数据同步和页回收机制.数据同步和页回收是两个独立的概念,数据同步处理的是内存/缓存的数据和后备设备的数据一致问题,页回收处理的是在内存空间不足时如何回收已分配的物理内存页,来获得足够空间分配干净页,支持优先级更高的工作.数据同步在任意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发. 数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件中去.有两种方式可以调用数据同步 1. 周期性的调用,主要是pdflush机制 2. 强制调用,比如调用sync,

计算机底层知识

1 这篇万字长文,一下子把计算机底层知识说明白了 https://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTUwOQ==&mid=2247486427&idx=3&sn=f03bc1a695a9e2f837673f3012d65c6c&chksm=ce5e2951f929a047413a06b85c26d898ca9126f1369147e35a763542d435134584987a4e45b6&mpshare=1&scene=

计算机基本知识拾遗(七)页面缓存数据的同步和恢复机制页

本讲座Linux页面缓存数据的同步和恢复机制页.数据同步和恢复是两个独立的页面概念.数据同步处理是存储器/数据一致性问题缓存数据和备份设备.页面回收是如何回收分配的内存空间不足的物理内存页.为了获得足够的空间来分配一个干净的页面,支持更高优先级的工作.步在随意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发. 数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件里去.有两种方式能够调用数据同步 1. 周期性的调用,主要是pdflush机制 2. 强制调用,比方调用sync,

java基础知识拾遗(三)

1.类加载 bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包. system classloader -系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性 或者