Teilnahme an der Verlagerung eines alten Systems, bei dem Shared Memory zur Kommunikation zwischen Prozessen verwendet wird (z. B. durch das Aufrufen des Window Service ASP.NET), und wird gezwungen, die Bedeutung dieser Technologie zu verstehen. Die unbeliebte Technologie der NET-Entwickler, besondere Anmerkungen.
[Was ist geteiltes Gedächtnis?] 】 Es gibt einen Begriff für prozessübergreifende Kommunikation, Interprocess Communictaion (IPC), der auf der Windows-Plattform folgende Optionen bietet: Referenz:Der Hyperlink-Login ist sichtbar.
Zwischenablage Programm A fügt den Inhalt in die Zwischenablage ein, und Programm B ruft den Inhalt von der Zwischenablage ab. COM OLE Compound Document erlaubt es, Word-Dateien in Excel-Arbeitsblätter einzubetten, und Excel kann mit zwei Klicks zum Bearbeiten aufgerufen werden. Datenkopie Programm A sendet WM_COPYDATA Nachrichten im vereinbarten Format an Programm B DDE DDE ist ein Kommunikationsprotokoll, das es verschiedenen Anwendungen ermöglicht, Daten in unterschiedlichen Formaten auszutauschen, was als Erweiterung der Zwischenablage betrachtet werden kann und zusätzlich zu einmaligen Übertragungen kontinuierlich übertragen werden kann. (Relativ schlechte Leistung, nicht mehr zu empfehlen) Dateizuordnung File Mapping bezeichnet die Simulation einer Datei als Speicherstück in einem Prozess, bei der mehrere Anwendungen Daten durch gemeinsames Dateimapping austauschen, genannt Named Shared Memory, was die beste Leistung unter verschiedenen IPC-Methoden darstellt, aber durch Synchronisationsmechanismen wie Mutex verhindert werden muss. Briefschlitz Einwegkommunikation: Mailslot-Client sendet Nachrichten an den Mailslot-Server, und die Nachrichten werden nach dem Lesen durch den Server gelöscht, was die Übertragung über mehrere Maschinen unterstützt und auch eins-zu-viele gesendet werden kann. (Die Länge der Broadcast-Nachricht ist auf 400 Bytes begrenzt, und die Länge der Nachricht wird vom Mailslot-Server bestimmt, wenn sie für die Eins-zu-eins-Übertragung eingerichtet wird.) Dudelsack Die bidirektionale Übertragung ist in Anonymous Pipe und Named Pipe unterteilt. Anonymous Pipe wird im Allgemeinen für die standardmäßige Ein-/Ausgabe-Orientierung zwischen dem Elternprogramm und dem Kindprogramm verwendet, und es sollten zwei Pipes für die zweiseitige Kommunikation gebaut werden, die nicht über das Netzwerk verteilt werden kann und auf Prozesse mit abhängigen Beziehungen beschränkt ist. Named Pipe kann verwendet werden, um Daten zwischen jedem Prozess auszutauschen und den Netzwerkübergreifenden Prozesstransfer zu unterstützen. RPC Remote Procedure Call (RPC) ermöglicht es Anwendungen, Funktionen aufzurufen, die von anderen Anwendungen bereitgestellt werden, und können netzwerkübergreifend aufgerufen werden. Windows RPC entspricht dem ISO-DCE-Standard und unterstützt systemübergreifende Integration. Fenster-Sockets Abstrakte Kommunikationsschnittstelle basierend auf TCP/IP oder anderen Netzwerkprotokollen, und der Datenaustausch erfolgt über Netzwerkverbindungen in der unteren Schicht. Shared Memory ist eine gängige Datenaustauschmethode, die von C/C++-Entwicklern verwendet wird (Google findet viele Beispiele für IPC, die mit Shared Memory unter Linux implementiert wurden), daher wählen C/C++-Entwickler es oft als Kommunikationskanal auf der Windows-Plattform.
【Gemeinsames Gedächtnis Praktische Übung】 Obwohl es weniger Leute gibt, die es nutzen, hat .NET einen integrierten System.IO.MemoryMappedFiles-Namensraum. Es ist nicht schwer, Shared Memory zu spielen, fast wie Betriebsdateien. Solange man Erfahrung mit FileStream-bezogenen Operationen hat, kann man schnell loslegen. Siehe das MSDN-Beispiel, ich habe eine Mini-Programmübung geschrieben.Der Hyperlink-Login ist sichtbar.
Ich schrieb zwei Programme, ProcessA, um mit MemoryMappedFile.CreateNew() einen Raum von 1024 Bytes zu erstellen und mit dem anderen ProcessB das Passing und Catching zu üben. Da 1024 Bytes von zwei Programmen gemeinsam genutzt werden, plane ich, dass die ersten 512 als ProcessA für ProcessB geschrieben werden und die letzten 512 als ProcessB-Read, und das Programm verwendet CreateViewStream, um die Startadresse und Länge zu übergeben, um auf seinen eigenen Bereich zu zeigen. Um Lese-/Schreibkonflikte zu vermeiden, wenn ProcessA und ProcessB auf die MemoryMappedFile zugreifen, verwende ich Mutex Lock, um zu steuern, dass nur ein Prozess gleichzeitig auf die MemoryMappedFile zugreifen kann. Der Testprozess erstellt eine MemoryMappedFile für ProcessA, schreibt die Nachrichtenzeichenkette – > ProcessB liest die Nachrichtenzeichenkette und schreibt die Antwortzeichenkette – > ProcessA liest die Antwortzeichenkette und endet.
Das ProcessA-Verfahren ist wie folgt:
Das ProcessB-Verfahren ist wie folgt:
Der Test war erfolgreich!
【Ergänzende Tipps】
1. Wie kann ich die MemoryMappedFile anzeigen, die derzeit unter Windows aktiviert ist?
SystemInternals verfügt über ein AccessChk-Tool, das alle Dateien, Ordner, Register, Objekte und Windows-Dienste auflistet, die für Windows zugänglich sind. MemoryMappedFile ist ein Windows-Objekt, und du kannst den folgenden Befehl verwenden, um alle Objekte aufzulisten und zu archivieren accesschk -osv > e:\objList.txt Suchen Sie nach dem Namen von MemoryMappedFile darin, und falls er existiert, sehen Sie einen ähnlichen Datensatz wie folgt: \Sessions\1\BaseNamedObjects\DARKTHREAD Typ: Abschnitt Mittlerer Pflichtlevel (Standard) [Kein Ermahnung] RW NT AUTHORITY\SYSTEM SECTION_ALL_ACCESS RW DOMAIN\BenutzerName SECTION_ALL_ACCESS RW DOMAIN\Benutzername-S-1-5-5-0-954410 SECTION_ALL_ACCESS
AccessChk-Tool herunterladen:Der Hyperlink-Login ist sichtbar.
2. Das MemoryMappedFile-Preset ist in der Sitzung des Benutzers aktiviert, und das Preset kann nicht über Sitzungen hinweg verwendet werden. Wenn zum Beispiel zwei ASP.NET, die zu verschiedenen AppPools gehören, unterschiedliche Ausführungsidentitäten haben, ist es auch dann eine Kopie von jedem, selbst wenn der Name der MemoryMappedFile gleich ist, sodass es notwendig ist zu bestätigen, dass die von beiden Parteien verwendete Ausführungsidentität gleich ist.
3. Um über verschiedene Ausführungsidentitäten hinweg zu kommunizieren, kann die MemoryMappedFile "Global\ Dateiname" genannt werden (beachte, dass der Fall Global anders ist, ich bin auf den Donner getreten, der fälschlicherweise als GLOBAL-Pfad ungültig geschrieben wurde), sodass er über Ausführungsidentitäten hinweg zugänglich ist. Es sollte jedoch beachtet werden, dass Prozesse außer Session 0 (Windows Service) die Berechtigung SeCreateGlobalPrivilege benötigen, um ein Global\... MemoryMappedFile。 (MSDN-Datei) Für Session 0 kannst du auf diesem Artikel von MVP auf der anderen Seite nachschlagen – Penetrating Session 0 Isolation (1) (Der Hyperlink-Login ist sichtbar.Es gibt eine sehr ausführliche Einleitung.
Nachdruck von:Der Hyperlink-Login ist sichtbar.
|