Windows - простая разделяемая память между двумя процессами (без сопоставления файлов, без канала, без других дополнительных) - PullRequest
0 голосов
/ 28 апреля 2018

Как иметь изолированную часть памяти, которая вообще НЕ резервируется для каких-либо файлов или дополнительных уровней управления, таких как трубопроводы, и которую можно разделить между двумя выделенными процессами на одном компьютере с Windows?

Большинство статей указывают мне на направление CreateFileMapping. Начнем с этого:

Как на самом деле работает CreateFileMapping с hFile = INVALID_HANDLE_VALUE? Согласно

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx

это «... создает объект сопоставления файлов указанного размера, который поддерживается файлом подкачки системы, а не файлом в файловой системе ...»

Предположим, я что-то записываю в память, которая отображается с помощью CreateFileMapping с hFile = INVALID_HANDLE_VALUE. При каких условиях этот контент будет записан в файл подкачки на диске?

Также мое понимание того, что мотивирует использование разделяемой памяти, заключается в том, чтобы поддерживать производительность и оптимизировать ее. Почему статья «Создание именованной общей памяти» (https://msdn.microsoft.com/de-de/library/windows/desktop/aa366551(v=vs.85).aspx) ссылка на CreateFileMapping, если нет ни одной комбинации атрибутов, которая препятствовала бы записи в файлы, например файл подкачки?

Возвращаясь к первоначальному вопросу: я боюсь, что CreateFileMapping недостаточно хорош ... Так что бы сработало?

1 Ответ

0 голосов
/ 28 апреля 2018

Вы неправильно понимаете, что означает "поддержка" памяти системным файлом подкачки. (Не расстраивайтесь; Рэймонд Чен описал текст, который вы цитировали из MSDN, как « одно из самых неправильно понятых предложений в документации Win32 .»). Почти вся память компьютера «поддерживается» что-то на диске; только «невыгружаемый пул», используемый исключительно ядром и как можно меньшим, не может быть. Если страница не поддерживается обычным именованным файлом, то она поддерживается файлом системного подкачки. Операционная система не будет записывать страницы в системный файл подкачки без необходимости, но может, если потребуется.

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

CreateFileMapping с hfile=INVALID_HANDLE_VALUE на самом деле то, что вы хотите. Пока процессы, совместно использующие память, активно работают с ней, она останется в оперативной памяти и не будет проблем с производительностью. Если они простаивают, да, это может быть выгружено, но это нормально, потому что они ничего с этим не делают.

Вы можете предписывать системе не выгружать кусок памяти; для этого VirtualLock . Но он предназначен для использования с небольшими порциями памяти, содержащими информацию secret , где запись в файл подкачки может привести к утечке секрета. Страница MSDN предупреждает вас, что «Каждая версия Windows имеет ограничение на максимальное количество страниц, которое может заблокировать процесс. Это преднамеренно небольшое ограничение, чтобы избежать серьезного снижения производительности».

...