01-磁盘原理 心得记录
结构
硬盘有多个盘片; 每个盘片有两个盘面; 每个盘面都有单独的磁头,也就是说一个盘片有上下两个磁头,硬盘中的磁头整合在一起为磁头组;
磁盘经过格式化时候,划分为多个同心圆,这些同心圆就是磁道; 刺刀上每段圆弧就是 扇区; 所有盘面上的同一个磁道,在竖立方向构成的圆柱,就叫做柱面;
磁头,heads; 扇区,sectors,柱面,cylinders
怎么理解数据读写是按照柱面进行,而不是优先读写整个盘面再移动到下一个盘面?
磁头从开始移动到数据所在磁道所需要的时间寻道时间越短,I/O操作越快;
硬盘的磁头组中,磁头的切换只需要通过电子切换即可;而选取柱面则必须通过磁盘臂来操作磁头,进行机械切换;(选取不同磁道,也叫寻道)
电子切换是相当块的,比使用机械将磁头切换到邻近的磁道要快得多;所以数据的读写是按柱面进行,而不是按盘片进行;
也就是说,一个磁道写满数据后,就会切换到同一个柱面的下一个盘面来写; 等整个柱面的盘面都写满后,才会移动到下一个柱面; 通过这样的方式来减少寻道时间;
也可以看出,因为硬盘同一时间,只有一个磁头工作,所以同一时间只能对一个扇区,进行一种操作;也就是针对单块磁盘,同一时间只能进行一个IO;
磁盘是怎么精确定位到具体的扇区呢?
如果把硬盘比作仓库,为了便于管理,将仓库分为一个个房间; 每个房间就对应的硬盘的扇区;
硬盘的每次读写,都是以扇区为最小单位; 不能也不可能说从某扇区的前半部分开始写入数据;
早期硬盘小的时候,每个扇区是512B;
随着硬盘容量的增大,空间密度的提升,每个扇区已经有4KB了;
如果把磁盘比作一张白纸,如果不进行格子划分或分割线隔开,任何记录都直接写在白纸上,那么写满白纸后,如果某天想查找日志,只能通过一行行读取,搜索记录;这无疑会很凌乱,效率很低;
那么我们把白纸划分成一行行固定的格子;那么这些格子就是扇区;
磁盘可以对任意一个格子进行读写;
这就出现了一个疑问,磁盘是如何精确定位到具体格子的呢? 或者说随机读取或随机写入是,如何精确定位扇区的呢?
这个问题困扰我很久,但其实很早就知道了答案,只是“身在山中而不自知”,自己迷糊了好一阵;这其实就是 硬盘的编址方式,来确定每个扇区的位置;
1、早期磁盘都是通过:盘片,磁道,扇区 来寻址;一个盘片对应一张白纸,磁道对应白纸的行,扇区对应行内第几个格子;
2、随着磁盘空间密度增加,CHS寻址方式太浪费,所以更新为 LBA寻址,只记录具体的扇区编号;硬盘的ROM中有对应 物理地址和LBA的映射关系表;查询表即可知道;
硬盘的LBA编址方式?
那么仓库的房间具体是如何划分,如何寻址呢?
早期的硬盘很小,就是通过柱面,磁头、扇区的方式,组成扇区的地址,就是CHS地址,这种方式也就是CHS编址;
但随着硬盘容量越来越大,空间密度越高,采用CHS的扇区的划分就会造成浪费太大,所以就有了LBA编址方式; LBA编址方式不再划分柱面和磁头号,对外提供的地址全部是线性的LBA地址;
线性地址,指的是把磁盘想象成只有一个磁道。这个磁道无限长的直线,扇区是这条直线上等长的线段;
只是为了兼容早期的BIOS、操作系统以及软件,会从LBA根据早期硬盘的CHS和LBA映射公式反算出来的CHS数据。一般来说是LBA=(柱面号*16+磁头号)*64+(扇区号-1)。而这个只是逻辑上的对应关系,物理上并没有这样的对应关系——硬盘内部早就不用CHS寻址方式来定位数据了;
定位到了扇区,那应用如何写入扇区呢?
定位到扇区的问题解决了,那么就需要考虑如何向硬盘发送需要写入的数据; 所以人们开发出了一套抽象的接口系统,专门用于计算机和它的外设交互数据,这就是SCSI接口协议,也叫小型计算机系统接口;
磁盘都有缓存,缓存如何使用?
磁盘上必须有缓存,用来接受指令和数据,还被用来进行预读; 缓存就是磁盘上面的一块RAM芯片;一般是2MB,8MB,16MB,32MB,64MB;
正是由于换道的时间比较慢,所以针对应用程序的IO,磁盘也可以优化队列技术; 如果有多个IO,磁盘控制器会将这些指令计算在缓存器中,再进行排序,尽量减少换道次数; 预先读出的数据,因为有先后之分,所以会先存放到磁盘驱动器的缓存中,等待 磁盘控制器主动来取,不至于因为顺序问题而错乱;
我们常说的,禁用磁盘缓存,指的就是 wirte through模式,透写; 也就是磁盘收到写入指定和数据后,必须先将其写入盘片,然后再向控制器返回成功信号,相当于没使用缓存。(但即使是透写,指令和数据也是首先到达的缓存)
单个磁盘的性能,如何提升,影响它有哪些因素?
每个盘片的两面都可以存放数据,而且盘片都有两个磁头,各读一面;
但是有一个点,特别要注意,磁盘每个时刻,只允许一个磁头来读写数据; 专业点说,就是同一个时刻,磁盘只能处理一个IO;
所以不管盘体内的盘片和磁头再多,也无法提供硬盘的吞吐量和IO性能,只能提高容量;
所以主要影响磁盘的性能的因素有:
1、转速
2、寻道速度,
3、单蝶的容量; 这个其实就是提高盘片的空间密度,每个磁道存放更多数据,尽量减少换道次数;
4、接口速度; 这其实不算一个因素,因为目前的接口速度已经磁盘的最大带宽了; 而且在随机IO的情况下,主要瓶颈还是在寻道速度上,接口速度提升其实并不明显,只是高端硬盘还是会使用高速接口的;
ATA和SCSI指令系统,有什么不一样,为什么有两套呢?
这个问题,其实我也没太整明白;
从网上查找,有一些说法:
ATA成本低廉,功能也弱于SCSI,所以后来ATA以家用为主,SCSI以服务器/工作站应用为主。
而且早期的ATA的协议定义是针对硬盘设备的,并未考虑其他设备,例如光驱。因为ATA协议仅仅针对硬盘设备制定,而此时市场上的CD-ROM/磁带机/可移动存储等设备都需要使用其他专用接口或者昂贵的SCSI接口;
SCSI同时制定了一系列的通用接口命令,用于和不同类型的设备进行交互。大体上可以分为检测/控制类,数据写入类,数据读取类,以及双向数据传输(同时读和写)类。为了实现这些命令和SCSI设备交互,通常需要单独的SCSI控制器或者主板集成SCSI控制芯片。
目前硬盘提供的物理接口,包括如下几种:
1、用于ATA指令系统的IDE接口; (IDE接口,也叫PATA接口,并行传输ATA),装笔记本硬盘的硬盘盒子,里面就是IDE;
2、用于ATA指令系统的SATA接口;(Serial ATA,串行传输ATA) 老式移动硬盘那个连接线,很大很宽的那个接头;就是USB转SATA;
3、用于SCSI指令系统的并行SCSI接口; (SCSI有控制中心,有专门的SCSI控制器,总线上一般是可以接入8或16个SCSI设备)
4、用于SCSI指令系统的串行SCSI(SAS)接口;
5、用于SCSI指令系统的IBM专用串行SCSI接口(SSA);
6、用于SCSI指令系统的,并且承载与Fabre Channel协议的串行FC接口(FCP);
同一个总线上的SCSI设备交互,需要经过SCSI控制器吗?
SCSI总线的寻址方式,是按照: 控制器--通道--SCSI ID -- LUN ID 来寻址,精确找到设备;
SCSI控制器也是总线上的节点,优先级最高,固定是7;
除控制器之外,总线上其他节点之间无法交互数据; 比如从总线的一块硬盘 复制数据到 总线上的另一块硬盘, 数据无法直接再硬盘之间拷贝,因为硬盘只能理解SCSI语言,无法感知文件的概念;
而SCSI语言是处理具体的LBA块,是需要明确告诉硬盘 读或写 具体的LBA地址上的扇区,而不是直接告诉硬盘读写某个文件; 文件的层次是文件系统来翻译的,有文件对应到具体的LBA,需要借由文件系统处理;
所以从总线的一块硬盘 复制数据到 总线上的另一块硬盘,要拷贝的数据,需要先发给控制器,控制器复制到内存,经过主机文件系统和CPU处理后,再发给控制器,然后控制器发给另一块硬盘;
外部传输速率
并行传输,数据传输如何分割为多份,如何接受又如何整合?
并行传输,概念看起来是很强,但是我一个文件,如何均匀的分割成多份同时传输呢? 传输到目的地,他们如何整合到一起呢?
并行一般时采用8单位二进制码构成了一个字符进行并行传输,系统采用8个信道并行传输,一次传送一个字符,因此收、发双方不存在字符同步的问题,不需要额外的措施来实现收发双方的字符同步,这是并行传输的主要优点。
所以,个人理解,从这个角度说,并行针对的时多个IO同时发送,并不是要把传输的一个IO拆分成多份; 同时接受方,因为是按byte来接受,所以其实不存在转换,只需要每次等待一个byte接受完成,在缓存区整合后,再进行下一次传输; 这就又涉及到时钟频率;
并行通讯中,数据信号中无法携带时钟信息,为了保证各对信号线上的信号时序一致,并行设备需要严格同步时钟信号,或者采用额外的时钟信号线。在相同的信号频率下,串行传输比并行传输要慢。 在并行传输中,您可以每个周期传输一个字(例如1字节= 8位),而在串行传输中,仅传输其一小部分(例如1位)。并行传输时频率越高,差异越小。否则接收器需要等待所有信号接受到后,才开始继续下一次接受;这也会影响效率;
关于串行和并行传输的选取?
1、并行信号线的需要考虑串扰。 频率越高,串扰越明显,随之而来的单词损坏和重传的可能性也越高。
2、而且长距离传输,在室外,对线缆有要求,线缆也很粗,并行意味着更多的线,而且避免串扰还需增加屏蔽(屏蔽效果其实不算很好),还要控制时钟,总的成本其实远大于串行;
3、另外,随着技术发展,现在串行传输效率也很高,速度并不低;即使使用串行传输每个周期传输较少的数据,但可以使用更高的频率,从而导致更高的净传输速率。
短距离传输,如主板和部件之间,可以承受高速的并行;长距离上,还是使用的串行;
串行传输
串行通信的两种基本形式:同步和异步通信;
所以要注意,同步和异步通信,针对的是串行传输; 并不指并行传输;
并行传输以字节为单位,本身就相对复杂,会依据时钟来同步信息,保证一次传输的多个bit 统一,基本就是同步通信;