在写数据前,存储驱动程序缓冲数据到非易失性媒介,如磁盘盘片。这一类型缓冲改进了设备性能,但是也降低了数据完整性。如果写缓存没有电压备份,电源关闭可能导致缓冲数据丢失。
一个弥补数据丢失问题的方法是刷新写缓存(在SCSI设备上使用SCSI SYNCHRONIZE CACHE命令)。然而,刷新写缓存是昂贵的操作,如果频繁操作,它可能会显著的降低性能。取代刷新写缓存的方法,许多存储设备允许write-through请求。Write-through请求绕开写缓存而直接送数据到媒介。
例如,数据库应用程序可能使用write-through请求以确保事务处理日志到媒介,文件系统驱动程序能使用write-through请求以确保文件系统元数据到达媒介。
然而,并非所有的存储驱动具有写缓存支持write-through请求或是SYNCHRONIZE CACHE;一些设备不需要绕过或刷新缓存数据,因为这些设备有电池备份系统以阻止电源丢失时数据损坏。应用程序和驱动程序,在他们有效使用设备之前,必须获取设备写缓存的属性信息。
在Windows Vista中,你可以使用包含一StorageDeviceWriteCacheProperty 属性标示符的IOCTL_STORAGE_QUERY_PROPERTY请求来查询存储类型驱动的写缓存属性——指定了设备的写缓存特征。写缓存属性包含设备缓存能力的如下信息:
l 写缓存的存在。写缓存属性指定了设备是否包含些缓存。
l 写缓存的类型。主要存在两种写缓存:回写(write back)和直写(write through)。具有回写缓存的设备,除非不得己,不会拷贝缓冲数据。具有直写缓存的设备并行地写数据到缓存和媒介中。这并非可以改善写性能,但是可以是子请求读操作更快。
不要迷惑于直写缓存和直写请求。直写请求可以使用任意种类缓存,包括胡写缓存,如果设备支持直写请求。例如,假设目标是一个具有回写缓存的SCSI设备,如果设备支持直写请求,启动程序可以通过设置命令描述块(CDB)中写命令强制单元访问位(FUA),绕开写缓存
l 同步缓存支持。写缓存属性显示了设备是否支持SCSI SYNC CACHE命令,或其它总线上相当的命令。
l 电压备份。写缓存属性只是了设备是否具有在电源关闭时保持缓存数据完整性的电压备份。
关于报告写缓存属性的完整描述信息,请参考STORAGE_WRITE_CACHE_PROPERTY.
如果没有写缓存属性机制(也就是,使用StorageDeviceWriteCacheProperty 属性标示符的IOCTL_STORAGE_QUERY_PROPERTY请求),应用程序和驱动程序,必须通过不同的命令序列,为每一总线查询设备写缓存特征。例如,如果目标设备绑定于IEEE1394总线,使用精简块命令(RBC)协议,启动程序必须检索设备模式数据中的页6来确定写缓存是否使能。然而如果设备是SCSI兼容的,启动程序必须检索模式数据中的页8.写缓存机制隐藏了这些操作细节,并提供了查询存储设备写缓存属性的方法,这与不同总线的方法相同。
写缓存属性机制在RAID设备上不支持,因为没有标准的方法查询这些设备,在闪存设备上也不支持。
写缓存属性在64位Windows版本上支持。