硬盘的读写原理


          硬盘的种类主要是SCSI 、IDE 、以及如今流行的SATA等;不论什么一种硬盘的生产都要一定的标准;随着对应的标准的升级,硬盘生产技术也在升级;比方 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;当中眼下咱们常常在server站点看到的 Ultral-160就是基于SCSI-3标准的;IDE 遵循的是ATA标准,而眼下流行的SATA,是ATA标准的升级版本号;IDE是并口设备,而SATA是串口,SATA的发展目的是替换IDE;

     我们知道信息存储在硬盘里,把它拆开也看不见里面有不论什么东西,仅仅有些盘片。如果,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1(磁化为1),凹的地方代表数字0。因此硬盘能够以二进制来存储表示文字、图片等信息。

1、硬盘的组成

        硬盘大家一定不会陌生,我们能够把它比喻成是我们电脑储存数据和信息的大仓库。一般说来,不管哪种硬盘,都是由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份组成。

                               

                                                                       平面图:

                          

                                            立体图

        全部的盘片都固定在一个旋转轴上,这个轴即盘片主轴。而全部盘片之间是绝对平行的,在每一个盘片的存储面上都有一个磁头,磁头与盘片之间的距离比头发 丝的直径还小。全部的磁头连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向动作,(实际是斜切向运动),每一个磁头同一时刻也必须是同轴的,即从正上方向下看,全部磁头不论什么时候都是重叠的(只是眼下已经有多磁头独立技术,可不受此限制)。而盘片以每分钟数千转到上万转的速度在快速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作。

                            

因为硬盘是高精密设备,尘埃是其大敌,所以必须全然密封。
 

2、硬盘的工作原理

硬盘在逻辑上被划分为磁道、柱面以及扇区.
                                             
硬盘的每一个盘片的每一个面都有一个读写磁头,磁盘盘面区域的划分如图所看到的。

                        



        磁头靠近主轴接触的表面,即线速度最小的地方,是一个特殊的区域,它不存放不论什么数据,称为启停区或着陆区(LandingZone),启停区外就是数据区。在最外圈,离主轴最远的地方是“0”磁道,硬盘数据的存放就是从最外圈開始的。那么,磁头是怎样找到“0”磁道的位置的 呢?在硬盘中另一个叫“0”磁道检測器的构件,它是用来完毕硬盘的初始定位。“0”磁道是如此的重要,以致非常多硬盘只由于“0”磁道损坏就报废,这是 很可惜的。
        早期的硬盘在每次关机之前须要执行一个被称为Parking的程序,其作用是让磁头回到启停区。现代硬盘在设计上已摒弃了这个虽不复杂却非常让人不愉快的小缺陷。硬盘不工作时,磁头停留在启停区,当须要从硬盘读写数据时,磁盘開始旋转。旋转速度达到额定的快速时,磁头就会因盘片旋转产生的气流而抬起, 这时磁头才向盘片存放数据的区域移动。
       盘片旋转产生的气流相当强,足以使磁头托起,并与盘面保持一个微小的距离。这个距离越小,磁头读写数据的灵敏度就越高,当然对硬盘各部件的要求也越 高。早期设计的磁盘驱动器使磁头保持在盘面上方几微米处飞行。稍后一些设计使磁头在盘面上的飞行高度降到约0.1μm~0.5μm,如今的水平已经达到 0.005μm~0.01μm,这仅仅是人类头发直径的千分之中的一个。
        气流既能使磁头脱离开盘面,又能使它保持在离盘面足够近的地方,很紧密地尾随着磁盘表面呈起伏运动,使磁头飞行处于严格受控状态。磁头必须飞行在盘面上方,而不是接触盘面,这样的位置可避免擦伤磁性涂层,而更重要的是不让磁性涂层损伤磁头。
可是,磁头也不能离盘面太远,否则,就不能使盘面达到足够强的磁化,难以读出盘上的磁化翻转(磁极转换形式,是磁盘上实际记录数据的方式)。
                                   

        硬盘驱动器磁头的飞行悬浮高度低、速度快,一旦有小的尘埃进入硬盘密封腔内,或者一旦磁头与盘体发生碰撞,就可能造成数据丢失,形成坏块,甚至造成 磁头和盘体的损坏。所以,硬盘系统的密封一定要可靠,在非专业条件下绝对不能开启硬盘密封腔,否则,灰尘进入后会加速硬盘的损坏。另外,硬盘驱动器磁头的寻道伺服电机多採用音圈式旋转或直线运动步进电机,在伺服跟踪的调节下精确地跟踪盘片的磁道,所以,硬盘工作时不要有冲击碰撞,搬动时要小心轻放。
        这样的硬盘就是採用温彻斯特(Winchester)技术制造的硬盘,所以也被称为温盘,眼下绝大多数硬盘都採用此技术。

3、盘面、磁道、柱面和扇区

硬盘的读写是和扇区有着紧密关系的。在说扇区和读写原理之前先说一下和扇区相关的”盘面”、“磁道”、和“柱面”。         
1. 盘面
      硬盘的盘片一般用铝合金材料做基片,快速硬盘也可能用玻璃做基片。硬盘的每个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利用,都能够存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。每个这种有效盘面都有一个盘面号,按顺序从上至下从“0”開始依次编号。在硬盘系统中,盘面号又叫磁头号,由于每个有效盘面都有一个相应的读写磁头。硬盘的盘片组在2~14片不等,通常有2~3个盘片,故盘面号(磁头号)为0~3或 0~5。

2. 磁道
         磁盘在格式化时被划分成很多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0開始顺序编号。硬盘的每个盘面有300~1 024个磁道,新式大容量硬盘每面的磁道数很多其它。信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧,这些圆弧的角速度一样。因为径向长度不一样,所以,线速度也不一样,外圈的线速度较内圈的线速度大,即相同的转速下,外圈在相同一时候间段里,划过的圆弧长度要比内圈 划过的圆弧长度大。每段圆弧叫做一个扇区,扇区从“1”開始编号,每一个扇区中的数据作为一个单元同一时候读出或写入。一个标准的3.5寸硬盘盘面通常有几百到几千条磁道。磁道是“看”不见的,仅仅是盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完成。

3. 柱面
        全部盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),每一个圆柱上的磁头由上而下从“0”開始编号。数据的读/写按柱面进行,即磁 头读/写数据时首先在同一柱面内从“0”磁头開始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作,仅仅在同一柱面全部的磁头全部读/写完成后磁头 才转移到下一柱面(同心圆的再往里的柱面),由于选取磁头仅仅需通过电子切换就可以,而选取柱面则必须通过机械切换。电子切换相当快,比在机械上磁头向邻近磁道移动快得多,
所以,数据的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面来写,一个柱面写满后,才移到下一个扇区開始写数据。读数据也依照这样的方式进行,这样就提高了硬盘的读/写效率。
一块硬盘驱动器的圆柱数(或每一个盘面的磁道数)既取决于每条磁道的宽窄(相同,也与磁头的大小有关),也取决于定位机构所决定的磁道间步距的大小。

4.扇区
        操作系统以扇区(Sector)形式将信息存储在硬盘上,每一个扇区包含512个字节的数据和一些其它信息。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。
                     

扇区的第一个主要部分是标识符。标识符,就是扇区头标,包含组成扇区三维地址的三个数字

      盘面号:扇区所在的磁头(或盘面)

      柱面号:磁道,确定磁头的径向方向。

     扇区号:在磁道上的位置也叫块号。确定了数据在盘片圆圈上的位置。

头标中还包含一个字段,当中有显示扇区能否可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况,确保准确无误。

扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节对应的ECC数字填入这个部分。


 5. 訪盘请求完毕过程 :

确定磁盘地址(柱面号,磁头号,扇区号),内存地址(源/目)

       当须要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路依照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区

为了读取这个扇区的数据须要将磁头放到这个扇区上方,为了实现这一点:

         1)首先必须找到柱面,即磁头须要移动对准对应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,

         2)然后目标扇区旋转到磁头下,即磁盘旋转将目标扇区旋转到磁头下。这个过程耗费的时间叫做旋转时间

即一次訪盘请求(读/写)完毕过程由三个动作组成:
       1)寻道(时间):磁头移动定位到指定磁道 
       2)旋转延迟(时间):等待指定扇区从磁头下旋转经过 
       3)传输数据(时间):数据在磁盘与内存之间的实际传输

因此在磁盘上读取扇区数据(一块数据)所需时间:

      Ti/o=tseek +tla + n *twm

当中:

tseek 为寻道时间

tla为旋转时间

twm 为传输时间

4、磁盘的读写原理

系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容所有写入磁盘。

(文件的记录在同一盘组上存放是,应先集中放在一个柱面上,然后再顺序存放在相邻的柱面上,相应同一柱面,则应该按盘面的次序顺序存放。)

(从上到下,然后从外到内。数据的读/写按柱面进行,而不按盘面进行,先)

系统也以同样的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则 直接使磁头部件步进到对应的柱面,选通对应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每一个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面号做比較(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,依据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。假设是读数据,控制器计算此数据的ECC码,然 后,把ECC码与已记录的ECC码相比較。假设是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁 盘继续旋转。

5、局部性原理与磁盘预读

  因为存储介质的特性,磁盘本身存取就比主存慢非常多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之中的一个,因此为了提高效率,要尽量降低磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使仅仅须要一个字节,磁盘也会从这个位置開始,顺序向后读取一定长度的数据放入内存。这样做的理论根据是计算机科学中著名的局部性原理:

  当一个数据被用到时,其附近的数据也一般会立即被使用。

  程序执行期间所须要的数据通常比較集中。

  因为磁盘顺序读取的效率非常高(不须要寻道时间,仅仅需非常少的旋转时间),因此对于具有局部性的程序来说,预读能够提高I/O效率。

  预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区切割为连续的大小相等的块,每一个存储块称为一页(在很多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页加载内存中,然后异常返回,程序继续执行。

6、磁盘碎片的产生

俗话说一图胜千言,先用一张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。

事实上这是最理想的系统结构,假设你将你的文件都依照上图所表示的那样一个挨着一个,紧紧的贴放在一起的话,那么读取他们将会很的easy和迅速,这是由于在硬盘里动得最慢的(相对来说)就是传动手臂,少位移一些,读取文件数据的时间就会快一些。

然而恰恰这就是问题的所在。如今我想在”Hello, World”后加上些感叹号来表达我强烈的感情,如今的问题是:在这种系统上,文件所在的行就没有地方让我放这些感叹号了,由于bye.txt占领了剩下的位置。

如今有俩个方法能够选择,可是没有一个是完美的

1.我们从原位置删除文件,又一次建个文件又一次写上”Hello, World!!”. –这就无意中延长了文件系统的读和写的时间。

2.打碎文件,就是在别的空的地方写上感叹号,也就是”身首异处”–这个点子不错,速度非常快,并且方便,可是,这就同一时候意味着大大的减慢了读取下一个新文件的时间。

假设你对上面的文字没概念,上图

                   

这里所说的方法二就像是我们的windows系统的存储方式,每一个文件都是紧挨着的,但假设当中某个文件要更改的话,那么就意味着接下来的数据将会被放在磁盘其它的空余的地方。

假设这个文件被删除了,那么就会在系统中留下空格,久而久之,我们的文件系统就会变得支离破碎,碎片就是这么产生的。

试着简单点,讲给mm听的硬盘读写原理简化版

                 

硬盘的结构就不多说了,我们寻常电脑的数据都是存在磁道上的,大致上和光盘差点儿相同.读取都是靠磁头来进行.
           


我们都知道,我们的数据资料都是以信息的方式存储在盘面的扇区的磁道上,硬盘读取是由摇臂控制磁头从盘面的外側向内側进行读写的.所以外側的数据读取速度会比内側的数据快非常多.

                 

事实上我们的文件大多数的时候都是破碎的,在文件没有破碎的时候,摇臂仅仅须要寻找1次磁道并由磁头进行读取,仅仅须要1次就能够成功读取;可是假设文件破碎成 11处,那么摇臂要来回寻找11次磁道磁头进行11次读取才干完整的读取这个文件,读取时间相对没有破碎的时候就变得冗长.

因此,磁盘碎片往往也是拖慢系统的重要因素之中的一个,Vista之家团队也计划在Vista优化大师兴许版本号内增加磁盘碎片整理功能,敬请期待。

7、硬盘容量及分区大小的计算

在linux系统,要计算硬盘容量及分区大小,我们先通过fdsik -l查看硬盘信息:
  Disk /dev/hda: 80.0 GB, 80026361856 bytes
  255 heads, 63 sectors/track, 9729 cylinders
  Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot Start End Blocks Id System
  /dev/hda1 * 1 765 6144831 7 HPFS/NTFS
  /dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
  /dev/hda3 2806 9729 55617030 5 Extended
  /dev/hda5 2806 3825 8193118+ 83 linux
  /dev/hda6 3826 5100 10241406 83 linux
  /dev/hda7 5101 5198 787153+ 82 linux swap / Solaris
  /dev/hda8 5199 6657 11719386 83 linux
  /dev/hda9 6658 7751 8787523+ 83 linux
  /dev/hda10 7752 9729 15888253+ 83 linux
   当中 
    heads 是磁盘面;
    sectors 是扇区;
    cylinders 是柱面;
    每一个扇区大小是 512byte,也就是0.5K;

  通过上面的样例,我们发现此硬盘有 255个磁盘面,有63个扇区,有9729个柱面;所以整个硬盘体积换算公式应该是:
  磁面个数 * 扇区个数 * 每一个扇区的大小512 * 柱面个数 = 硬盘体积 (单位bytes)
  所以在本例中磁盘的大小应该计算例如以下:
  255 x 63 x 512 x 9729 = 80023749120 bytes 
  提示:因为硬盘生产商和操作系统换算不太一样,硬盘厂家以10进位的办法来换算,而操作系统是以2进位制来换算,所以在换算成M或者G 时,不同的算法结果却不一样;所以我们的硬盘有时标出的是80G,在操作系统下看却少几M;
  上面样例中,硬盘厂家算法 和 操作系统算数比較:
  硬盘厂家: 80023749120 bytes = 80023749.120 K = 80023.749120 M (向大单位换算,每次除以1000)
  操作系统: 80023749120 bytes = 78148192.5 K = 76316.594238281 M (向大单位换算,每次除以1024)
  我们在查看分区大小的时候,能够用生产厂家提供的算法来简单推算分区的大小;把小数点向前移动六位就是以G表示的大小;比方 hda1 的大小约为 6.144831G ;

原文地址:https://www.cnblogs.com/mengfanrong/p/4036867.html