Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 2494|Resposta: 1

[Gorjetas] Duas ou três coisas sobre Memória Compartilhada

[Copiar link]
Publicado em 23/07/2024 14:50:48 | | | |
Participar da realocação de um sistema antigo, onde a Memória Compartilhada é usada para se comunicar entre processos (por exemplo, chamando o Serviço de Janelas ASP.NET), e é forçado a entender a importância dessa tecnologia. Tecnologia impopular dos desenvolvedores NET, notas especiais.

[O que é Memória Compartilhada?] 】
Existe um termo para comunicação entre processos, Interprocess Communictaion (IPC), que possui as seguintes opções na plataforma Windows: Referência:O login do hiperlink está visível.

Área de transferência
O Programa A cola o conteúdo na área de transferência, e o Programa B recupera o conteúdo da prancheta.
COM
O OLE Compound Document permite que arquivos do Word sejam incorporados em planilhas do Excel, e o Excel pode ser chamado para edição com dois cliques.
Cópia de Dados
O Programa A envia WM_COPYDATA mensagens para o Programa B no formato acordado
DDE
DDE é um protocolo de comunicação que permite que diferentes aplicações troquem dados em formatos distintos, o que pode ser considerado uma extensão da área de transferência e pode ser transferido continuamente além de transferências únicas. (Desempenho relativamente ruim, não mais recomendado)
Mapeamento de arquivos
Mapeamento de arquivos refere-se à simulação de um arquivo como um pedaço de memória em um processo, quando múltiplas aplicações trocam dados por meio de mapeamento compartilhado de arquivos, chamado Memória Compartilhada Nomeada, que é o melhor desempenho entre vários métodos IPC, mas deve ser evitado por mecanismos de sincronização como o Mutex.
Correspondências
Comunicação unidirecional, o Cliente Mailslot envia mensagens para o Servidor MailSlot, e as mensagens são deletadas após serem lidas pelo servidor, suportando transmissão entre máquinas, e também podem ser transmitidas de um para muitos. (O comprimento da mensagem transmitida é limitado a 400 bytes, e o comprimento da mensagem é determinado pelo Servidor de Slots de E-mail quando é estabelecido para transmissão um-para-um)
Tubos
A transmissão bidirecional é dividida em Tubo Anônimo e Tubo Nomeado. O Pipe Anônimo é geralmente usado para a orientação padrão de entrada/saída entre o programa pai e o programa filho, e dois pipelines devem ser construídos para comunicação bidirecional, que não pode ser através da rede e é limitada a processos com relações dependentes. O Named Pipe pode ser usado para trocar dados entre qualquer processo e suportar transferência de processos entre as redes do processo.
RPC
A Chamada de Procedimento Remoto (RPC) permite que aplicações chamem funções fornecidas por outros aplicativos e pode ser chamada através de redes. O Windows RPC está em conformidade com o padrão ISO DCE e suporta integração entre sistemas operacionais.
Soquetes Windows
Interface de comunicação abstrata baseada em TCP/IP ou outros protocolos de rede, e a troca de dados é realizada por meio de conexões de rede na camada inferior.
Memória Compartilhada é um método comum de troca de dados usado por desenvolvedores C/C++ (o Google pode encontrar muitos exemplos de IPC implementados com Memória Compartilhada no Linux), então desenvolvedores C/C++ frequentemente o escolhem como canal de comunicação na plataforma Windows.

【Exercício Prático de Memória Compartilhada】
Embora haja menos pessoas que o utilizem, o .NET possui um namespace embutido System.IO.MemoryMappedFiles, não é difícil jogar Memória Compartilhada, quase igual a arquivos operacionais, desde que você tenha experiência em operações relacionadas a FileStream, pode começar rapidamente, consulte o exemplo do MSDN, escrevi um mini exercício de programa.O login do hiperlink está visível.

Escrevi dois programas, o ProcessA, para criar um espaço de 1024 bytes com o MemoryMappedFile.CreateNew() e praticar passes e recepções com o outro ProcessB. Como 1024 bytes são compartilhados por dois programas, planejo que os primeiros 512 sejam escritos pelo ProcessA no ProcessB e os últimos 512 para o ProcessB para leitura do ProcessA, e o programa usa o CreateViewStream para passar o endereço inicial e o comprimento para apontar para sua própria área. Para evitar conflitos de leitura/gravação quando ProcessA e ProcessB acessam o MemoryMappedFile, uso o bloqueio Mutex para controlar que apenas um Processo possa acessar o MemoryMappedFile por vez. O processo de teste cria um MemoryMappedFile para o ProcessA, escreve a string de mensagens – > o ProcessB lê a string de mensagem e escreve a string de resposta – > o ProcessA lê a string de resposta e termina.

O procedimento ProcessA é o seguinte:

O procedimento do ProcessB é o seguinte:

O teste foi bem-sucedido!



【Dicas Suplementares】

1. Como posso visualizar o MemoryMappedFile que está ativado atualmente no Windows?

O SystemInternals possui uma ferramenta AccessChk que lista todos os arquivos, pastas, registros, objetos e serviços do Windows acessíveis ao Windows. MemoryMappedFile é um objeto Windows, e você pode usar o comando a seguir para listar todos os objetos e arquivá-los
accesschk -osv > e:\objList.txt
Procure o nome de MemoryMappedFile nele e, se ele existir, você pode ver um registro semelhante ao seguinte:
\Sessões\1\BaseNomeadosObjetos\DARKTHREAD
  Tipo: Seção
  Nível Médio Obrigatório (Padrão) [Sem Advertência]
  AUTORIDADE/SISTEMA RW NT
    SECTION_ALL_ACCESS
  RW DOMÍNIO\Nome de Usuário
    SECTION_ALL_ACCESS
  DOMÍNIO RW\NomeDeUsuário-S-1-5-5-0-954410
    SECTION_ALL_ACCESS

Ferramenta AccessChk para download:O login do hiperlink está visível.

2. O preset MemoryMappedFile é ativado na sessão do usuário, e o preset não pode ser usado entre sessões. Por exemplo, se dois ASP.NET pertencentes a AppPools diferentes têm identidades de execução diferentes, mesmo que o nome do MemoryMappedFile seja o mesmo, ainda é uma cópia de cada um, então é necessário confirmar que a identidade de execução usada por ambas as partes é a mesma.

3. Para se comunicar entre diferentes identidades de execução, o MemoryMappedFile pode ser chamado de "Global\ Filename" (note que o caso do Global é diferente, eu pisei no thunder que foi erroneamente escrito como GLOBAL path é inválido), para que ele possa ser acessado entre identidades de execução.
No entanto, deve-se notar que processos além da Sessão 0 (Serviço Windows) precisam ter a permissão SeCreateGlobalPrivilege para criar um Global\... MemoryMappedFile。 (Arquivo MSDN)
Para a Sessão 0, você pode consultar este artigo do MVP do outro lado - Penetrating Session 0 Isolation (1) (O login do hiperlink está visível.Há uma introdução muito detalhada nela.

Reimpresso de:O login do hiperlink está visível.





Anterior:Problema de carregamento estático de recursos na imagem Angular 18
Próximo:Tenha uma visão rápida da estrutura de conteúdo do arquivo Bootstrap 5
 Senhorio| Publicado em 10/08/2024 21:36:57 |
.NET/C# implementa singleton de programa baseado em Mutex e MemoryMappedFile
https://www.itsvse.com/thread-10808-1-1.html
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com