查询写缓存属性

存储设备通常会在写入缓存中缓冲数据,然后再将数据写入非易失性媒体(如磁盘盘块)。 此类缓冲区可提高设备性能,但也会降低数据完整性。 如果写入缓存没有电池备份,电源故障可能会导致缓存数据丢失。

数据丢失问题的一种补救措施是使用 SCSI 设备上的 SCSI SYNCHRONIZE CACHE 命令刷新写入缓存 () 。 但是,刷新写入缓存是一项成本高昂的操作,如果频繁执行,可能会显著降低性能。 许多存储设备允许写通请求,而不是刷新 写入 缓存。 写通请求绕过写入缓存,并将数据直接发送到媒体。

例如,数据库应用程序可以使用写通请求来确保事务日志到达媒体,而文件系统驱动程序可以使用写通请求来确保文件系统元数据到达媒体。

但是,并非所有具有写入缓存的存储设备都支持写通请求或同步缓存;某些设备不需要绕过或刷新缓存数据作为预防措施,因为它们具有电池备份系统,可防止在电源故障期间数据损坏。 应用程序和驱动程序必须具有有关设备写入缓存属性的信息,然后才能有效利用它。

在 Windows Vista 中,可以将 IOCTL_STORAGE_QUERY_PROPERTY 请求与 StorageDeviceWriteCacheProperty 属性标识符一起使用,以查询存储类驱动程序中的写入缓存属性,该属性指定设备的写入缓存的特征。 写入缓存属性包括有关设备的缓存功能的以下信息:

  • 是否存在写入缓存。 写入缓存属性指定设备是否具有写入缓存。

  • 写入缓存的类型。 有两种main类型的写入缓存:写回写通。 使用写回缓存时,设备在绝对必要之前不会将缓存数据复制到非易失性媒体。 此操作可提高写入操作的性能。 使用写通缓存,设备将数据并行写入缓存和媒体。 这不会提高写入性能,但会使后续读取操作速度更快。

    不要将写通 缓存 与写通 请求混淆。 如果设备支持写通请求,则可以将写通请求与任何类型的缓存(包括写回缓存)一起使用。 例如,假设目标是具有写回缓存的 SCSI 设备。 如果设备支持写通请求,则发起程序可以通过在命令描述符块中设置强制单元访问 (FUA) 位来绕过写入缓存, (CDB) 写入命令。

  • 同步缓存支持。 写入缓存属性指示设备是支持 SCSI SYNC CACHE 命令,还是支持其他总线上的等效命令。

  • 电池备份。 写入缓存属性指示设备是否具有在电源故障期间保护缓存数据完整性的电池备份。

有关写入缓存属性报告的信息的完整说明,请参阅 STORAGE_WRITE_CACHE_PROPERTY

如果没有写入缓存属性机制 (即使用 IOCTL_STORAGE_QUERY_PROPERTY 请求和 StorageDeviceWriteCacheProperty 属性标识符) ,应用程序和驱动程序必须使用每个总线的不同命令序列来查询设备的写入缓存特征。 例如,如果目标设备连接到 IEEE 1394 总线,并使用减少块命令 (RBC) 协议,则发起程序必须检索设备模式数据的第 6 页,以确定是否启用了写入缓存。 但是,如果目标设备符合 SCSI,则发起程序必须检索模式数据的第 8 页。 写入缓存属性机制向发起程序隐藏这些操作的详细信息,并提供一种技术来查询不同总线上相同的存储设备写入缓存的特征。

(RAID 设备不支持写入缓存属性机制,因为没有标准技术用于查询这些设备) 或闪存设备。

64 位版本的 Windows 支持写入缓存属性。