Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 2494|Risposta: 1

[Consigli] Due o tre cose su Shared Memory

[Copiato link]
Pubblicato su 23/07/2024 14:50:48 | | | |
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.





Precedente:Problema di caricamento statico delle risorse per immagini Angular 18
Prossimo:Ottieni una rapida panoramica della struttura dei contenuti dei file Bootstrap 5
 Padrone di casa| Pubblicato su 10/08/2024 21:36:57 |
.NET/C# implementa un singolo di programma basato su Mutex e MemoryMappedFile
https://www.itsvse.com/thread-10808-1-1.html
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com