Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 2494|Svar: 1

[Tips] Två eller tre saker om delat minne

[Kopiera länk]
Publicerad på 2024-07-23 14:50:48 | | | |
Deltagande i omlokalisering av ett gammalt system, där delat minne används för att kommunicera mellan processer (t.ex. anropa Window Service ASP.NET), och tvingas förstå vikten av denna teknik. NET-utvecklares impopulära teknik, särskilda noteringar.

[Vad är delat minne?] 】
Det finns en term för kommunikation mellan processer, Interprocess Communictaion (IPC), som har följande alternativ på Windows-plattformen: Referens:Inloggningen med hyperlänken är synlig.

Urklipp
Program A klistrar in innehållet i urklippet, och Program B hämtar innehållet från urklippet.
COM
OLE Compound Document tillåter att Word-filer bäddas in i Excel-arbetsblad, och Excel kan öppnas för redigering med två klick.
Datakopia
Program A skickar WM_COPYDATA meddelanden till Program B i det överenskomna formatet
DDE
DDE är ett kommunikationsprotokoll som tillåter olika applikationer att utbyta data i olika format, vilket kan betraktas som en förlängning av urklippet och kan överföras kontinuerligt utöver engångsöverföringar. (Relativt dålig prestanda, rekommenderas inte längre)
Filmappning
Filmappning syftar på att simulera en fil som en minnesbit i en process, när flera applikationer utbyter data genom delad filmappning, kallad namngiven delad minne, vilket är den bästa prestandan bland olika IPC-metoder, men måste förhindras av synkroniseringsmekanismer som Mutex.
Postluckor
Envägskommunikation, Mailslot-klienten skickar meddelanden till Mailslot Server, och meddelandena raderas efter att ha lästs av servern, vilket stödjer överföring över maskiner och kan även sändas en-till-många. (Längden på broadcastmeddelandet är begränsad till 400 byte, och meddelandets längd bestäms av Mailslot-servern när den upprättas för en-till-en-överföring)
Rör
Tvåvägsöverföring är indelad i Anonym Pipe och Named Pipe. Anonymous Pipe används vanligtvis för den standardiserade in-/utmatningsorienteringen mellan föräldraprogrammet och barnprogrammet, och två pipes bör byggas för tvåvägskommunikation, vilket inte kan ske över nätverket och är begränsat till processer med beroende relationer. Named Pipe kan användas för att utbyta data mellan vilken process som helst och stödja processöverföring över nätverk.
RPC
Remote Procedure Call (RPC) gör det möjligt för applikationer att anropa funktioner som tillhandahålls av andra applikationer och kan anropas över nätverk. Windows RPC följer ISO DCE-standarden och stödjer integration mellan operativsystem.
Windowsuttag
Abstrakt kommunikationsgränssnitt baserat på TCP/IP eller andra nätverksprotokoll, och datautbyte sker via nätverksanslutningar i bottenlagret.
Delat minne är en vanlig metod för datautbyte som används av C/C++-utvecklare (Google kan hitta många exempel på IPC implementerat med delat minne på Linux), så C/C++-utvecklare väljer ofta det som kommunikationskanal på Windows-plattformen.

【Delat minne praktiskt övning】
Även om det är färre som använder det, har .NET ett inbyggt System.IO.MemoryMappedFiles-namnrymd, det är inte svårt att spela Shared Memory, nästan som operativsystem, så länge du har erfarenhet av FileStream-relaterade operationer kan du komma igång snabbt, se MSDN-exemplet, jag skrev en mini-programövning.Inloggningen med hyperlänken är synlig.

Jag skrev två program, ProcessA för att skapa ett utrymme på 1024 byte med MemoryMappedFile.CreateNew() och öva på att passa och fånga med den andra ProcessB. Eftersom 1024 byte delas av två program planerar jag att de första 512 ska vara ProcessA-skrivna till ProcessB och de sista 512 som ProcessB-skrivna till ProcessA-läsning, och programmet använder CreateViewStream för att skicka in startadress och längd för att peka på sitt eget område. För att undvika läs-/skrivkonflikter när ProcessA och ProcessB kommer åt MemoryMappedFile använder jag Mutex-lås för att kontrollera att endast en process kan komma åt MemoryMappedFile åt gången. Testprocessen skapar en MemoryMappedFile för ProcessA, skriver meddelandesträngen – > ProcessB läser meddelandesträngen och skriver svarssträngen – > ProcessA läser svarssträngen och avslutar.

ProcessA-proceduren är följande:

ProcessB-proceduren är följande:

Testet var framgångsrikt!



【Kompletterande tips】

1. Hur visar jag MemoryMappedFile som för närvarande är aktiverad i Windows?

SystemInternals har ett AccessChk-verktyg som listar alla filer, mappar, register, objekt och Windows-tjänster som är tillgängliga för Windows. MemoryMappedFile är ett Windows-objekt, och du kan använda följande kommando för att lista alla objekt och arkivera dem
accesschk -osv > e:\objList.txt
Leta efter namnet på MemoryMappedFile i den, och om det finns kan du se en post liknande följande:
\Sessions\1\BaseNamedObjects\DARKTHREAD
  Typ: Sektion
  Medelnivå obligatorisk (Standard) [Ingen varning]
  RW NT AUTHORITY\SYSTEM
    SECTION_ALL_ACCESS
  RW DOMAIN\Användarnamn
    SECTION_ALL_ACCESS
  RW DOMAIN\Användarnamn-S-1-5-5-0-954410
    SECTION_ALL_ACCESS

AccessChk-verktyget nedladdning:Inloggningen med hyperlänken är synlig.

2. MemoryMappedFile-förinställningen är aktiverad i användarens session, och förinställningen kan inte användas mellan sessioner. Till exempel, om två ASP.NET som tillhör olika AppPools har olika exekveringsidentiteter, även om MemoryMappedFile-namnet är detsamma, är det ändå en kopia av varje, så det är nödvändigt att bekräfta att exekveringsidentiteten som används av båda parter är densamma.

3. För att kommunicera mellan olika exekveringsidentiteter kan MemoryMappedFile kallas "Global\ Filename" (observera att fallet med Global är annorlunda, jag trampade på åskan som felaktigt skrivits som GLOBAL path är ogiltig), så att den kan nås över exekveringsidentiteter.
Det bör dock noteras att processer utöver Session 0 (Windows Service) måste ha SeCreateGlobalPrivilege-behörighet för att skapa en Global\... MemoryMappedFile。 (MSDN-fil)
För Session 0 kan du hänvisa till denna artikel av MVP på andra sidan – Penetrerande Session 0 Isolering (1) (Inloggningen med hyperlänken är synlig.Det finns en mycket detaljerad introduktion i den.

Återutgiven från:Inloggningen med hyperlänken är synlig.





Föregående:Problem med statisk resursladdning för Angular 18 bilder
Nästa:Få en snabb översikt över Bootstrap 5:s filinnehållsstruktur
 Hyresvärd| Publicerad på 2024-08-10 21:36:57 |
.NET/C# implementerar programmet singleton baserat på Mutex och MemoryMappedFile
https://www.itsvse.com/thread-10808-1-1.html
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com