作者:caoshangfei
几乎从硬盘诞生的时候开始,磁盘碎片的概念就产生了。最初的磁盘操作系统开发者设计了一个文件分配表,用来记录哪些文件储存在哪些扇区当中,这样就允许一个文件可以储存在不连续的扇区当中。
有了文件分配表,在操作系统上同一分区中移动文件时,不必移动储存在扇区中的数据,只需修改文件分配表中的链接就可以了,删除文件时也不必重写文件所在的扇区,只需将文件分配表中该文件所在的扇区标记为空就可以了。
这样的设计使得操作系统能够更有效的利用磁盘空间,不过与此同时,也衍生出了一个新的概念—磁盘碎片。
扇区:硬盘中储存数据的最小寻址单元,容量为512字节。后来又出现了簇的概念,它是扇区的扩展。
文件分配表(FAT):被广泛应用的组织和管理文件的文件系统。
磁盘碎片的产生
接下来,我们将通过下图来了解两种磁盘碎片产生的典型过程。为了直观,我们将下面这幅硬盘结构图中的盘片部分简单的划分成3磁道共18扇区。我们不打算去考虑每个盘片有上千条磁道、每条磁道有上千个扇区的情况,也不考虑柱面的概念,忽略簇的概念,省略一切有碍理解的东西,用最简单的图,看清楚什么是磁盘碎片。
400)this.width=400;if(this.height450)this.height=450 }" border=0磁头:用于读取、写入、清除数据,是硬盘中技术含量最高的部件。在音圈马达的带动下可沿Z移动到各条磁道。
盘片:表面涂有可记录磁性的物质,用于存储数据。在这幅图片中,由灰色线将盘片划分成了3条磁道,每条磁道又划分出若干个单元格,这里每一个单元格代表一个扇区。
主轴:内有轴承、马达,可带动盘片高速旋转。
音圈马达:硬盘里的定位马达,类似于音频扬声器里所用的马达。
磁盘碎片产生的典型过程 (例一)
400)this.width=400;if(this.height450)this.height=450 }" border=0图中,系统正在向硬盘中写入一个文件,名为“椰子”,该文件体积较大,需要占用5个扇区的空间,因此要完全写入到硬盘当中需要较长的时间。磁头从1号扇区开始顺时针方向写入文件,当2号扇区中的数据写入完时,硬盘接到了一条新的命令—写入文件“葡萄”,文件“葡萄”体积较小,只需占用1个扇区的空间,它被写入到了扇区3当中。
这样一来,由于3号扇区已经被占用,文件“椰子”剩下的数据就要从4号扇区开始写入,最后,剩下的数据被写入到了4至6号扇区。如图,由于“葡萄”的插队,文件椰子无法储存在连续的扇区当中,被分割开的这两段数据就被称为磁盘碎片。
磁盘碎片产生的典型过程 (例二)
例一中的硬盘经过一段时间的使用之后,内部储存的文件发生了一些变化:一个新文件“西瓜”被写入到了硬盘当中,之后文件“葡萄”被删除了。
400)this.width=400;if(this.height450)this.height=450 }" border=0这时,硬盘接到了写入文件“橘子”的命令,“橘子”需要占用3个扇区的储存空间。如图,现在硬盘中共有两段不连续的可用空间,但任何一段单独的可用空间都不足以容纳整个“橘子”文件,不得已,“橘子”被拆分为两部分写入硬盘剩余的可用空间中,从而产生了磁盘碎片。
400)this.width=400;if(this.height450)this.height=450 }" border=0例一中的情况在下载大文件时十分常见,因为下载文件的过程不需要人为干预,所以一般人在下载文件的过程中都会做一些其它的事情。
如:浏览网页、玩游戏等等。浏览网页的过程中浏览器会产生大量的“Internet 临时文件”,玩游戏的过程中游戏程序也可能会产生临时文件,或因内存不足导致操作系统改变了页面文件的大小,这些情况都可能如例一般影响下载中的文件,产生磁盘碎片。实际使用中往往一部电影文件被下载到硬盘中之后会有数千个磁盘碎片。
例二中的情况是在删除了旧文件、添加新文件时发生的。通常情况下,系统会在对文件来说足够大的第一个连续可用空间上存储文件。如果没有足够大的可用空间,系统会将尽可能多的文件保存在最大的可用空间上,然后将剩余数据保存在下一个可用空间上。
因此,除非拥有容量无限大的硬盘,否则,在有限的硬盘空间中进行添加和删除文件的操作就必然会有例二这种产生磁盘碎片的情况发生。当然,较实际需求大的硬盘空间可以减少这种情况的发生。
磁盘碎片的危害
通常,磁盘碎片并不影响硬盘的正常工作,它的主要危害在于会降低硬盘的读写速度,不过当大量磁盘碎片存在于Windows的重要文件中时,也可能导致系统崩溃或数据丢失。磁盘碎片会降低硬盘读写速度的原因来自两个方面。
400)this.width=400;if(this.height450)this.height=450 }" border=0第一方面,观察上图,当硬盘读取文件“橘子”时,磁头需划过图中的阴影区域,但其中有一部分并不是“橘子”所在的扇区,因此,和读取连续的文件比起来,读取碎片“橘子”时,硬盘增加了等待盘片旋转到指定扇区的潜伏期和磁头切换磁道所需的寻道时间。
同理,在写入数据时,也会因无法将数据写入到连续的扇区中而降低速度。
另一方面是因为缓存,操作系统会在内存中划分一部分区域作为缓存,有些硬盘也会为内置的缓冲区设置缓存功能,缓存的一项功能是“预取”:在硬盘读取完指定扇区的数据之后、接到系统的下一条指令之前,磁头接着读取相邻的若干扇区的数据并存入缓存中,如果系统接下来所需的数据正好就是相邻扇区的数据,那么便可以直接从缓存中读取而不用磁头再寻址,提高了访问速度。
缓存同样可以增加硬盘的写入速度。在实际生活中,一般的文件都会占用成千上万个扇区的空间,根据缓存“预取”的原理,如果硬盘中的文件完全没有磁盘碎片的话,那么“预取”的命中率就可以达到几乎100%,但因为有磁盘碎片,通常“预取”的命中率只在50%左右。
整理已经存在的磁盘碎片
既然知道了磁盘碎片的危害,接下来就是要了解如何去除磁盘碎片。要去除硬盘中已经存在的磁盘碎片,通常的做法是使用专门的磁盘碎片整理程序,它可以分析硬盘中的磁盘碎片,移动并合并碎片文件,使每个文件都可以占用硬盘上单独而连续的储存空间。
预防磁盘碎片的出现
磁盘碎片出现之后的整理毕竟是被动的,虽然硬盘的使用过程中不可避免的会出现磁盘碎片,不过我们还是有很多方法可以减少磁盘碎片的出现。这里将要介绍的是最有效和常见的方法——通过合理的分区和分配文件预防磁盘碎片的出现。
C 盘里放什么文件
如果用硬盘性能测试软件测试一个硬盘中的各个分区,会发现一个有趣的现象,硬盘中的第一个分区C的性能最高,接下来依次是D、E、F……同一个硬盘中的各个分区为什么会有这种性能差距呢?请观察下图
400)this.width=400;if(this.height450)this.height=450 }" border=0图中的硬盘盘片被划分为3条磁道,每条磁道所包含的扇区数量并不相同,最外侧的磁道包含8个扇区,中间的磁道有6个扇区,内侧的则只有4个扇区。
因此,盘片转动一周,磁头在外侧磁道可以读取到八个扇区的数据,而在内侧磁道只能读取到一半的数据,这就是性能差距的原因。在分区时,C盘总是从最外侧磁道开始划分,因此C盘是硬盘中性能最好的分区。要将哪些文件储存在这性能最好的分区之中是个需要认真对待的问题。
在上文中我们曾接触过页面文件,作为虚拟内存的重要组成部分,页面文件每天都要经受无数次的读写,在物理内存容量不高的系统中,虚拟内存的性能对系统的整体性能至关重要。因此,将页面文件放置在C盘中是我们的最佳选择。
400)this.width=400;if(this.height450)this.height=450 }" border=0上文中曾经简略提到过虚拟内存是产生磁盘碎片的重要原因,其实,虽然页面文件每天会被无数次的读写,不过这并不会产生磁盘碎片,页面文件会产生磁盘碎片的原因在于它的可变大小。
在日常使用中,操作系统会根据负载,在预先设置的页面文件最大值和最小值之间自动改变页面文件的大小,这种频繁改变页面文件大小的过程才是产生磁盘碎片的原因。因此,在设置页面文件大小时应将最大值和最小值设置为相同的数值。
其它分区的管理
400)this.width=400;if(this.height450)this.height=450 }" border=0介绍完了页面文件的安置,下面将介绍上文中曾经提到过的另外两项产生磁盘碎片的要素:“Internet 临时文件”和“临时文件”。这两种文件会使其它文件产生大量的磁盘碎片。默认情况下,他们分别被储存在“Temporary Internet Files”文件夹和“TEMP”文件夹中,和页面文件一样,它们的存储位置也是可以改变的。
因此,优化它们的方法就是将它们和其它的文件分开,放置到一个单独的分区当中。
400)this.width=400;if(this.height450)this.height=450 }" border=0最后处理的是电影和音乐文件,这两种文件通常体积较大,因此非常容易受其它文件的影响产生大量的磁盘碎片。用一般的下载软件下载的话,一个500M的电影文件有5000个以上的磁盘碎片是常有的事。
不过,这两种文件对读取速度的要求都非常低,中等画质的电影文件的位率也不过就是500Kbps而已,远远低于硬盘的读取能力,因此,即使一个电影文件有5000个磁盘碎片,也不会对影片的正常播放产生丝毫的影响。
对于这些文件,我们将它们储存在硬盘的最后一个分区当中,同时给它们分配足够多的空间,并且永远不用考虑对它们进行磁盘碎片整理。
簇的大小
在文章的一开始,介绍磁盘碎片的产生的时候,为了便于理解,忽略了簇的概念。现在,我们已经理解了磁盘碎片的产生,是时候认识簇的存在了。
硬盘诞生的时候,并没有簇的概念,簇是随着文件分配表的发展而产生的。
在没有簇的时代,面对一个容量为360KB的磁盘,根据一个扇区的容量为512字节,就可以计算出这个磁盘一共有720个扇区。要记录磁盘上每一个扇区的信息,这个磁盘上的文件分配表就应当至少有720条记录。
事实上,那时在磁盘上使用的是12位的文件分配表,12位的含义是2的12次方,即4096,也就是说,当时在磁盘上使用的文件分配表有4096条记录,最多可支持4096个扇区。根据扇区的容量计算可得:12位的文件分配表最大可支持2MB的磁盘空间。随着硬盘技术的发展,12位的文件分配表很快就不够用了,采用更大的16位文件分配表的同时,簇的概念产生了。
簇就是更大的扇区,它可以是一个扇区、也可以是2个、4个、8个等等,它究竟有多大是在高级格式化的时候决定的。把相邻的若干个扇区组合起来就是一个簇,和扇区一样,一个簇内不允许存在两个文件,因此当储存一段比单个簇的容量还要小的数据时,会浪费一些储存空间。
网络上一直流传着一种奇怪的说法,认为较小的簇有助于减少磁盘碎片,提到这一点的文章都没有对这个问题作更深的解释,我们也无从得知这些文章的作者为何会这样认为。
从上文中两种产生磁盘碎片的典型过程来看,磁盘碎片的产生与簇的大小并无直接关系。事实上,较大的簇可以减少硬盘中簇的总数,而簇的总数限制了碎片的总数。
举例而言,假设一个硬盘中只有18个簇,那么这个硬盘中最多也只能产生18个碎片。而使用较小的簇则会增加出现更多磁盘碎片的可能性。因此,我们没有理由相信较小的簇可以减少磁盘碎片。
当硬盘中存在大量小文件时,较小的簇有助于节省一部分储存空间。因此,从节约空间的角度考虑应当采用较小的簇,而从减少磁盘碎片的角度考虑则应当采用较大的簇。