Részt vesz egy régi rendszer áthelyezésében, ahol a Shared Memory processek közötti kommunikációra (például az Ablak Szolgáltatás ASP.NET hívására), és kénytelen megérteni ennek a technológiának a fontosságát. A NET fejlesztők népszerűtlen technológiája, külön megjegyzések.
[Mi az a Közös Memória?] 】 A folyamatok közötti kommunikációra létezik egy kifejezés, az Interprocess Communictaion (IPC), amely a Windows platformon az alábbi opciókat kínálja: Hivatkozás:A hiperlink bejelentkezés látható.
Vágólap Az A program beilleszti a tartalmat a vágóasztalba, a B program pedig visszanyeri a tartalmat a clipboardból. COM Az OLE Compound Document lehetővé teszi, hogy Word fájlokat beágyazzanak az Excel munkalapokba, és az Excel két kattintással előhívható szerkesztésre. Adatmásolat Az A program WM_COPYDATA üzenetet küld a B programnak a megegyezett formátumban DDE A DDE egy kommunikációs protokoll, amely lehetővé teszi különböző alkalmazások számára, hogy különböző formátumokban adatokat cseréljenek, amelyek a klipboard kiterjesztésének tekinthetők, és folyamatosan továbbíthatók az egyszeri átvitelek mellett. (Viszonylag gyenge teljesítmény, már nem ajánlott) Fájlleképezés A fájlleképezés azt jelenti, hogy egy fájlt egy memóriadarabként szimulálnak egy folyamatban, amikor több alkalmazás megosztott fájlleképezésen keresztül cserél adatokat, amelyet Named Shared Memory-nek neveznek, és amely a legjobb teljesítmény az IPC módszerek között, de ezt a szinkronizációs mechanizmusoknak, például Mutexnek kell megakadályozni. Postanyerők Egyirányú kommunikáció esetén a Mailslot Client üzeneteket küld a Mailslot szervernek, és az üzeneteket a szerver olvasása után törlik, így a gépek közötti átvitel is támogatható, és egy-többen is sugározhatók. (A sugárzott üzenet hossza 400 bájtra korlátozott, és az üzenet hosszát a Mailslot szerver határozza meg, amikor az egy-egy adásra van beállítva) Csövek A kétirányú átvitel Anonim Csőre és Névre osztott. Az Anonymous Pipe-t általában a szülőprogram és a gyermekprogram közötti szabványos bemenet/kimeneti orientációhoz használják, és két vezetéket kell építeni kétirányú kommunikációra, amely nem lehet a hálózaton átívelő, és csak a függő kapcsolatok kezelésére korlátozódik. A Named Pipe bármely folyamat közötti adatcserére használható, és támogatja a hálózaton átterjedő folyamatátvitelt. RPC A távoli eljáráshívás (RPC) lehetővé teszi az alkalmazások számára, hogy más alkalmazások által biztosított funkciókat hívjanak, és hálózatokon keresztül is hívhatók. A Windows RPC megfelel az ISO DCE szabványnak, és támogatja a rendszerek közötti integrációt. Windows csatlakozók Az absztrakt kommunikációs felület TCP/IP vagy más hálózati protokollok alapján, és az adatátvitel hálózati kapcsolatokon keresztül zajlik az alsó rétegen. A megosztott memória egy gyakori adatcsere módszer, amelyet a C/C++ fejlesztők használnak (a Google számos példát talál IPC-re, amelyet Linuxon megosztott memóriával valósítottak meg), ezért a C/C++ fejlesztők gyakran ezt választják kommunikációs csatornáként a Windows platformon.
【Közös memória gyakorlat】 Bár kevesebben használják, a .NET-nek van beépített System.IO.MemoryMappedFiles névtére, nem nehéz játszani a Shared Memory-t, szinte ugyanannyi, mint az operációs fájlok, amíg van tapasztalatod a FileStream-hez kapcsolódó műveletekben, gyorsan kezdhetsz, lásd az MSDN példát, írtam egy mini programgyakorlatot.A hiperlink bejelentkezés látható.
Két programot írtam, a ProcessA-t, hogy 1024 bájtos teret hozzon létre a MemoryMappedFile.CreateNew() segítségével, és gyakoroltam a passzolást és elkapást a másik ProcessB-vel. Mivel 1024 bájt két program osztosul, az első 512-t úgy tervezem, hogy a ProcessA legyen a ProcessB-hez, az utolsó 512-t pedig ProcessB a ProcessA olvasáshoz írva, és a program a CreateViewStream segítségével adja be a kezdő címet és a hosszt, hogy a saját területére mutass. Annak érdekében, hogy elkerüljük az olvasási/írási konfliktusokat, amikor a ProcessA és a ProcessB hozzáfér a MemoryMappedFile-hoz, a Mutex lockot használom, hogy egyszerre csak egy folyamat férjen hozzá a MemoryMappedFile-hez. A tesztfolyamat létrehoz egy MemoryMappedFile-t a ProcessA számára, megírja az üzenet stringjét – > ProcessB olvassa az üzenet stringjét és megírja a válasz szúrót – > ProcessA elolvassa a válasz láncsort, és véget ér.
A ProcessA eljárás a következő:
A ProcessB eljárás a következő:
A teszt sikeres volt!
【Kiegészítő tippek】
1. Hogyan tekinthetem meg a jelenleg engedélyezett Windows-ban engedélyezett MemoryMappedFile-t?
A SystemInternals rendelkezik egy AccessChk eszközzel, amely felsorolja az összes fájlt, mappát, regisztert, objektumot és Windows szolgáltatást, amelyek elérhetők a Windows számára. A MemoryMappedFile egy Windows objektum, és a következő parancsot használhatod az összes objektum felsorolására és archiválására accesschk -osv > e:\objList.txt Keresd meg benne a MemoryMappedFile nevét, és ha létezik, akkor egy hasonló rekordot láthatsz, mint az alábbi: \Sessions\1\BaseNamedObjects\DARKTHREAD Típus: Szakasz Közepes kötelező szint (alapértelmezett) [Írás nélkül] 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
AccessChk eszköz letöltése:A hiperlink bejelentkezés látható.
2. A MemoryMappedFile előbeállítás engedélyezve van a felhasználó ülésében, és az előbeállítás nem használható különböző ülések között. Például, ha két különböző AppPoolhoz tartozó ASP.NET eltérő végrehajtási identitással rendelkezik, még ha a MemoryMappedFile név ugyanaz is, akkor is egy-egy példány mindegyikből, ezért szükséges megerősíteni, hogy mindkét fél által használt végrehajtási identitás ugyanaz.
3. A különböző végrehajtási identitások közötti kommunikációhoz a MemoryMappedFile "Global\ Filename" néven is használható (megjegyzés: a Global esete más, ráléptem arra a villámcsapásra, amit tévesen írtak, hogy a GLOBAL út érvénytelen), így a végrehajtási identitások között elérhető lehet. Ugyanakkor meg kell jegyezni, hogy a 0. Session 0-on (Windows Service) kívüli folyamatoknak SeCreateGlobalPrivilege engedélyt kell biztosítaniuk a Global\... MemoryMappedFile。 (MSDN fájl) A 0. üléshez hivatkozhatsz erre az MVP cikkére a másik oldalon – Penetrating Session 0 Isolation (1) (A hiperlink bejelentkezés látható.Nagyon részletes bevezetője van.
Átadott forrás:A hiperlink bejelentkezés látható.
|