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

Вид: 2494|Ответ: 1

[Чаевые] Две или три вещи о Общей памяти

[Скопировать ссылку]
Опубликовано 23.07.2024 14:50:48 | | | |
Участие в перемещении старой системы, где используется общая память для взаимодействия между процессами (например, вызов Window Service ASP.NET), и необходимость осознать важность этой технологии. Непопулярная технология разработчиков NET, особые замечания.

[Что такое общая память?] 】
Существует термин для межпроцессной коммуникации — Interprocess Communictaion (IPC), который на платформе Windows имеет следующие опции: Ссылка:Вход по гиперссылке виден.

Буфер обмена
Программа A вставляет содержимое в буфер обмена, а программа B забирает его из буфера обмена.
COM
OLE Compound Document позволяет встраивать файлы Word в рабочие листы Excel, а Excel можно вызвать для редактирования двумя кликами.
Копирование данных
Программа A отправляет WM_COPYDATA сообщения в Программу B в согласованном формате
DDE
DDE — это протокол связи, который позволяет разным приложениям обмениваться данными в разных форматах, что можно рассматривать как расширение буфера обмена и передавать их непрерывно, помимо одноразовых передач. (Относительно слабая производительность, больше не рекомендуется)
Отображение файлов
Отображение файлов — это моделирование файла как части памяти в процессе, когда несколько приложений обмениваются данными через совместное отображение файлов, называемое Named Shared Memory, которое является лучшим показателем производительности среди различных методов IPC, но должно быть предотвращено синхронизационными механизмами, такими как Mutex.
Почтовые слоты
Односторонняя связь: Mailslot Client отправляет сообщения на Mailslot Server, и сообщения удаляются после чтения сервером, что поддерживает межмашинную передачу, а также может передаваться один к многим. (Длина широковещательного сообщения ограничена 400 байтами, а длина сообщения определяется сервером Mailslot при его установлении для передачи один к одному)
Трубы
Двунаправленная передача делится на анонимную трубу и именную трубу. Анонимная труба обычно используется для стандартной ориентации ввода/вывода между родительской и дочерней программами, и для двусторонней связи следует строить два канала, которая не может быть по сети и ограничена процессами с зависимыми отношениями. Именованный канал может использоваться для обмена данными между любыми процессами и поддерживать межсетевую передачу процессов.
RPC
Remote Procedure Call (RPC) позволяет приложениям вызывать функции, предоставляемые другими приложениями, и вызывать их между сетями. Windows RPC соответствует стандарту ISO DCE и поддерживает интеграцию между операционными системами.
Сокеты Windows
Абстрактный интерфейс связи на основе TCP/IP или других сетевых протоколов, а обмен данными осуществляется через сетевые соединения на нижнем уровне.
Shared Memory — это распространённый метод обмена данными, используемый разработчиками C/C++ (Google может найти множество примеров IPC, реализованного с Shared Memory на Linux), поэтому разработчики C/C++ часто выбирают его в качестве канала связи на платформе Windows.

【Практическое упражнение на совместную память】
Хотя пользователей меньше, .NET имеет встроенное пространство имён System.IO.MemoryMappedFiles, играть в Shared Memory несложно, почти так же, как и с операционными файлами, если у вас есть опыт работы с операциями, связанными с FileStream, можно быстро начать, см. пример с MSDN, я написал мини-программное упражнение.Вход по гиперссылке виден.

Я написал две программы: ProcessA, чтобы создать пространство в 1024 байта с помощью MemoryMappedFile.CreateNew() и практиковать передачу и ловлю с другим ProcessB. Поскольку 1024 байта разделяются двумя программами, я планирую, чтобы первые 512 были записаны в ProcessB, а последние 512 — ProcessB — в чтение ProcessA, а программа использует CreateViewStream для передачи начального адреса и длины для указания на свою область. Чтобы избежать конфликтов чтения/записи при обращении ProcessA и ProcessB к MemoryMappedFile, я использую блокировку Mutex, чтобы контролировать, что только один процесс может одновременно получить доступ к MemoryMappedFile. Тестовый процесс создаёт MemoryMappedFile для ProcessA, записывает строку сообщения — > ProcessB читает строку сообщения и записывает строку ответа — > ProcessA читает строку ответа и заканчивает.

Процедура ProcessA выглядит следующим образом:

Процедура ProcessB следующая:

Тест прошёл успешно!



【Дополнительные советы】

1. Как просмотреть MemoryMappedFile, который сейчас включён в Windows?

SystemInternals использует инструмент AccessChk, который перечисляет все файлы, папки, реестры, объекты и сервисы Windows, доступные для Windows. MemoryMappedFile — это объект Windows, и вы можете использовать следующую команду, чтобы перечислить все объекты и их архивировать
accesschk -osv > e:\objList.txt
Найдите имя MemoryMappedFile в нём, и если оно существует, вы увидите запись, похожую на следующую:
\Sessions\1\BaseNamedObjects\DARKTHREAD
  Тип: Секция
  Средний обязательный уровень (по умолчанию) [без записи]
  RW NT AUTHORITY\SYSTEM
    SECTION_ALL_ACCESS
  RW ДОМЕН\Имя пользователя
    SECTION_ALL_ACCESS
  RW DOMAIN\UserName-S-1-5-5-0-954410
    SECTION_ALL_ACCESS

Скачать инструмент AccessChk:Вход по гиперссылке виден.

2. Пресет MemoryMappedFile включён в сессии пользователя, и этот пресет не может использоваться между сессиями. Например, если два ASP.NET, относящиеся к разным AppPools, имеют разные идентичности выполнения, даже если имя MemoryMappedFile совпадает, это всё равно одна копия каждого, поэтому необходимо убедиться, что идентичность выполнения, используемая обеими сторонами, совпадает.

3. Для взаимодействия между разными идентичностями исполнения MemoryMappedFile можно назвать «Global\ Filename» (обратите внимание, что случай Global отличается, я наступил на гром, ошибочно записанный как невалидный путь GLOBAL), чтобы к нему можно было обращаться между идентичностями исполнения.
Однако следует отметить, что процессы, отличные от Сессии 0 (Windows Service), должны иметь разрешение SeCreateGlobalPrivilege для создания Global\... MemoryMappedFile。 (Файл MSDN)
Для сессии 0 вы можете ознакомиться с этой статьей MVP с другой стороны — Проникновение в Сессию 0 Изоляция (1) (Вход по гиперссылке виден.В нём есть очень подробное введение.

Перепечатано из:Вход по гиперссылке виден.





Предыдущий:Проблема статической нагрузки на 18 изображений
Следующий:Получите краткий обзор структуры содержимого файлов Bootstrap 5
 Хозяин| Опубликовано 10.08.2024 21:36:57 |
.NET/C# реализует программу singleton на базе Mutex и MemoryMappedFile
https://www.itsvse.com/thread-10808-1-1.html
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com