Поведение / политика кеш-памяти ЦП для сопоставлений памяти с файловой поддержкой?

Кто-нибудь знает, какой тип поведения или политики кеш-памяти ЦП (например, некэшируемое объединение записи) назначен регионам с отображением памяти файловой поддержкой в современных системах x86?

Есть ли способ определить, в каком случае, и, возможно, изменить поведение по умолчанию?

Windows и Linux являются основными операционными системами, представляющими интерес.

(Примечание редактора: ранее вопрос был сформулирован как ввод-вывод с отображением памяти, но эта фраза имеет другое конкретное техническое значение, особенно когда речь идет о кэшах ЦП, т. е. реальных устройствах ввода-вывода, таких как сетевые адаптеры или видеокарты, с которыми вы общаетесь с загрузками / хранилищами.

На самом деле этот вопрос касается того, какую память вы получаете от mmap(some_fd, ...), если вы не используете MAP_ANONYMOUS и она поддерживается обычным файлом на диске.)


person awdz9nld    schedule 06.04.2013    source источник
comment
Я могу ошибаться, но я сомневаюсь, что они делают что-то особенное по этому поводу. Страницы памяти с файловой поддержкой обрабатываются как любая другая типичная область памяти и обычно кэшируются. Я говорю это, потому что я профилировал доступ к файловой памяти (хотя и несколько лет назад) и не заметил каких-либо нарушений, которые могли быть вызваны специальным кэшированием. Однако у меня больше нет результатов или кода. Кроме того, я тестировал файлы с отображением в память, а не какие-либо устройства ввода-вывода и тому подобное.   -  person yzt    schedule 06.04.2013
comment
Мой опыт совпадает с опытом @ YaserZhian. Фактически, Windows (по крайней мере), похоже, обрабатывает обычную память как файл с отображением памяти, который случайно отображается в файл подкачки, а не в какой-то другой файл.   -  person Jerry Coffin    schedule 06.04.2013
comment
Это может вам помочь   -  person DOOM    schedule 06.04.2013
comment
Файлы с отображением памяти или ввод-вывод с отображением памяти?   -  person harold    schedule 06.04.2013
comment
Ввод-вывод в файл, который был отображен в память   -  person awdz9nld    schedule 06.04.2013
comment
@ MartinKällman: Определение того, кэшируется (кэшируется) диапазон памяти или нет, должно быть легко при чтении. Вы сопоставляете свой файл; вы читаете диапазон (лучше всего несколько килобайт), чтобы убедиться, что произошли ошибки страниц и данные загружены из файла; затем вы уходите и читаете большой и полностью независимый блок памяти, размер которого по крайней мере равен вашему наибольшему уровню кэша; затем вы возвращаетесь и читаете свою нанесенную на карту область один раз, а затем еще раз в другой раз. Если время двух последних проходов чтения различно (используйте RDTSC), то оно кэшируется, в противном случае - нет.   -  person yzt    schedule 07.04.2013
comment
@ MartinKällman: Вы также можете использовать профилировщик, который использует счетчики производительности ЦП. Например, я знаю, что Intel VTune может показывать количество промахов кеша в конкретном фрагменте кода. И количество промахов кеша, вероятно, может сказать вам, кэшируется ли вообще область памяти. Между прочим, вы можете сделать что-то подобное и для записи (для упомянутого вами объединения записи). Опять же, я очень сомневаюсь, что вы можете влиять на политику кеширования на уровне пользователя; вы, конечно, можете сделать это на уровне ядра или драйвера, но я подозреваю, что это будет для ввода-вывода устройства, а не для файлов.   -  person yzt    schedule 07.04.2013
comment
@yzt Спасибо, это может быть полезно при попытке определить такое поведение, но мне нужно знать это с уверенностью либо через спецификации платформы / ОС, либо программно во время выполнения.   -  person awdz9nld    schedule 07.04.2013
comment
@ MartinKällman: Если вам нужна уверенность, остановитесь и подумайте еще раз. Другие процессы могут и будут влиять на ваш процесс. В частности, сканеры вирусов могут затруднить определение того, что происходит.   -  person MSalters    schedule 08.04.2013


Ответы (2)


TL: DR Файлы с отображением памяти используют обычную политику обратной записи для страниц кэша страниц, которые они отображают в адресное пространство вашего процесса. Вы должны сделать что-то особенное и зависящее от ОС, если вам когда-нибудь понадобятся страницы, не являющиеся WB.


Политика кэширования, применяемая к области адресного пространства, обычно не зависит от операционной системы и зависит только от типа устройства, расположенного за страницей адресного пространства. Фактически, операционная система может применять любую политику кэширования к любой области памяти, но неправильно назначенная политика кэширования может снизить производительность системы или вообще нарушить системную логику.

Существует как минимум четыре политики кеширования:

  1. Полное кеширование (обратная запись, также известное как WB). Применяется к физическому адресному пространству, отображаемому в основную память (RAM). Используется для увеличения производительности подсистемы памяти. Основным свойством таких устройств является то, что их состояние может быть изменено только программно и может влиять только на программное обеспечение.

    В реализации файлов с отображением памяти используется полное кэширование, поскольку они полностью реализованы программным обеспечением (операционной системой), которое считывает фрагмент файла с диска и помещает его в память, а затем помещает этот фрагмент (возможно, измененный) обратно на диск. Оборудование обновляет «грязный» бит в таблицах страниц, чтобы операционная система могла определить, что нужно синхронизировать с диском.

  2. Кэширование со сквозной записью. (WT) Основным свойством таких устройств является то, что их состояние может быть изменено только программно, но это изменение должно немедленно сказаться на устройстве. В соответствии с этой политикой данные, записанные в регистр устройства ввода-вывода с отображением в память, будут размещаться одновременно в двух местах: в кэше и в устройстве. Но когда будет начато чтение данных, данные будут захвачены из кеша без дорогостоящего доступа к устройству.

    Эта политика кеширования может быть полезна для устройства MMIO, которое не записывает свою память, а только читает то, что написал процессор. На практике это редко используется ни для чего. Графические процессоры не такие, и они записывают видеопамять, поэтому они не используются для видеопамяти. (Для графического процессора нет механизма аннулирования кешей ЦП региона, потому что графический процессор не является частью области согласованности кеш-памяти ЦП)

  3. Некэшируемая, объединяющая запись (WC, также известная как USCW): слабо упорядоченная память, обычно используемая для отображения видеопамяти. Подобно некэшируемому, за исключением того, что NT-хранилища позволяют вам эффективно записывать сразу целую строку кэша. movntdqa загрузки позволяют эффективно читать целые строки кэша < / a>, чего нельзя сделать другим способом из регионов WC. При нормальной загрузке данные извлекаются отдельно для каждой загрузки, даже в пределах одной строки, поскольку они не кэшируются.
  4. Disabled caching. (UC) Applied to the almost all IO device, because the writing to the memory-mapped IO device register must have immediate effect and read from the memory-mapped IO device register must return to the reader actual data from the device. If caching will be applied to memory-mapped IO device, then two negative effects will be introduced:
    1. The writing to the memory-mapped IO device register will be delayed until the moment when cache controller will decide to flush cache line with written data. As result, the driver won't be able to know when the command written to the device will take effect.
    2. Данные чтения из отображенного в памяти регистра устройства ввода-вывода могут быть кэшированы. И последующие данные, считанные из того же регистра устройства ввода-вывода, отображенного в памяти, могут возвращать не фактические данные с устройства, а устаревшие данные из кеша. Из-за этого водителю будет сложно зафиксировать фактическое состояние устройства.

Поскольку способ, которым программное обеспечение может определять политику кэширования, зависит только от процессора, тот же алгоритм может применяться в любой операционной системе. Самый простой способ - захватить содержимое регистра CR3 и с его помощью найти запись таблицы страниц, соответствующую адресу, политику кэширования которого вы хотите знать, и проверить флаги PCD и PWT. Но этот способ не полный, потому что есть несколько других функций, которые могут повлиять на кеширование (например, кеширование можно полностью отключить на CR0, см. Также MTRR, PAT).

person ZarathustrA    schedule 07.04.2013

Чтобы добавить к существующему ответу ZarathustrA: в Windows SEC_NOCACHE включается это кеширование. Есть SEC_WRITECOMBINE, но он кажется неработающим (работает только с SEC_RESERVEили SEC_COMMIT, что означает только с файлом подкачки, и вы не хотите устанавливать SEC_WRITECOMBINE для этого).

person MSalters    schedule 07.04.2013