问题“假设从硬盘驱动器请求的数据不存在于任何缓存(硬盘驱动器缓存、Os Cache、Ram 和其他任何可能的)”问题中的假设很难假设并且相对罕见. 即使在这种情况下,用户模式文件 I/O 操作和物理存储设备操作之间也只有松散的关联。
各种 Windows 库中有许多用户模式文件 I/O 函数。一些最古老的是C 库低级 I/O 函数。还有C 库流 I/O 函数、C++ iostreams 类和管理 I/O 类。还有其他 I/O 接口是其他包的一部分。
通常,所有用户模式 I/O 库都构建在Win32 文件 I/O 函数之上,包括CreateFile()、SetFilePointer()、ReadFile()和WriteFile()。
除非文件以非缓冲模式打开,否则操作系统可以缓存文件内容。这是在系统范围内完成的,而不是在每个文件的基础上完成的。因此,即使您的程序没有读取或写入文件,文件的 I/O 也可能会被缓存,并且不会导致任何物理存储设备 I/O。
有许多因素决定了文件 I/O 如何映射到物理设备上的实际 I/O 操作。这包括库级缓冲、操作系统缓存、设备驱动程序缓存、硬件级缓存、设备块大小、文件大小、硬件块/扇区重新映射和其他因素。
这里的简短故事是,您不能假设单个文件级别的读取或查找操作对应于物理设备操作,例如磁盘磁头查找。
当考虑写入时,这变得更加棘手。写入通常伴随着刷新 - 应用程序开发人员认为这会将数据一直推送到物理介质。开发人员通常假设,当刷新调用返回成功时,可以保证数据在存储设备上保持持久性。这远非如此,因为设备和驱动程序经常忽略刷新调用。
固态驱动器的复杂性更高,它不是机械的,因此没有“寻道”操作。在这里,其他物理特性表现出来,例如在写入块之前必须擦除块。