Partecipare al trasferimento di un vecchio sistema, dove la Memoria Condivisa viene utilizzata per comunicare tra processi (ad esempio, chiamando il Window Service ASP.NET), e è costretto a comprendere l'importanza di questa tecnologia. Tecnologia impopolare degli sviluppatori di NET, note speciali.
[Cos'è la Memoria Condivisa?] 】 Esiste un termine per la comunicazione tra processi, Interprocess Communictaion (IPC), che offre le seguenti opzioni sulla piattaforma Windows: Riferimento:Il login del link ipertestuale è visibile.
Appunti Il Programma A incolla il contenuto nella cartellina, mentre il Programma B recupera il contenuto dalla cartellina. COM OLE Compound Document permette di incorporare file Word nei fogli di lavoro di Excel, e Excel può essere richiamato per la modifica con due clic. Copia dei dati Il Programma A invia WM_COPYDATA messaggi al Programma B nel formato concordato DDE DDE è un protocollo di comunicazione che permette a diverse applicazioni di scambiare dati in formati differenti, che possono essere considerati un'estensione della cartella e possono essere trasferiti continuamente oltre a trasferimenti una tantum. (Prestazioni relativamente scarse, non più raccomandate) Mappatura dei file La mappatura dei file si riferisce alla simulazione di un file come un pezzo di memoria in un processo, quando più applicazioni scambiano dati tramite la mappatura condivisa dei file, chiamata Memoria Condivisa Nominata, che rappresenta la migliore prestazione tra i vari metodi IPC, ma deve essere prevenuta da meccanismi di sincronizzazione come Mutex. Slot postali Comunicazione unidirezionale, il Mail Slot Client invia messaggi al server Mailslot e i messaggi vengono cancellati dopo essere stati letti dal server, supportando la trasmissione tra macchine, e possono anche essere trasmessi uno a molti. (La lunghezza del messaggio broadcast è limitata a 400 byte, e la lunghezza del messaggio è determinata dal server Mailslot quando viene stabilito per la trasmissione uno-a-uno) Cornamusa La trasmissione bidirezionale è suddivisa in Tubo Anonimo e Tubo Nominato. Un Pipe Anonimo è generalmente utilizzato per l'orientamento standard input/output tra il programma genitore e il programma figlio, e dovrebbero essere costruiti due pipe per la comunicazione bidirezionale, che non può avvenire attraverso la rete ed è limitata ai processi con relazioni dipendenti. Named Pipe può essere utilizzato per scambiare dati tra qualsiasi processo e supportare il trasferimento di processi tra rete. RPC La chiamata di procedura remota (RPC) consente alle applicazioni di chiamare funzioni fornite da altre applicazioni e può essere chiamata attraverso reti. Windows RPC è conforme allo standard ISO DCE e supporta l'integrazione tra sistemi operativi. Prese Windows Interfaccia di comunicazione astratta basata su TCP/IP o altri protocolli di rete, e lo scambio di dati avviene tramite connessioni di rete al livello inferiore. La Memoria Condivisa è un metodo comune di scambio dati utilizzato dagli sviluppatori C/C++ (Google può trovare molti esempi di IPC implementati con la Memoria Condivisa su Linux), quindi gli sviluppatori C/C++ spesso lo scelgono come canale di comunicazione sulla piattaforma Windows.
【Esercizio Pratico di Memoria Condivisa】 Anche se ci sono meno persone che lo usano, .NET ha uno spazio di nomi integrato System.IO.MemoryMappedFiles, non è difficile giocare a Shared Memory, quasi come i file operativi, finché si ha esperienza nelle operazioni legate a FileStream, si può iniziare rapidamente, si consulta l'esempio MSDN, ho scritto un mini esercizio di programma.Il login del link ipertestuale è visibile.
Ho scritto due programmi, ProcessA, per creare uno spazio di 1024 byte con MemoryMappedFile.CreateNew() e esercitarmi a passare e ricevere con l'altro ProcessB. Poiché 1024 byte sono condivisi da due programmi, prevedo che i primi 512 siano scritti da ProcessA su ProcessB e gli ultimi 512 da ProcessB scritti per ProcessA read, e il programma usa CreateViewStream per inviare l'indirizzo di inizio e la lunghezza per puntare alla propria area. Per evitare conflitti di lettura/scrittura quando ProcessA e ProcessB accedono al MemoryMappedFile, uso il blocco Mutex per controllare che solo un Processo possa accedere al MemoryMappedFile alla volta. Il processo di test crea un MemoryMappedFile per ProcessA, scrive la stringa di messaggi – > ProcessB legge la stringa di messaggi e scrive la stringa di risposta – > ProcessA legge la stringa di risposta e termina.
La procedura ProcessA è la seguente:
La procedura ProcessB è la seguente:
Il test è stato un successo!
【Consigli supplementari】
1. Come posso visualizzare il MemoryMappedFile attualmente abilitato in Windows?
SystemInternals dispone di uno strumento AccessChk che elenca tutti i file, cartelle, registri, oggetti e servizi Windows accessibili a Windows. MemoryMappedFile è un oggetto Windows, e puoi usare il seguente comando per elencare tutti gli oggetti e archiviarli accesschk -osv > e:\objList.txt Cerca il nome di MemoryMappedFile in esso e, se esiste, puoi vedere un record simile al seguente: \Sessioni\1\BaseOggettiNominati\FILO OSCURO Tipo: Sezione Livello Obbligatorio Medio (Predefinito) [Nessun Richiamo] RW NT/AUTHORITY\SYSTEM SECTION_ALL_ACCESS RW DOMINIO\UserName SECTION_ALL_ACCESS RW DOMAIN\UserName-S-1-5-5-0-954410 SECTION_ALL_ACCESS
Download dello strumento AccessChk:Il login del link ipertestuale è visibile.
2. Il preset MemoryMappedFile è abilitato nella sessione dell'utente e il preset non può essere utilizzato tra sessioni. Ad esempio, se due ASP.NET appartenenti a AppPool diversi hanno identità di esecuzione diverse, anche se il nome MemoryMappedFile è lo stesso, è comunque una copia di ciascuno, quindi è necessario confermare che l'identità di esecuzione usata da entrambe le parti sia la stessa.
3. Per comunicare tra diverse identità di esecuzione, il MemoryMappedFile può essere chiamato "Global\ Filename" (nota che il caso di Global è diverso, ho pestato sul thunder che era stato erroneamente scritto come GLOBAL path è invalido), così da poter essere accessibile tra le identità di esecuzione. Tuttavia, va notato che processi diversi dalla Sessione 0 (Windows Service) devono avere il permesso SeCreateGlobalPrivilege per creare un Global\... MemoryMappedFile。 (File MSDN) Per la Sessione 0, puoi fare riferimento a questo articolo di MVP dall'altra parte - Penetrating Session 0 Isolation (1) (Il login del link ipertestuale è visibile.C'è un'introduzione molto dettagliata.
Ristampato da:Il login del link ipertestuale è visibile.
|