У меня есть два приложения (процессы), работающие под Windows XP, которые обмениваются данными через файл с отображенной памятью. Несмотря на все мои усилия по устранению выделения памяти для каждой итерации, я все равно получаю около 10 программных сбоев страниц за одну передачу данных. Я перепробовал каждый флаг в CreateFileMapping () и CreateFileView (), и это все еще происходит. Я начинаю задумываться, а не работают ли файлы с отображением в памяти.
Если кто-то знает подробности реализации O / S за файлами с отображенной памятью, я был бы признателен за комментарии по следующей теории: если два процесса совместно используют файл с отображенной памятью, и один процесс записывает в него, а другой читает его, тогда O / S помечает написанные страницы как недействительные. Когда другой процесс переходит к чтению областей памяти, которые теперь принадлежат недействительным страницам, это вызывает программную ошибку страницы (по замыслу), и O / S знает, что нужно перезагрузить недействительную страницу. Кроме того, количество ошибок программных страниц, таким образом, прямо пропорционально размеру записи данных.
Кажется, мои эксперименты подтверждают приведенную выше теорию. Когда я делюсь данными, я пишу один непрерывный блок данных. Другими словами, вся область разделяемой памяти каждый раз перезаписывается. Если я увеличу блок, количество ошибок программных страниц возрастет соответственно. Таким образом, если моя теория верна, я ничего не могу сделать, чтобы устранить ошибки программных страниц, за исключением того, что они не используют файлы, отображаемые в памяти, потому что именно так они работают (используя программные ошибки страниц для поддержания согласованности страниц). Ирония в том, что я решил использовать отображенный в памяти файл вместо соединения с сокетом TCP, потому что думал, что это будет более эффективно.
Обратите внимание, если ошибки программной страницы безвредны, учтите это. Я слышал, что в какой-то момент, если число будет чрезмерным, производительность системы может ухудшиться. Если сбои программных страниц по своей сути не являются в значительной степени вредными, то если у кого-то есть какие-либо рекомендации относительно того, какое число в секунду является «чрезмерным», я бы хотел это услышать.
Спасибо.