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.
|