Deelname aan de verplaatsing van een oud systeem, waarbij gedeeld geheugen wordt gebruikt om tussen processen te communiceren (bijvoorbeeld het aanroepen van de Window Service ASP.NET), en wordt gedwongen het belang van deze technologie te begrijpen. De onpopulaire technologie van NET-ontwikkelaars, speciale opmerkingen.
[Wat is gedeeld geheugen?] 】 Er is een term voor cross-process communicatie, Interprocess Communictaion (IPC), die op het Windows-platform de volgende opties heeft: Referentie:De hyperlink-login is zichtbaar.
Klembord Programma A plakt de inhoud in het klembord, en Programma B haalt de inhoud op van het klembord. COM OLE Compound Document maakt het mogelijk om Word-bestanden in Excel-werkbladen in te sluiten, en Excel kan met twee klikken worden opgeroepen voor bewerking. Datakopie Programma A stuurt WM_COPYDATA berichten naar Programma B in het afgesproken formaat DDE DDE is een communicatieprotocol dat verschillende applicaties in staat stelt gegevens uit te wisselen in verschillende formaten, wat kan worden beschouwd als een uitbreiding van het klembord en continu kan worden overgedragen naast eenmalige overdrachten. (Relatief slechte prestaties, niet langer aanbevolen) Bestandsmapping Bestandsmapping verwijst naar het simuleren van een bestand als een stuk geheugen in een proces, waarbij meerdere applicaties gegevens uitwisselen via gedeelde bestandsmapping, genaamd Named Shared Memory, wat de beste prestaties is van verschillende IPC-methoden, maar moet worden voorkomen door synchronisatiemechanismen zoals Mutex. Mailslots Eenrichtingscommunicatie: Mailslot Client stuurt berichten naar Mailslot Server, en de berichten worden verwijderd nadat ze door de server zijn gelezen, wat cross-machine transmissie ondersteunt, en kunnen ook één-op-veel worden uitgezonden. (De lengte van het broadcastbericht is beperkt tot 400 bytes, en de lengte van het bericht wordt bepaald door de Mailslot Server wanneer deze wordt ingesteld voor één-op-één transmissie) Doedelzak Bidirectionele overdracht is onderverdeeld in Anonieme Pijp en Benoemde Pijp. Anonymous Pipe wordt doorgaans gebruikt voor de standaard invoer/uitvoer-oriëntatie tussen het ouderprogramma en het kindprogramma, en er moeten twee pipes worden gebouwd voor tweerichtingscommunicatie, die niet over het netwerk kan zijn en beperkt is tot processen met afhankelijke relaties. Named Pipe kan worden gebruikt om gegevens uit te wisselen tussen elk proces en ondersteunt cross-netwerkoverdracht van processen. RPC Remote Procedure Call (RPC) stelt applicaties in staat functies aan te roepen die door andere applicaties worden geleverd en kunnen over netwerken worden aangeroepen. Windows RPC voldoet aan de ISO DCE-standaard en ondersteunt integratie van cross-besturingssystemen. Venstersockets Abstracte communicatie-interface gebaseerd op TCP/IP of andere netwerkprotocollen, en gegevensuitwisseling vindt plaats via netwerkverbindingen op de onderste laag. Shared Memory is een veelgebruikte data-uitwisselingsmethode die wordt gebruikt door C/C++-ontwikkelaars (Google kan veel voorbeelden vinden van IPC geïmplementeerd met Shared Memory op Linux), dus C/C++-ontwikkelaars kiezen het vaak als communicatiekanaal op het Windows-platform.
【Gedeeld Geheugen Praktische Oefening】 Hoewel er minder mensen zijn die het gebruiken, heeft .NET een ingebouwde System.IO.MemoryMappedFiles-naamruimte, het is niet moeilijk om Shared Memory te spelen, bijna hetzelfde als operating files, zolang je ervaring hebt met FileStream-gerelateerde operaties, kun je snel beginnen, zie het MSDN-voorbeeld, ik heb een mini-programma-oefening geschreven.De hyperlink-login is zichtbaar.
Ik schreef twee programma's, ProcessA, om een ruimte van 1024 bytes te creëren met MemoryMappedFile.CreateNew() en oefende passing and catching met de andere ProcessB. Omdat 1024 bytes door twee programma's worden gedeeld, plan ik dat de eerste 512 ProcessA wordt geschreven naar ProcessB en de laatste 512 ProcessB naar ProcessA-read, en het programma gebruikt CreateViewStream om het startadres en de lengte door te geven zodat het naar een eigen gebied verwijst. Om lees-/schrijfconflicten te voorkomen wanneer ProcessA en ProcessB toegang krijgen tot het MemoryMappedFile, gebruik ik Mutex lock om te controleren dat slechts één proces tegelijk toegang heeft tot het MemoryMappedFile. Het testproces maakt een MemoryMappedFile aan voor ProcessA, schrijft de berichtstring – > ProcessB leest de berichtstring en schrijft de responsstring – > ProcessA leest de responsreeks en beëindigt.
De procedure van ProcessA is als volgt:
De ProcessB-procedure is als volgt:
De test was geslaagd!
【Aanvullende Tips】
1. Hoe bekijk ik het MemoryMappedFile dat momenteel in Windows is ingeschakeld?
SystemInternals heeft een AccessChk-tool die alle bestanden, mappen, registers, objecten en Windows-services vermeldt die toegankelijk zijn voor Windows. MemoryMappedFile is een Windows-object, en je kunt het volgende commando gebruiken om alle objecten te vermelden en te archiveren Accesschk -osv > e:\objList.txt Zoek naar de naam van MemoryMappedFile erin, en als die bestaat, kun je een record zien dat lijkt op het volgende: \Sessions\1\BaseNamedObjects\DARKTHREAD Type: Sectie Gemiddeld Verplicht Niveau (Standaard) [Geen Waarschuwing] RW NT AUTORITEIT\SYSTEEM SECTION_ALL_ACCESS RW DOMEIN\Gebruikersnaam SECTION_ALL_ACCESS RW DOMAIN\UserName-S-1-5-5-0-954410 SECTION_ALL_ACCESS
AccessChk-tool downloaden:De hyperlink-login is zichtbaar.
2. De MemoryMappedFile-preset is ingeschakeld in de sessie van de gebruiker, en de preset kan niet over sessies heen worden gebruikt. Als bijvoorbeeld twee ASP.NET die tot verschillende AppPools behoren verschillende uitvoeringsidentiteiten hebben, is het, zelfs als de naam van het MemoryMappedBestand hetzelfde is, nog steeds één kopie van elk, dus het is noodzakelijk te bevestigen dat de uitvoeringsidentiteit die door beide partijen wordt gebruikt hetzelfde is.
3. Om te communiceren tussen verschillende uitvoeringsidentiteiten kan het MemoryMappedFile "Global\ Filename" worden genoemd (let op dat het geval van Global anders is, ik trapte op het donder dat per vergissing als GLOBAL path is geschreven is ongeldig), zodat het toegankelijk is over uitvoeringsidentiteiten heen. Het moet echter worden opgemerkt dat processen anders dan Sessie 0 (Windows Service) de SeCreateGlobalPrivilege-machtiging moeten hebben om een Global\... MemoryMappedFile。 (MSDN-bestand) Voor Sessie 0 kun je dit artikel van MVP aan de andere kant raadplegen - Penetrating Session 0 Isolation (1) (De hyperlink-login is zichtbaar.Er staat een zeer gedetailleerde introductie in.
Herdrukt van:De hyperlink-login is zichtbaar.
|