Кеширование при чтении файла

Тема в разделе "WASM.BEGINNERS", создана пользователем IceFire, 22 апр 2010.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Суть:

    Way 1:
    1. Обнуляем содержимое файла на низком уровне в обход ФС
    2. Смотрим через ReadFile = пустой файл. То, что нужно.

    Way 2:
    1. Смотрим через ReadFile - файл с данными. Ну правильно, не снесли же еще.
    2. Обнуляем содержимое файла на низком уровне в обход ФС
    3. Смотрим через ReadFile - СНОВА файл с данными. WTF?
    4. После перезагрузки имеем пустой файл, как и следовало ожидать.

    Понятно, что кеш. Вопрос один - где он? Хоть на каком уровне в стеке вызовов при вызове ReadFile?
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    IceFire,

    По картинке в Microsoft Windows Internals (4th ed.), Chapter 11: Cache Manager, драйвер файловой системы, получив IRP или вызов FastIoRead, обращается к CcCopyRead или CcFastCopyRead — это кэш-менеджер. Кэш-менеджер использует менеджер виртуальной памяти чтобы отобразить 256 KiB секци(ю|и) с нужными данными в системное виртуальное адресное пространство и копирует запрошенные данные.

    Кэш-менеджер естественным образом пролетает, если в вызове CreateFile() был использован флаг FILE_FLAG_NO_BUFFERING (хотя на слово я бы не верил :derisive:).