根据大话存储一书和参考资料总结,附参考链接
原文链接:https://blog.csdn.net/zztan/article/details/70861021/https://blog.csdn.net/hguisu/article/details/7408047
原文链接:https://blog.csdn.net/hguisu/article/details/7408047
硬盘存储原理
写入时,磁头线圈加电,在周围产生磁场,磁化其下的磁性材料,电流方向不同,磁场的方向也不同,可用 0 和 1 区分。(电生磁)
读取时,磁头线圈切割磁场线产生感应电流,磁性材料的磁场方向不同,所以产生的感应电流方向也不同。(磁生电)
盘片是硬盘存储数据的载体,磁粉均匀溅镀到圆盘片的表面上,盘片的基板由金属或玻璃材质制成。
硬盘的磁头用来读取或者修改盘片上磁性物质的状态,每一个磁面都有一个磁头。
磁头停止工作时,与磁盘的着陆区接触,着陆区不存放任何数据。
磁头读取数据时,盘片高速旋转产生气流使磁头保持离盘面数据区0.2--0.4微米高度的飞行状态,不与盘面接触造成磨损。
利用精确的齿轮组或者电圈旋转使磁头进行微米级的位移,让磁头精确定位到每个磁道。
硬盘在逻辑上被划分为磁道、柱面以及扇区。
磁头起初停在盘片最内圈,即线速度最小的地方,它不存放任何数据,称为启停区或着陆区(LandingZone),启停区外就是数据区。最外圈,离主轴最远的地方是“0”磁道,硬盘数据的存放从最外圈开始的。磁头通过“0”磁道检测器的构件找到“0”磁道的位置,完成硬盘的初始定位。
“0”磁道存放用于操作系统启动所需的BIOS程序,“0”磁道很重要,很多硬盘仅仅因为“0”磁道损坏就报废,这是非常可惜的。
硬盘的盘片一般用铝合金材料或玻璃做基片。硬盘的每一个盘片都有两个盘面(Side),即上、下盘面,每一个有效盘面都有一个盘面号,按顺序从上至下从“0”开始编号。在硬盘系统中,盘面号又叫磁头号,硬盘的盘片组在2~14片不等,通常有2~3个盘片,故盘面号(磁头号)为0~3或 0~5。
磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0开始顺序编号。硬盘的每一个盘面有300~1 024个磁道,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧,每段圆弧叫做一个扇区,扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入,磁头不能在扇区内部定位。磁道是“看”不见的,只是盘面上以特殊形式磁化了的一些磁化区。
划分磁道和扇区的过程叫做低级格式化,通常在出厂时就已完成。高级格式化又称逻辑格式化,它是指根据用户选定的文件系统(如FAT12、FAT16、FAT32、NTFS、EXT2、EXT3等),在磁盘的特定区域写入特定数据,以达到初始化磁盘或磁盘分区、清除原磁盘或磁盘分区中所有文件的一个操作。
所有盘面上的同一磁道构成一个圆柱,称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。数据的读/写按柱面进行,即磁头读/写数据时首先在同一柱面内从“0”磁头开始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作,只在同一柱面所有的磁头全部读/写完毕后磁头才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。所以,数据的读/写按柱面进行,而不按盘面进行。
一块硬盘驱动器的圆柱数(或每个盘面的磁道数)既取决于每条磁道的宽窄(同样,也与磁头的大小有关),也取决于定位机构所决定的磁道间步距的大小。
操作系统以扇区(Sector)形式将信息存储在硬盘上,每个扇区包括512个字节的数据和一些其他信息。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。
标识符是扇区头标,包括组成扇区三维地址的三个数字:
盘面号:扇区所在的磁头(header或盘面)
柱面号:磁道,确定磁头的径向方向。(cylinder)
扇区号:在磁道上的位置。也叫块号。确定了数据在盘片圆圈上的位置。(sector)
扇区的地址又称为CHS地址,磁头通过读取CHS地址定位。现CHS编址方式已被LBA編址方式取代。
(CHS和LBA的关系)补充知识,可跳过
CHS(也称3D),CHS模式支持的硬盘容量有限,用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个扇区共有512Byte,这样使用CHS寻址一块硬盘最大容量为256 * 1024 * 63 * 512B = 8064 MB
新的寻址模式:LBA(Logical Block Addressing)。在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。LBA编址方式将CHS这种三维寻址方式转变为一维的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为一线性的编号,系统效率得到大大提高,避免了烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器再将这种逻辑地址转换为实际硬盘的物理地址。
LBA下的编号,扇区编号是从0开始。
逻辑扇区号LBA的公式:
LBA(逻辑扇区号)=磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 – 1
例如:CHS=0/0/1,则根据公式LBA=255 × 63 × 0 + 63 × 0 + 1 – 1= 0,也就是说物理0柱面0磁头1扇区,是逻辑0扇区。
也就是说 LBA就是扇区的编号, 按照磁道 柱面 和 磁头 从小到大的顺序编号
头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况,确保准确无误。
扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的ECC数字填入这个部分。
扇区编号:采用交叉因子N:1 解决磁头和磁盘转速矛盾
1)首先必须找到柱面,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,
2)然后目标扇区旋转到磁头下,即磁盘旋转将目标扇区旋转到磁头下。这个过程耗费的时间叫做旋转时间。
一次访盘请求(读/写)完成过程由三个动作组成:
1)寻道(时间):磁头移动定位到指定磁道
2)旋转延迟(时间):等待指定扇区从磁头下旋转经过
3)数据传输(时间):数据在磁盘与内存之间的实际传输
因此在磁盘上读取扇区数据(一块数据)所需时间:Ti/o=tseek +tla + n *twm其中:tseek 为寻道时间,tla为旋转时间,twm 为传输时间
读写顺序:系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。(从上到下,然后从外到内。数据的读/写按柱面进行,而不按盘面进行)
系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则 直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面号做比较(即寻道),寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然 后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁 盘继续旋转。
由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:
由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。
俗话说一图胜千言,先用一张ACSII码图来解释为什么会产生磁盘碎片。
上面的ASCII图表示磁盘文件系统,由于目前上面没有任何数据文件,所以我把他表示成0。
在图的最上侧和左侧各有a-z 26个字母,这是用来定位每个数据字节的具体位置,如第1行1列是aa,26行26列是zz。
我们创建一个新文件,理所当然的,我们的文件系统就产生了变化,现在是
如图所示:”内容表”(TOC)占据了前四行,在TOC里存贮着每件文件在系统里所在的位置。
在上图,TOC包括了一个名字叫hello.txt的文件,其具体内容是”Hello, world”,在系统里的位置是ae到le。
接下来再新建一个文件
如图,我们新建的文件bye.txt紧贴着第一个文件hello.txt。
其实这是最理想的系统结构,如果你将你的文件都按照上图所表示的那样一个挨着一个,紧紧的贴放在一起的话,那么读取他们将会非常的容易和迅速,这是因为在硬盘里动得最慢的(相对来说)就是传动手臂,少位移一些,读取文件数据的时间就会快一些。然而恰恰这就是问题的所在。现在我想在”Hello, World”后加上些感叹号来表达我强烈的感情,现在的问题是:在这样的系统上,文件所在的行就没有地方让我放这些感叹号了,因为bye.txt占据了剩下的位置。
现在有俩个方法可以选择,但是没有一个是完美的
1.我们从原位置删除文件,重新建个文件重新写上”Hello, World!!”. –这就无意中延长了文件系统的读和写的时间。
2.打碎文件,就是在别的空的地方写上感叹号,也就是”身首异处”–这个点子不错,速度很快,而且方便,但是,这就同时意味着大大的减慢了读取下一个新文件的时间。
如果你对上面的文字没概念,上图
这里所说的方法二就像是我们的windows系统的存储方式,每个文件都是紧挨着的,但如果其中某个文件要更改的话,那么就意味着接下来的数据将会被放在磁盘其他的空余的地方。如果这个文件被删除了,那么就会在系统中留下空格,久而久之,我们的文件系统就会变得支离破碎,碎片就是这么产生的。
SCSI接口协议 小型计算机系统接口 完成了访问磁盘过程的抽象和虚拟化,屏蔽磁盘内部结构和逻辑