Предположение в вопросе «Предположим, что данные, запрошенные с жесткого диска, не существует ни в одном из кешей (кеш жесткого диска, Os Cache, Ram и все, что еще это может быть)» трудно предположить и относительно редко. Даже в этом случае существует только слабая связь между операциями ввода-вывода файла пользовательского режима и операциями физического запоминающего устройства.
В различных библиотеках Windows имеется множество функций ввода-вывода в пользовательском режиме. Одними из самых старых являются функции низкоуровневого ввода-вывода библиотеки C . Есть также функции потокового ввода-вывода библиотеки C , классы C ++ iostreams и классы управляемого ввода-вывода . Также есть другие интерфейсы ввода / вывода, которые являются частью других пакетов.
Как правило, все библиотеки ввода-вывода пользовательского режима построены поверх функций ввода-вывода файлов Win32 , включая CreateFile () , SetFilePointer () , ReadFile () и WriteFile () .
Если файл не открыт в небуферизованном режиме, операционная система может кэшировать содержимое файлов. Это делается для всей системы, а не для отдельных файлов. Таким образом, даже если ваша программа не прочитала или не записала файл, операции ввода-вывода в файл могут кэшироваться и не приводить к каким-либо физическим операциям ввода-вывода устройства хранения.
Существует множество факторов, определяющих, как файловые операции ввода-вывода сопоставляются с реальными операциями ввода-вывода на физическом устройстве. Это включает в себя буферизацию на уровне библиотеки, кэширование ОС, кэширование драйвера устройства, кэширование на уровне оборудования, размер блока устройства, размер файла, переназначение аппаратного блока / сектора и другие факторы.
Короткая история здесь заключается в том, что вы не можете предположить, что отдельные операции чтения или поиска на уровне файлов соответствуют операциям физического устройства, таким как поиск головки диска.
Это становится еще сложнее, когда рассматриваются записи. Зачастую записи сопровождаются сбросом, который, как предполагает разработчик приложения, доставит данные до физического носителя. Разработчики часто предполагают, что когда сбрасывающий вызов возвращает успех, данные гарантированно сохраняются на устройстве хранения. Это далеко не так, поскольку устройства и драйверы часто игнорируют скрытые вызовы.
С твердотельными накопителями сложнее, если они не являются механическими и поэтому не выполняют операции поиска. Здесь проявляются другие физические характеристики, такие как необходимость стирания блоков перед их записью.