Общая память между двумя процессами (приложениями)

Я не могу найти полезного ответа на этот вопрос, хотя несколько раз его спрашивали по-другому.

Я хочу разделить память между двумя процессами (два разных приложения), чтобы один из них мог писать в эту память, а другой мог читать.

Возможно ли это в .NET? Как?

благодаря

Прямо сейчас, .NET не поддерживает разделы (ака Memory Mapped Files). В скором времени версия 4.0 будет иметь пространство имен System.IO.MemoryMappedFiles. Существует веская причина, по которой это заняло так много времени, а также причина, по которой вы не будете довольны этим дополнением. Использование указателей является обязательным в MMF, разделяемая память предоставляется по определенному адресу. Чтобы разделить значение, вам нужно будет написать его по определенному адресу.

Указатели, однако, принципиально несовместимы с моделью управляемой памяти. Объекты создаются в мусорной куче, сборщик перемещает их по мере необходимости, чтобы сохранить кучу уплотненной. На управляемом языке у вас есть ссылка на такой объект, также известный как «отслеживающий дескриптор». Эквивалент C / C ++ – это указатель, но он один с колокольчиками, сборщик мусора всегда может найти его и обновить его значение. CLR поддерживает понятие «pinning», оно преобразует ссылку на указатель. Он реализует это, помещая объект как несменяемый. Однако это не помогает реализовать разделяемую память через MMF, объект закрепляется в куче GC вместо адреса виртуальной памяти, где находится вид MMF.

Чтобы сделать работу MMF, объект нужно скопировать из кучи GC в общую память. Это требует сериализации. Класс .NET 4.0 называется MemoryMappedViewStream. Вероятно, вы можете увидеть, где это происходит, это неотличимо от использования именованного канала или сокета. Получение данных в MMF и из них требует такого же объема усилий. MMF просто немного эффективнее, потому что основной буфер не находится в пуле памяти ядра.

Вы можете сломать rulez и сделать это сегодня. Вы можете P / вызывать CreateFileMapping, OpenFileMapping и MapViewOfFile, вам нужно создать MMF. И используйте ключевое слово unsafe, чтобы вы могли создавать указатели. Вам нужно будет использовать типы значений (например, struct) для разделяемых элементов памяти или использовать class Marshal.

IPC

Если вы говорите об Inter Process Communication. Существует несколько возможностей, таких как сокеты tcp / udp, почтовые ящики, именованные каналы, файлы с отображением памяти, сообщения Windows и т. Д.

.Net также предлагает несколько IPC более высокого уровня, такие как .Net remoting и WCF, которые используют предыдущие упомянутые методы. Вы можете прочитать об этом здесь .

Файлы с памятью

Если вы действительно хотите поделиться блоком памяти вместо связи, то, возможно, файлы с отображением памяти – это то, что вы хотите. .Net 4.0 имеет MemoryMappedFile для этого. Если вы не используете или не можете использовать .Net 4.0, вы можете реализовать его самостоятельно, как в этом примере win32 . Или вы можете попробовать этот код или посмотреть, можете ли вы использовать MemoryMappedFileStream, упомянутый здесь и здесь . Или используйте этот class FileMap .

Используйте именованный канал .

Это механизм, который позволяет одному процессу записывать последовательные данные в stream, из которого может считываться другой процесс.

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

Как уже упоминалось, используйте Memory Mapped Files. Реализация для .NET <4 доступна по адресу: http://github.com/tomasr/filemap/
Я использовал, и он работает безупречно. У вас могут быть некоторые проблемы с безопасностью при совместном использовании процессов с повышенным / не повышенным уровнем – решение состоит в том, чтобы инициализировать файл с отображением памяти в повышенном процессе и соответствующим образом установить его атрибуты безопасности.

  • Поиск диапазона адресов сегмента данных
  • Как установить максимальное использование памяти для JVM?
  • Массивы на Java и то, как они хранятся в памяти
  • C ++ 11 реализация и модель памяти
  • Увеличьте настройки памяти Tomcat
  • Как очистить память, чтобы предотвратить «ошибку из памяти» в excel vba?
  • Использование Java ReferenceQueue
  • Пустое пространство Java из памяти
  • Правильное использование стека и кучи в C ++?
  • Разница между указателем на ссылку и ссылкой на указатель
  • Измерение полосы пропускания памяти из точечного продукта двух массивов
  • Давайте будем гением компьютера.