百科问答小站 logo
百科问答小站 font logo



为什么NTFS系统容易产生碎片而ext系列则不会? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

目前为止,不赞同已有的回答(一共两个)。

目前已有回答的问题:

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的文件系统策略,那么碎片率肯定也会发生变化。




  

相关话题

  进程被操作系统加载之后,磁盘上的二进制文件可以删掉吗?如果删掉对正在运行的进程有什么影响吗? 
  一个模块(比如文件系统)在内核中实现(宏内核),跟它在内核外实现(微内核),主要区别是什么? 
  块存储、文件存储、对象存储这三者的本质差别是什么? 
  块存储、文件存储、对象存储这三者的本质差别是什么? 
  为什么 Windows 不提供内存文件系统? 
  NTFS 文件系统是如何处理小文件使占用空间为 0? 
  块存储、文件存储、对象存储这三者的本质差别是什么? 
  请问一个没有文件管理概念,也没有文件系统的操作系统是什么样子的? 
  剪切板、文件拖拽这些功能桌面环境是怎么实现的? 
  Windows 等操作系统是如何做到复制大文件不出错的? 

前一个讨论
家里有本《红楼梦》无意间被孩子发现了,老人不想让孩子看,可孩子非要看,小学的孩子可以看《红楼梦》吗?
下一个讨论
2010 年代,是否大多数国家和地区倾向于将厕纸直接冲入马桶,而中国人不习惯这样做?如果是,为什么?





© 2024-05-19 - tinynew.org. All Rights Reserved.
© 2024-05-19 - tinynew.org. 保留所有权利