![与硬盘通信时是否始终强制执行簇大小](https://linux22.com/image/1614104/%E4%B8%8E%E7%A1%AC%E7%9B%98%E9%80%9A%E4%BF%A1%E6%97%B6%E6%98%AF%E5%90%A6%E5%A7%8B%E7%BB%88%E5%BC%BA%E5%88%B6%E6%89%A7%E8%A1%8C%E7%B0%87%E5%A4%A7%E5%B0%8F.png)
我的问题是关于操作系统使用 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,并且两个相邻簇在缓冲区/缓存中是脏的。当电梯将这些页面标记为要写出时,它们很可能会在单个操作中被写入。在这种情况下,写入大小大于簇大小。
我只给出了一个更大/更小的读/写的例子,但肯定有数百种情况,其中物理传输大小比集群大小更小或更大(数量级)。