Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 2494|Odpowiedź: 1

[Napiwki] Dwie lub trzy rzeczy o wspólnej pamięci

[Skopiuj link]
Opublikowano 23.07.2024 14:50:48 | | | |
Uczestnicząc w relokacji starego systemu, gdzie do komunikacji między procesami (np. wywołując ASP.NET Window Service), jest zmuszony zrozumieć znaczenie tej technologii. Niepopularna technologia deweloperów NET, specjalne uwagi.

[Czym jest pamięć współdzielona?] 】
Istnieje termin komunikacji międzyprocesowej, Interprocess Communictaion (IPC), który na platformie Windows oferuje następujące opcje: Źródło:Logowanie do linku jest widoczne.

Schowek
Program A wkleja zawartość do schowka, a Program B pobiera zawartość z niej.
COM
OLE Compound Document pozwala osadzać pliki Word w arkuszach Excel, a Excel można wywołać do edycji dwoma kliknięciami.
Kopia danych
Program A wysyła WM_COPYDATA wiadomości do Programu B w uzgodnionym formacie
DDE
DDE to protokół komunikacyjny, który pozwala różnym aplikacjom wymieniać dane w różnych formatach, co można traktować jako rozszerzenie schowka i może być przesyłany w sposób ciągły, oprócz jednorazowych transferów. (Stosunkowo słabe wyniki, obecnie nie zalecane)
Mapowanie plików
Mapowanie plików odnosi się do symulacji pliku jako fragmentu pamięci w procesie, gdy wiele aplikacji wymienia dane poprzez współdzielone mapowanie plików, zwane nazwaną pamięcią współdzieloną, która jest najlepszą wydajnością spośród różnych metod IPC, ale musi być zapobiegana przez mechanizmy synchronizacji, takie jak Mutex.
Sloty pocztowe
Komunikacja jednokierunkowa, klient Mailslot wysyła wiadomości do serwera Mailslot, a wiadomości są usuwane po odczytaniu przez serwer, obsługując transmisję między maszynami i mogą być również rozgłaszane jeden do wielu. (Długość wiadomości rozgłaszanej jest ograniczona do 400 bajtów, a długość wiadomości jest ustalana przez Mailslot Server podczas jego ustanawiania do transmisji jeden do jednego)
Dudy
Transmisja dwukierunkowa dzieli się na Anonimową Rurę i Nazwaną Rurę. Anonymous Pipe jest zazwyczaj używany do standardowej orientacji wejścia/wyjścia między programem nadrzędnym a programem potomnym, a do komunikacji dwukierunkowej powinny być zbudowane dwa potoki, które nie mogą być dostępne w sieci i ograniczone do procesów z zależnymi relacjami. Nazwa Pipe może być używana do wymiany danych między dowolnym procesem i wspierać transfer procesów między sieciami.
RPC
Zdalne wywołanie procedur (RPC) pozwala aplikacjom wywoływać funkcje dostarczane przez inne aplikacje i mogą być wywoływane w sieciach. Windows RPC jest zgodny ze standardem ISO DCE i obsługuje integrację międzysystemową systemu operacyjnego.
Gniazda Windows
Abstrakcyjny interfejs komunikacyjny oparty na TCP/IP lub innych protokołach sieciowych, a wymiana danych odbywa się poprzez połączenia sieciowe na dolnej warstwie.
Pamięć współdzielona to powszechna metoda wymiany danych używana przez programistów C/C++ (Google znajduje wiele przykładów IPC zaimplementowanych za pomocą pamięci współdzielonej na Linuksie), dlatego deweloperzy C/C++ często wybierają ją jako kanał komunikacji na platformie Windows.

【Ćwiczenie praktyczne wspólnej pamięci】
Chociaż korzysta z niej mniej osób, .NET ma wbudowaną przestrzeń nazw System.IO.MemoryMappedFiles, nie jest trudno odtwarzać pamięć współdzieloną, prawie tak jak pliki operacyjne, jeśli masz doświadczenie w operacjach związanych z FileStream, możesz szybko zacząć, patrz na przykład MSDN, napisałem mini ćwiczenie programowe.Logowanie do linku jest widoczne.

Napisałem dwa programy: ProcessA, aby utworzyć przestrzeń o pojemności 1024 bajtów za pomocą MemoryMappedFile.CreateNew() oraz ćwiczyć przekazywanie i łapanie z drugim ProcessB. Ponieważ 1024 bajty są współdzielone przez dwa programy, planuję, że pierwsze 512 będzie zapisanych przez ProcesA w procesie B, a ostatnie 512 jako proces B zapisanych do odczytu przez proces A, a program używa CreateViewStream do przekazania adresu startowego i długości wskazującej na własny obszar. Aby uniknąć konfliktów odczytu/zapisu, gdy ProcessA i ProcessB mają dostęp do pliku MemoryMappedFile, używam blokady Mutex, aby kontrolować, że tylko jeden proces może jednocześnie uzyskać dostęp do pliku MemoryMapped. Proces testowy tworzy plik MemoryMappedFile dla ProcesuA, zapisuje ciąg wiadomości – > ProcesB odczytuje ciąg wiadomości i zapisuje ciąg odpowiedzi – > ProcesA odczytuje ciąg odpowiedzi i kończy proces.

Procedura ProcessA wygląda następująco:

Procedura ProcessB wygląda następująco:

Test zakończył się sukcesem!



【Dodatkowe wskazówki】

1. Jak wyświetlić plik MemoryMappedFile, który jest obecnie włączony w Windows?

SystemInternals posiada narzędzie AccessChk, które wymienia wszystkie pliki, foldery, rejestry, obiekty i usługi Windows dostępne w Windowsie. MemoryMappedFile to obiekt Windows, a możesz użyć następującego polecenia, aby wypisać wszystkie obiekty i je zarchiwizować
accesschk -osv > e:\objList.txt
Wyszukaj w nim nazwę MemoryMappedFile i jeśli istnieje, możesz zobaczyć rekord podobny do następującego:
\Sesje\1\PodstawoweNameObiekty\DARKTHREAD
  Typ: Sekcja
  Średni poziom obowiązkowy (domyślny) [Bez upomnienia]
  RW NT AUTHORITY\SYSTEM
    SECTION_ALL_ACCESS
  RW DOMAIN\UserName
    SECTION_ALL_ACCESS
  RW DOMAIN\UserName-S-1-5-5-0-954410
    SECTION_ALL_ACCESS

Pobierz narzędzie AccessChk:Logowanie do linku jest widoczne.

2. Preset MemoryMappedFile jest włączony w sesji użytkownika i nie może być używany między sesjami. Na przykład, jeśli dwa ASP.NET należące do różnych AppPoolów mają różne tożsamości wykonawcze, nawet jeśli nazwa MemoryMappedFile jest taka sama, to nadal jest to jedna kopia każdego z nich, więc konieczne jest potwierdzenie, że tożsamość wykonania używana przez obie strony jest taka sama.

3. Aby komunikować się między różnymi tożsamościami wykonawczymi, MemoryMappedFile można nazwać "Global\ Filename" (warto zauważyć, że przypadek Global jest inny, nadepnąłem na grzmot, który został błędnie zapisany jako GLOBAL path is nieprawidłowy), aby można było do niego uzyskać dostęp przez różne tożsamości wykonawcze.
Należy jednak zauważyć, że procesy inne niż Sesja 0 (usługa Windows) muszą posiadać uprawnienia SeCreateGlobalPrivilege, aby utworzyć globalną\... MemoryMappedFile。 (Plik MSDN)
Sesję 0 można znaleźć w artykule MVP po drugiej stronie – Penetrating Session 0 Isolation (1) (Logowanie do linku jest widoczne.Zawiera bardzo szczegółowe wprowadzenie.

Przedruk z:Logowanie do linku jest widoczne.





Poprzedni:Problem z statycznym ładowaniem zasobów na obrazie Angular 18
Następny:Szybko zapoznaj się ze strukturą zawartości plików Bootstrap 5
 Ziemianin| Opublikowano 10.08.2024 21:36:57 |
.NET/C# implementuje program singleton na podstawie Mutex i MemoryMappedFile
https://www.itsvse.com/thread-10808-1-1.html
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com