Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 2494|Отговор: 1

[Бакшиши] Две или три неща за споделената памет

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

[Какво е споделена памет?] 】
Съществува термин за междупроцесна комуникация, Interprocess Communictaion (IPC), който има следните опции на платформата Windows: Референция:Входът към хиперлинк е видим.

Клипборда
Програма А поставя съдържанието в клипборда, а Програма Б го извлича от клипборда.
COM
OLE Compound Document позволява Word файлове да бъдат вградени в Excel работни листове, а Excel може да бъде извикан за редактиране с два клика.
Копиране на данни
Програма А изпраща WM_COPYDATA съобщения към Програма Б в договорения формат
DDE
DDE е комуникационен протокол, който позволява на различни приложения да обменят данни в различни формати, което може да се разглежда като разширение на клипборда и може да се предава непрекъснато, освен еднократни трансфери. (Относително слабо представяне, вече не се препоръчва)
Файлово съпоставяне
Файловото съпоставяне се отнася до симулиране на файл като част от паметта в процес, когато множество приложения обменят данни чрез споделено картографиране на файлове, наречено Named Shared Memory, което е най-добрата производителност сред различните IPC методи, но трябва да бъде предотвратено от синхронизиращи механизми като Mutex.
Пощенски слотове
Еднопосочна комуникация, Mailslot Client изпраща съобщения към Mailslot Server, а съобщенията се изтриват след като бъдат прочетени от сървъра, което поддържа трансмисия между машини и може да се излъчва един към много. (Дължината на излъчваното съобщение е ограничена до 400 байта, а дължината на съобщението се определя от Mailslot сървъра, когато е установен за един-на-едно предаване)
Тръби
Двупосочното предаване е разделено на анонимна тръба и именувана тръба. Anonymous Pipe обикновено се използва за стандартната входно-изходна ориентация между родителската и дъщерната програма, като трябва да се изграждат два канала за двупосочна комуникация, която не може да бъде през мрежата и е ограничена до процеси с зависими връзки. Именуваната тръба може да се използва за обмен на данни между всеки процес и да поддържа трансфер между различни мрежи.
RPC
Remote Procedure Call (RPC) позволява на приложенията да извикват функции, предоставени от други приложения, и могат да бъдат извиквани между мрежи. Windows RPC отговаря на стандарта ISO DCE и поддържа интеграция между различни операционни системи.
Windows сокети
Абстрактен комуникационен интерфейс, базиран на TCP/IP или други мрежови протоколи, а обменът на данни се осъществява чрез мрежови връзки на долния слой.
Споделената памет е често използван метод за обмен на данни, използван от разработчиците на 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 да бъдат ProcessA записани в ProcessB, а последните 512 да бъдат ProcessB записани за четене на ProcessA, а програмата използва CreateViewStream, за да въведе началния адрес и дължината, за да посочи към собствената си област. За да избегна конфликти при четене/запис, когато ProcessA и ProcessB имат достъп до MemoryMappedFile, използвам Mutex lock, за да контролирам, че само един Process може да има достъп до 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 DOMAIN\UserName
    SECTION_ALL_ACCESS
  RW DOMAIN\Потребителско име-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