Participând la relocarea unui sistem vechi, unde Memoria Partajată este folosită pentru a comunica între procese (de exemplu, apelând serviciul ferestre ASP.NET), este forțat să înțeleagă importanța acestei tehnologii. Tehnologia nepopulară a dezvoltatorilor NET, note speciale.
[Ce este Memoria Împărtășită?] 】 Există un termen pentru comunicarea între procese, Interprocess Communictaion (IPC), care are următoarele opțiuni pe platforma Windows: Referință:Autentificarea cu hyperlink este vizibilă.
Clipboard Programul A lipește conținutul în clipboard, iar Program B recuperează conținutul din clipboard. COM OLE Compound Document permite încorporarea fișierelor Word în foi de lucru Excel, iar Excel poate fi apelat pentru editare cu două click-uri. Copiere de date Programul A trimite WM_COPYDATA mesaje către Programul B în formatul convenit DDE DDE este un protocol de comunicații care permite diferitelor aplicații să schimbe date în formate diferite, ceea ce poate fi considerat o extensie a clipboard-ului și poate fi transferat continuu, pe lângă transferurile unice. (Performanță relativ slabă, nu mai este recomandată) Maparea fișierelor Maparea fișierelor se referă la simularea unui fișier ca pe o bucată de memorie într-un proces, atunci când mai multe aplicații schimbă date prin mapare partajată a fișierelor, numită Memorie Partajată cu Nume, care reprezintă cea mai bună performanță dintre diverse metode IPC, dar trebuie prevenită prin mecanisme de sincronizare precum Mutex. Sloturi de corespondență Comunicare unidirecțională, Mailslot Client trimite mesaje către Mailslot Server, iar mesajele sunt șterse după ce sunt citite de server, suportând transmisia între mașini și pot fi de asemenea transmise unu-la-mulți. (Lungimea mesajului difuzat este limitată la 400 de octeți, iar lungimea mesajului este determinată de Mailslot Server atunci când este stabilit pentru transmisie unu-la-unu) Tevi Transmisia bidirecțională este împărțită în Țeavă Anonimă și Țeavă Denumită. Conducta anonimă este folosită în general pentru orientarea standard de intrare/ieșire între programul părinte și programul copil, iar două conducte ar trebui construite pentru comunicare bidirecțională, care nu pot fi deplasate pe rețea și sunt limitate la procese cu relații dependente. Conducta numită poate fi folosită pentru a schimba date între orice proces și poate susține transferul de procese între rețele. RPC Apelul de procedură la distanță (RPC) permite aplicațiilor să apeleze funcții oferite de alte aplicații și poate fi apelat prin rețele. Windows RPC respectă standardul ISO DCE și suportă integrarea între sisteme de operare. Priză Windows Interfața abstractă de comunicare bazată pe TCP/IP sau alte protocoale de rețea, iar schimbul de date se realizează prin conexiuni de rețea la stratul inferior. Memoria partajată este o metodă comună de schimb de date folosită de dezvoltatorii C/C++ (Google poate găsi multe exemple de IPC implementate cu Shared Memory pe Linux), astfel că dezvoltatorii C/C++ o aleg adesea ca canal de comunicare pe platforma Windows.
【Exercițiu Practic de Memorie Împărtășită】 Deși sunt mai puțini oameni care îl folosesc, .NET are un spațiu de nume integrat System.IO.MemoryMappedFiles, nu este dificil să redai Shared Memory, aproape la fel ca fișierele de operare, atâta timp cât ai experiență în operațiuni legate de FileStream, poți începe rapid, vezi exemplul MSDN, am scris un mini-exercițiu de program.Autentificarea cu hyperlink este vizibilă.
Am scris două programe, ProcessA, pentru a crea un spațiu de 1024 de octeți cu MemoryMappedFile.CreateNew() și am exersat pasa și recepția cu celălalt ProcesB. Deoarece 1024 de octeți sunt împărțiți între două programe, plănuiesc ca primii 512 să fie ProcesA scriși pe ProcesB, iar ultimii 512 să fie scriși de ProcesB pentru a citi ProcesulA, iar programul folosește CreateViewStream pentru a transmite adresa de start și lungimea pentru a indica propria sa arie. Pentru a evita conflictele de citire/scriere atunci când Procesele A și Procesele B accesează MemoryMappedFile, folosesc blocarea Mutex pentru a controla că doar un singur Proces poate accesa MemoryMappedFile simultan. Procesul de testare creează un MemoryMappedFile pentru ProcesA, scrie șirul de mesaje – > ProcesB citește șirul de mesaje și scrie șirul de răspuns – > ProcesA citește șirul de răspuns și se încheie.
Procedura ProcesA este următoarea:
Procedura ProcesB este următoarea:
Testul a fost un succes!
【Sfaturi suplimentare】
1. Cum pot vizualiza fișierul MemoryMappedFile care este activat în prezent în Windows?
SystemInternals are un instrument AccessChk care listează toate fișierele, folderele, registrele, obiectele și serviciile Windows accesibile pentru Windows. MemoryMappedFile este un obiect Windows și poți folosi următoarea comandă pentru a lista toate obiectele și a le arhiva accesschk -osv > e:\objList.txt Caută numele MemoryMappedFile în el și, dacă există, poți vedea o înregistrare similară cu următoarea: \Sesiuni\1\ObiecteDeBază\ÎNTUNECAT Tip: Secțiune Nivel Mediu Obligatoriu (Implicit) [Fără Scriere] AUTORITATE/SISTEM RW NT SECTION_ALL_ACCESS RW DOMENIU\Nume de utilizator SECTION_ALL_ACCESS DOMENIU RW\NumeUtilizator-S-1-5-5-0-954410 SECTION_ALL_ACCESS
Descărcare a uneltei AccessChk:Autentificarea cu hyperlink este vizibilă.
2. Presetarea MemoryMappedFile este activată în sesiunea utilizatorului, iar presetarea nu poate fi folosită între sesiuni. De exemplu, dacă două ASP.NET aparținând AppPool-urilor diferite au identități de execuție diferite, chiar dacă numele MemoryMappedFile este același, tot este o copie a fiecăruia, deci este necesar să se confirme că identitatea de execuție folosită de ambele părți este aceeași.
3. Pentru a comunica între diferite identități de execuție, MemoryMappedFile poate fi numit "Global\ Filename" (rețineți că cazul Global este diferit, am călcat pe tunetul care a fost scris greșit ca GLOBAL path este invalid), astfel încât să poată fi accesat între identitățile de execuție. Totuși, trebuie menționat că alte procese în afară de Session 0 (Windows Service) trebuie să aibă permisiunea SeCreateGlobalPrivilege pentru a crea un Global\... MemoryMappedFile。 (Fișier MSDN) Pentru Sesiunea 0, puteți consulta acest articol de la MVP pe cealaltă parte - Penetrating Session 0 Isolation (1) (Autentificarea cu hyperlink este vizibilă.Există o introducere foarte detaliată.
Reprodus din:Autentificarea cu hyperlink este vizibilă.
|