Účasť na presune starého systému, kde sa zdieľaná pamäť používa na komunikáciu medzi procesmi (napr. volanie Window Service ASP.NET), a je nútený pochopiť dôležitosť tejto technológie. Nepopulárna technológia vývojárov NET, špeciálne poznámky.
[Čo je zdieľaná pamäť?] 】 Existuje pojem pre komunikáciu medzi procesmi, Interprocess Communication (IPC), ktorý má na platforme Windows nasledujúce možnosti: Referencia:Prihlásenie na hypertextový odkaz je viditeľné.
Schránka Program A vloží obsah do schránky a Program B obsah z klipbordu získa. COM OLE Compound Document umožňuje vkladať Word súbory do Excel pracovných listov a Excel je možné vyvolať na úpravu dvoma kliknutiami. Kópia dát Program A posiela WM_COPYDATA správy programu B v dohodnutom formáte DDE DDE je komunikačný protokol, ktorý umožňuje rôznym aplikáciám vymieňať si dáta v rôznych formátoch, čo možno považovať za rozšírenie schránky a môže byť prenášaný nepretržite okrem jednorazových prenosov. (Relatívne slabý výkon, už sa neodporúča) Mapovanie súborov Mapovanie súborov označuje simuláciu súboru ako časti pamäte v procese, keď viaceré aplikácie vymieňajú dáta prostredníctvom zdieľaného mapovania súborov, nazývaného Named Shared Memory, čo je najlepší výkon spomedzi rôznych IPC metód, ale musí byť zabránené synchronizačnými mechanizmami, ako je Mutex. Poštové sloty Jednosmerná komunikácia, Mailslot klient odosiela správy na Mailslot Server, ktoré sú po prečítaní serverom vymazané, čo podporuje prenos medzi strojmi a môže byť tiež vysielané jeden na viac. (Dĺžka vysielanej správy je obmedzená na 400 bajtov a dĺžku správy určuje Mailslot Server pri jeho vytvorení pre prenos jeden na jedného) Gajdy Obojsmerný prenos sa delí na anonymnú rúru a pomenovanú rúru. Anonymous Pipe sa zvyčajne používa na štandardnú orientáciu vstup/výstup medzi rodičovským programom a podprogramom a pre obojsmernú komunikáciu, ktorá nemôže byť cez sieť a je obmedzená na procesy s závislými vzťahmi, by mali byť postavené dva potrubia. Named Pipe môže byť použitý na výmenu dát medzi akýmkoľvek procesom a podporu prenosu procesov medzi sieťami. RPC Vzdialené volanie procedúry (RPC) umožňuje aplikáciám volať funkcie poskytované inými aplikáciami a môžu byť volané naprieč sieťami. Windows RPC je v súlade so štandardom ISO DCE a podporuje integráciu naprieč operačnými systémami. Sockety pre Windows Abstraktné komunikačné rozhranie založené na TCP/IP alebo iných sieťových protokoloch a výmena dát prebieha prostredníctvom sieťových spojení na spodnej vrstve. Zdieľaná pamäť je bežná metóda výmeny dát používaná vývojármi C/C++ (Google nájde mnoho príkladov IPC implementovaných so zdieľanou pamäťou na Linuxe), preto ju vývojári C/C++ často vyberajú ako komunikačný kanál na platforme Windows.
【Praktické cvičenie zdieľanej pamäti】 Aj keď ho používa menej ľudí, .NET má zabudovaný menný priestor System.IO.MemoryMappedFiles, nie je ťažké hrať Shared Memory, takmer rovnako ako operačné súbory, pokiaľ máte skúsenosti s operáciami súvisiacimi so FileStream, môžete začať rýchlo, pozrite si príklad MSDN, napísal som mini programové cvičenie.Prihlásenie na hypertextový odkaz je viditeľné.
Napísal som dva programy, ProcessA na vytvorenie priestoru 1024 bajtov pomocou MemoryMappedFile.CreateNew() a precvičoval som passing a catching s druhým ProcessB. Keďže 1024 bajtov zdieľajú dva programy, plánujem, že prvých 512 bude ProcessA zapísaných do ProcessB a posledných 512 bude ProcessB zapísaných do ProcessA read, pričom program používa CreateViewStream na zadávanie počiatočnej adresy a dĺžky na ukazovanie do vlastnej oblasti. Aby som predišiel konfliktom čítania/zápisu pri prístupe ProcessA a ProcessB k MemoryMappedFile, používam Mutex lock na kontrolu, že len jeden proces môže mať prístup k MemoryMappedFile naraz. Testovací proces vytvorí MemoryMappedFile pre ProcesA, zapíše reťazec správ – > ProcesB, ktorý prečíta a zapíše reťazec odpovede – > ProcesA prečíta reťazec odpovede a ukončí to.
Postup ProcessA je nasledovný:
Postup ProcessB je nasledovný:
Test bol úspešný!
【Doplnkové tipy】
1. Ako zobrazím MemoryMappedFile, ktorý je momentálne zapnutý vo Windows?
SystemInternals má nástroj AccessChk, ktorý zobrazuje všetky súbory, priečinky, registre, objekty a Windows služby prístupné pre Windows. MemoryMappedFile je objekt pre Windows a môžete použiť nasledujúci príkaz na zoznam všetkých objektov a ich archiváciu accesschk -osv > e:\objList.txt Vyhľadajte v ňom názov MemoryMappedFile a ak existuje, môžete vidieť záznam podobný nasledovnému: \Sessions\1\BaseNamedObjects\DARKTHREAD Typ: Sekcia Stredná povinná úroveň (predvolená) [Bez napomenutia] 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
Stiahnuť nástroj AccessChk:Prihlásenie na hypertextový odkaz je viditeľné.
2. Prednastavenie MemoryMappedFile je povolené v relácii používateľa a toto prednastavenie nie je možné používať naprieč reláciami. Napríklad, ak majú dve ASP.NET patriace do rôznych AppPoolov rôzne vykonávacie identity, aj keď je názov MemoryMappedFile rovnaký, stále ide o jednu kópiu každého, preto je potrebné overiť, že vykonávacia identita používaná oboma stranami je rovnaká.
3. Na komunikáciu medzi rôznymi vykonávacími identitami môže byť MemoryMappedFile nazvaný "Global\ Filename" (poznámka: prípad Global je iný, našiel som hrom, ktorý bol omylom napísaný ako GLOBAL path is invalid), aby bol prístupný naprieč vykonávacími identitami. Treba však poznamenať, že procesy iné ako Session 0 (Windows Service) musia mať povolenie SeCreateGlobalPrivilege na vytvorenie Global\... MemoryMappedFile。 (MSDN súbor) Pre Session 0 sa môžete pozrieť na tento článok od MVP na druhej strane - Penetrating Session 0 Isolation (1) (Prihlásenie na hypertextový odkaz je viditeľné.Je v ňom veľmi podrobný úvod.
Prevzaté z:Prihlásenie na hypertextový odkaz je viditeľné.
|