Linux的文件系统(EXT2/EXT3/EXT4)采用的是一种叫索引式文件系统(indexed allocation)。
Windows前期(比如FAT)采用的是一种类似链接的文件系统。

写入


当Linux的一个文件准备拷贝进硬盘的时候,系统已经提前算出了要占用的 inode 和 block,而且Linux的系统一般都比较松散,文件和文件之间仍留有空间。所以大概这样可以保证写入的文件 block 是连续的。


而当Windows写入的时候,则必须从头开始写入。如果要写入的文件大小为1000,那么系统从头读硬盘发现100-500之间正好有一段空间于是写入文件。那么文件还剩余600未写入。当然继续从500处继续开始空白的空间,然后发现1000-1200有一段空间,则再写入200文件,还剩余400。依次类推,找到空间写入,所以写入的文件有时候无法保证是 block 连续的。

读取

Linux要读取一个问题一般就先读取 inode ,然后可以依次把文件所有的 block 的编号索引到,则可以很快地读取一个文件(而且按之前写入过程知道,一个文件一般是连续的)。

Windows这时候要读一个文件了,但是它没有办法像Linux一般通过索引一下子把一个文件都找到,它读取的方式一般是先读取一个 block ,然后通过读到的这个 block 找到下一个 block 的位置, 依次类推。 但是,如果 block 很分散的话,机械硬盘的机械手臂上的磁头就要来回奔波了,可想而知一旦文件存放的位置过于“零碎”这速度怎么也快不起来了啊。于是则有了“碎片整理”。

当然,也不是说Linux就完全不需要进行“磁盘整理”了。因为,按之前写的,文件与文件之间一般会留有大段的空白,可供系统自动调整。但是如果磁盘已经快满的情况下(比如90%),那么就不存在这种情况了,如果再要写入一个大文件,则也只能见缝插针了…而Linux的磁盘整理通常有2种方法:

  1. 分区扩容

  2. 把 /分区A 的内容都拷贝出来到 /分区B ,然后对分区A进行格式化之后,再把之前分区A的内容塞回去即可。