目前为止,不赞同已有的回答(一共两个)。
目前已有回答的问题:
NTFS系统也是日志文件系统,在这一点上,与ext3/ext4无本质区别。
第一个回答说NTFS是连续分配的,实际上ext3/4也是尽量连续分配的,从来没有听说ext会预留空间的说法,如果那样会造成更多的碎片。
第二个回答说的主要是FAT,FAT是用链表方式保存块索引的,但NTFS是用bitmap和extents,这一点,跟ext是一样的。
所以两位的回答都有误导的嫌疑。
当然题主的问题本身也不太正确,FAT是容易产生碎片,但NTFS不是那么容易产生碎片的,作为开发过文件系统的人,我从来没有听说过“NTFS容易产生碎片”的说法。听说最多的是FAT容易产生碎片。
从数据结构上看ext使用extents方式来标识块的位置:
就是struct ext4_inode 的这个成员:
__le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
其实就是一个大数组,使用类似树一样的结构来保存文件块索引。
NTFS结构的因为没有公开,但从能看到的资料上看,绝对不是用像FAT一样的链表方式保存的,也是采用类似的bitmap+extent的方式。
------------------------------------------------
回到正题,为什么NTFS比ext容易产生碎片?
首先NTFS也不是很容易产生碎片,ext也会产生碎片,对于两种分配策略相似的文件系统来说,文件系统的结构不是导致碎片多少的原因。
ext不容易产生碎片是由于Linux比较强大的延迟写入技术导致的,在写入之前,ext有足够多的机会重新分配块的位置,保证碎片更少。但不意味着就能完全避免碎片。
相比之下,由于Windows的延迟写入不如Linux强大,所以相对而言,更容易产生碎片,但NTFS远远比FAT产生的碎片要少,并且影响也小。
Windows延迟写入是因为Windows内核中对可执行文件采取了直接映射的方式(这也是为什么Windows无法删除一个正在打开的文件的原因),这种映射技术使得有些文件被强迫写入磁盘(flush),并且这种flush的次数要高于Linux,因此产生的碎片率更高一些。相比之下,Linux可以删除正在打开的文件,也不采用直接映射可执行文件的方法,这样Linux系统里,flush的次数就相对较少,所以碎片率就少一些。
如果将Linux系统的交换分区设置的足够小,使之不能有效的重新在内存或者虚拟内存中重新分配块的物理位置,那么,当磁盘分区足够大,小文件足够多的时候,Linux上ext文件系统的碎片不见得就会少。
文件系统结构如何设计,基本上都是已经定型的技术,比如bitmap,extents,B/B+树的使用等等。这些技术,主流的文件系统能用的基本都用上了,从文件系统的结构上说,很难判断它的优劣。文件系统的性能、碎片率等等受操作系统的行为影响很大,如果修改Windows或者Linux的文件系统策略,那么碎片率肯定也会发生变化。