Účastní se přesunu starého systému, kde se sdílená paměť používá ke komunikaci napříč procesy (např. volání Window Service ASP.NET), a je nucen pochopit důležitost této technologie. Nepopulární technologie vývojářů NET, speciální poznámky.
[Co je sdílená paměť?] 】 Existuje termín pro komunikaci mezi procesy, Interprocess Communication (IPC), který má na platformě Windows následující možnosti: Reference:Přihlášení k hypertextovému odkazu je viditelné.
Schránka Program A vloží obsah do schránky a Program B obsah z něj načítá. Modelu com OLE Compound Document umožňuje vložit soubory Word do Excel pracovních listů a Excel lze vyvolat k úpravám dvěma kliknutími. Kopie dat Program A odesílá WM_COPYDATA zprávy programu B v dohodnutém formátu DDE DDE je komunikační protokol, který umožňuje různým aplikacím vyměňovat data v různých formátech, což lze považovat za rozšíření schránky a může být přenášen nepřetržitě kromě jednorázových přenosů. (Relativně špatný výkon, již nedoporučováno) Mapování souborů Mapování souborů označuje simulaci souboru jako části paměti v procesu, kdy více aplikací vyměňuje data prostřednictvím sdíleného mapování souborů, nazývaného Named Shared Memory, což je nejlepší výkon mezi různými IPC metodami, ale musí být zabráněno synchronizačními mechanismy, jako je Mutex. Poštovní sloty Jednosměrná komunikace, Mailslot klient odesílá zprávy na Mailslot Server, a zprávy jsou po přečtení serverem smazány, což podporuje přenos mezi stroji, a mohou být také vysílány jeden na mnoha. (Délka vysílané zprávy je omezena na 400 bajtů a délku zprávy určuje Mailslot Server při jejím nastavení pro přenos jeden na jednoho) Dudy Obousměrný přenos se dělí na anonymní trubku a pojmenovanou trubku. Anonymous Pipe se obecně používá pro standardní orientaci vstupu/výstupu mezi rodičovským programem a podřízeným programem a pro obousměrnou komunikaci, která nemůže být přes síť a je omezena na procesy s závislými vztahy, by měly být postaveny dvě pipeline. Named Pipe lze použít k výměně dat mezi jakýmkoli procesem a podpoře přenosu procesů napříč sítí. RPC Vzdálené volání procedur (RPC) umožňuje aplikacím volat funkce poskytované jinými aplikacemi a lze je volat napříč sítěmi. Windows RPC splňuje standard ISO DCE a podporuje integraci napříč operačními systémy. Windows sockety Abstraktní komunikační rozhraní založené na TCP/IP nebo jiných síťových protokolech a výměna dat probíhá prostřednictvím síťových spojení na spodní vrstvě. Sdílená paměť je běžná metoda výměny dat používaná vývojáři C/C++ (Google najde mnoho příkladů IPC implementovaných se sdílenou pamětí na Linuxu), proto ji vývojáři C/C++ často volí jako komunikační kanál na platformě Windows.
【Praktické cvičení sdílené paměti】 Ačkoliv ho používá méně lidí, .NET má vestavěný jmenný prostor System.IO.MemoryMappedFiles, není těžké hrát Shared Memory, téměř stejně jako operační soubory, pokud máte zkušenosti s operacemi souvisejícími s FileStream, můžete začít rychle, viz příklad MSDN, napsal jsem mini programové cvičení.Přihlášení k hypertextovému odkazu je viditelné.
Napsal jsem dva programy, ProcessA, který vytvořil prostor o velikosti 1024 bajtů pomocí MemoryMappedFile.CreateNew() a procvičoval předávání a chytání s druhým ProcessB. Protože 1024 bajtů sdílí dva programy, plánuji, že prvních 512 bude ProcessA zapsaných do ProcessB a posledních 512 bude ProcessB napsaných do ProcessA čtení, a program použije CreateViewStream k předání startovací adresy a délky do své vlastní oblasti. Abych předešel konfliktům při čtení a zápisu, když ProcessA a ProcessB přistupují k MemoryMappedFile, používám Mutex lock k kontrole, že pouze jeden proces může mít přístup k MemoryMappedFile najednou. Testovací proces vytvoří MemoryMappedFile pro ProcesA, zapíše řetězec zprávy – > ProcesB, který přečte a zapíše řetězec odpovědi – > ProcesA přečte řetězec odpovědi a ukončí to.
Postup ProcessA je následující:
Postup ProcessB je následující:
Test byl úspěšný!
【Doplňkové tipy】
1. Jak si zobrazím MemoryMappedFile, který je aktuálně povolený ve Windows?
SystemInternals má nástroj AccessChk, který uvádí všechny soubory, složky, registry, objekty a služby Windows přístupné pro Windows. MemoryMappedFile je objekt pro Windows a můžete použít následující příkaz k vyjmenování všech objektů a jejich archivaci accesschk -osv > e:\objList.txt Vyhledejte v něm název MemoryMappedFile a pokud existuje, můžete vidět záznam podobný následujícímu: \Sessions\1\BaseNamedObjects\DARKTHREAD Typ: Sekce Střední povinná úroveň (výchozí) [Bez zápisu] 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
Stažení nástroje AccessChk:Přihlášení k hypertextovému odkazu je viditelné.
2. Přednastavení MemoryMappedFile je v uživatelově relaci povoleno a nelze jej používat napříč relacemi. Například pokud mají dvě ASP.NET patřící do různých AppPoolů různé vykonávací identity, i když je název MemoryMappedFile stejný, stále jde o jednu kopii každého z nich, takže je nutné ověřit, že vykonávací identita používaná oběma stranami je stejná.
3. Pro komunikaci přes různé execution identity může být MemoryMappedFile pojmenován "Global\ Filename" (poznámka: v případě Global je to jiné, šlápl jsem na hrom, který byl omylem napsán jako GLOBAL path is neplatný), takže je možné k němu přistupovat napříč execution identitami. Je však třeba poznamenat, že procesy jiné než Session 0 (Windows Service) musí mít oprávnění SeCreateGlobalPrivilege k vytvoření Global\... MemoryMappedFile。 (MSDN soubor) Pro Session 0 se můžete podívat na tento článek od MVP na druhé straně – Penetrating Session 0 Isolation (1) (Přihlášení k hypertextovému odkazu je viditelné.Je v ní velmi podrobný úvod.
Přetištěno z:Přihlášení k hypertextovému odkazu je viditelné.
|