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.
|