再来理解一下硬盘
写在前面的话:上一篇写了《理解硬盘》,对硬盘的基本组成和基本概念说了说,基本上是从硬件的角度来说的,这篇再来写写硬盘,基本概念就不说了,直接看前一篇就可以了,重点关注于文件和系统分区在硬盘里面的位置,也解答一下@金色海洋(jyk)阳光男孩 的疑问。
====正文开始====
一、我的磁盘参数
我们知道硬盘里面重要的几个概念:磁头(Head)、柱面(Cylinder)、扇区(Sector),下图是我电脑的这几项的数据,用DiskGenius查看的:
文章图片
共有60801个柱面,255个磁头,每道扇区数63个,总扇区数:976773168,这里说明两点:
(1)磁头数为奇数:我们知道磁盘里面一个盘面有两面可以存储数据,但是有的盘面只使用了一面,因此磁头数可能出现奇数,这里可以知道磁头编号是从0~255。(没有采用多磁头技术)
(2)每道扇区数:我们知道对于一个盘面,越往外磁道周长越长,对于以前老式的磁盘,每个磁道的扇区数目是相同的,这样就导致外面的磁道存储数据密度太低,因此现代的磁盘都是外面磁道扇区数目多,里面的扇区数目少,这里的每道扇区数其实是经过折算后的,也就是用总扇区数除以磁头数再除以柱面数得到的。
(3)柱面数:共有60801,所以可以知道柱面和磁道编号为0~60800
(4)总扇区数:976773168,这个就是我的硬盘总共的扇区数,这些扇区可以存储数据,其中每个扇区512Bytes,所以我的磁盘容量大概也就是:465GB
二、低级格式化
上面我们列举了我的磁盘里面柱面、扇区数目,这些数目是怎么来的呢?一个空白的硬盘可以想象成一个“铁砖头”,并没有这些所谓的磁道、柱面、扇区等参数,出厂前,硬盘厂家往往会进行格式化,确定硬盘的柱面、扇区等等物理参数,这就是所谓的“低级格式化”,这种格式化和操作系统是没有关系的。
三、磁盘寻址
磁盘经过低级格式化后,就有了扇区,我们就可以往里面写数据了,但是如何来确定我们的数据写到哪个扇区呢?如果我们不告诉计算机,它是不知道的。因此我们应该找到我们需要写入或读出数据的扇区,也就用到了“磁盘寻址”。
(1)找到一个具体的扇区,可以通过提供柱面号(Cylinder),磁头号(Header)、扇区号(Sector),就能唯一确定那个扇区了,这种寻址方式称为CHS寻址方式。例如CHS为0/0/1表示0号柱面、0号磁头、1号扇区,也就是整块磁盘的第一个扇区;60800/254/63,表示60800号柱面,255号磁头,63号扇区,表示我的磁盘的最后一个扇区。
(2)找到一个具体的扇区,还可以使用另外一种方式,那就是仅仅提供扇区号来确定,叫做LBA,逻辑寻址,或者线性寻址,例如0号柱面0号磁头扇区数为100个(这里不是68个了,因为外圈比内圈扇区数多),其对应的物理编号为1~100,但是对应的LBA逻辑编号为0~99(逻辑编号从0开始);0号柱面1号磁头对应扇区物理编号为1~100,但是对应的LBA逻辑标号为100~199,以此类推,因此所有的扇区编号为:0~976773167,相当于把一个一个的柱面展开,然后连接起来了。
四、磁盘分区
看完了前面,一个物理参数已经确定的磁盘,如果我们要安装操作系统,例如windows,那么需要对磁盘进行分区,也就是说C盘占用哪些扇区,D盘占用哪些扇区等等,占用的扇区由我们给他们分配的大小决定。下图是我的分区所占用的扇区:
文章图片
可以看到系统保留分区占用的扇区,这里CHS和LBA两种寻址方式都可以看到:
(1)对于CHS寻址:系统保留分区从0柱面32磁头的33号扇区开始,到12柱面,223磁头的19扇区截止。
(2)对于LBA寻址:系统保留分区的起始扇区编号为:32*63+33-1=2048,注意这里的CHS中扇区编号从1开始,而LBA寻址里面扇区编号从0开始。
到这儿,也可以回答@金色海洋(jyk)阳光男孩 的第一个疑问,C盘到底在硬盘的哪里:开始于12柱面223磁头20号扇区,结束于7649号柱面13号磁头44号扇区。而且操作系统一般存储于磁盘靠外面的磁道,据说外道访问速度比内道快,而操作系统文件又需要经常访问到。
再来看上面的图,我们会发现几个问题:
(1)系统保留分区从2048扇区开始,那么前面的0~2047个扇区,相当于1MB大小为什么没有显示出来,它们是干什么的用的?
(2)里面看到了扩展分区下面挂载了E盘和F盘,当然前面系统保留分区、C盘、D盘就是主分区了,他们有什么区别?
(3)扩展分区结束于60801柱面,47磁头46扇区,那么后面的扇区干什么用了?(备注:这里60801应该为60800,因为柱面是从0开始编号的,因此可能是软件的错误,这里不就深究了)
下面简单说一说:
(1)对于问题(1),前面有2048个扇区,其中第一个扇区,也就是0号柱面0号磁头1号扇区(CHS寻址)或者0号扇区(LBA寻址),也称为MBR区,共有512个字节,其中主引导记录MBR占用446个字节,用来引导操作系统启动的,不详细写了,有机会再介绍;磁盘分区表(DPT)占用64个字节,用来记录各个分区的情况,例如C盘占哪些扇区、D盘占哪些扇区等等,我们发现它只有64个字节,可以分成4条记录,一条记录占16个字节,用来记录一个分区的情况,因此只能有4个分区了,也就是4个主分区,如果想分更多的区,可以把其中一个主分区当做扩展分区,再扩充出去几个逻辑分区,几个逻辑分区挂载在扩展分区上面,因此扩展分区也是主分区的一种,且只能有一个;最后两个字节以55AA结尾;其他的2047个扇区一些空着,一些另做他用。(该部分内容不详细写了,要不文章又要太长了)
(2)对于问题(2)在上面文字中简单说明了一下主分区和扩展分区的区别。
(3)对于问题(3)我也好奇怪,那些空间都去哪儿了?
备注:可以把磁盘按照扇区展开,依次编号为0,1,2,……,然后分成几部分:Part1,Part2,Part3,Part4,Part5,Part6,Part7其中Part2、Part3、Part4、Part5,Part6分别给了系统保留分区、C、D、E、F盘,Part1和Part7空出的空间另作他用,其中每一个Part里面各个扇区又是有些什么,里面存储了哪些信息,也是值得思考的。
五、写入文件
分区讲完了,我们来看看写入文件。往磁盘里面写入文件,是按照柱面、磁头、扇区的顺序来写的,例如先写第1个柱面、第1个磁头、第1个扇区,然后写第1个柱面、第1个磁头、第2个扇区,写完63个扇区后,再移动到下面一个磁头来写;当写完一个柱面,再用后面的柱面。接下来假如往c盘写两个文件a.txt,b.txt,他们一个占用了一个柱面,那么它们的扇区地址是紧紧挨着的且a.txt在前,b.txt再后,但是接下来就要发生一些事情:
(1)如果a.txt里面删除内容,那么占用空间减少,但是占用的空间还是1个柱面。
(2)如果a.txt里面增加内容,那么一个柱面占不下了,而紧挨着它的柱面又被b.txt给占了,那么它会从其他柱面去找地方去放,然后在a.txt创建对新增内容所在扇区的引用。
从(1)(2)可知,随着系统的运行,磁盘里面的碎片会越来越多,因此操作系统提供了碎片整理工具就是把这些空间整合的(当然,对于SSD硬盘,因为内部结构不同,不建议碎片整理,这里就不解释了。),可以看看我的D盘里面空间利用,并不是连续的,如下图:
文章图片
备注:操作系统对文件的操作比这个要复杂些,例如删除文件并不会实际从扇区里面删除,否则各种恢复就无法恢复文件了,具体的可以去看操作系统知识了。
另外,我们平时有过这样的体会:例如将D盘里面的一个大文件剪切到D盘的其他文件夹,速度很快,而剪切到其他盘符,速度就比较慢了,就是因为在同一盘符里面,剪切文件,实际上只是改变了文件的引用地址,并没有改变文件实际的扇区地址,因此速度很快。这也给我们一个提示:以后磁盘分区没必要分那么多了,分两个就够了,一个安装系统,一个放一些数据文件,这样移动文件速度也快,当然如果有别的用途,如安装多操作系统等需要,就另当别论了。
好了,就写这么多吧,从此再看到硬盘,是不是对它有了不一样的认识,写的有点儿乱,还请见谅。
(完)
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
- 本文为原创文章,欢迎转载,后续本博客会不断更新,因此请保留该文档信息。
- 本文地址:http://www.cnblogs.com/wuguanglei/p/4242708.html
推荐阅读
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 逻辑回归的理解与python示例
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 皮一下
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- 不理解句意,你还想做对所有GRE填空题()
- 深入浅出谈一下有关分布式消息技术(Kafka)
- To|To 2018