与硬盘通信时是否始终强制执行簇大小

与硬盘通信时是否始终强制执行簇大小

我的问题是关于操作系统使用 ATA 命令与硬盘通信时使用的最小数据块大小(簇、扇区数)?

我知道物理扇区大小为 512 字节

新硬盘有 4096 字节 (4K)

操作系统分配单元(又名簇)等于 1 个或多个扇区。

簇大小取决于文件系统还是操作系统?

假设簇大小为(4096 字节,8 个物理扇区)==>它是否始终通过 ATA 命令强制执行?也就是说,如果应用程序发出 ATA 读取扇区 命令读取 1 个扇区,操作系统是否强制簇大小并请求 8 个扇区或请求 1 个扇区?

操作系统为文件保留的扇区或簇的数量是否始终 偶数 或者可能是 奇数

答案1

不是,因为文件系统是位于 ATA 之上的,而不是相反。

如果应用程序发出 ATA READ SECTOR 命令来读取 1 个扇区

通常,应用程序不会发出 ATA 命令。它们向操作系统发出文件操作,然后操作系统文件系统层将它们(通常通过抽象的“块设备”层)转换为 ATA 或 SCSI 或 NVMe 命令。

即使是绕过文件系统的程序,也几乎总是使用操作系统提供的“块设备”操作而不是原始磁盘命令来执行读取/写入。它们仅在需要 ATA 特定功能(例如查询 SMART 状态等)时才发出原始 ATA 命令。

操作系统是否强制簇大小并请求 8 个扇区

否。如果申请发出原始 ATA 命令,然后它这样做是为了旁路整个文件系统层(实际上,它甚至可能正在读取/写入具有文件系统),因此此时强制执行文件系统级选项是没有意义的。

操作系统为文件保留的扇区数或簇数总是偶数还是可以是奇数?

在大多数文件系统中,文件的长度可以是任何数量;没有理由将其限制为偶数。如果文件需要 3 个簇,它将存储在 3 个簇中。

答案2

文件系统的簇大小不是等于物理主机和驱动器之间的最小传输大小。它可以更低或更高。

  • 假设文件系统的簇大小为 64K,文件重命名只会更改保存目录的块中的一个字节。虽然簇现在已脏,但只有保存已更改部分的单个页面(通常为 4K)现在已脏,并将在下一次*sync()调用时写回磁盘。在这种情况下,写入大小小于簇大小。
  • 再次假设文件系统的簇大小为 64K,并且最近读取了其中一个簇。它在缓冲区/缓存中消耗的 16 个页面中,有 15 个页面仍然存在,但 1 个页面已被逐出。下次读取时,只会读取丢失的页面。在这种情况下,读取大小小于簇大小。
  • 假设文件系统的簇大小为 4K,并且readahead设置为 64K。如果读取不在缓冲区/缓存中的簇,则读取大小将为 64K。在这种情况下,读取大小高于簇大小。
  • 假设文件系统的簇大小为 4K,并且两个相邻簇在缓冲区/缓存中是脏的。当电梯将这些页面标记为要写出时,它们很可能会在单个操作中被写入。在这种情况下,写入大小大于簇大小。

我只给出了一个更大/更小的读/写的例子,但肯定有数百种情况,其中物理传输大小比集群大小更小或更大(数量级)。

相关内容