Participando en la reubicación de un sistema antiguo, donde la Memoria Compartida se utiliza para comunicarse entre procesos (por ejemplo, llamando al Servicio de Ventanas ASP.NET), y se ve obligado a comprender la importancia de esta tecnología. Tecnología impopular de los desarrolladores de NET, notas especiales.
[¿Qué es la memoria compartida?] 】 Existe un término para la comunicación entre procesos, Interprocess Communictaion (IPC), que ofrece las siguientes opciones en la plataforma Windows: Referencia:El inicio de sesión del hipervínculo es visible.
Portapapeles El Programa A pega el contenido en la carpeta y el Programa B recupera el contenido de la carpeta. COM OLE Compound Document permite incrustar archivos de Word en hojas de Excel, y Excel puede abrirse para editar con dos clics. Copia de datos El Programa A envía WM_COPYDATA mensajes al Programa B en el formato acordado DDE DDE es un protocolo de comunicación que permite a diferentes aplicaciones intercambiar datos en distintos formatos, lo que puede considerarse una extensión del portapapeles y puede transferirse de forma continua además de transferencias únicas. (Rendimiento relativamente pobre, ya no recomendado) Mapeado de archivos El mapeo de archivos se refiere a simular un archivo como un fragmento de memoria en un proceso, cuando múltiples aplicaciones intercambian datos mediante mapeo de archivos compartidos, llamado Memoria Compartida Nombrada, que es el mejor rendimiento entre los distintos métodos IPC, pero debe ser evitado por mecanismos de sincronización como Mutex. Franjas de correo Comunicación unidireccional, el Cliente de Correo Sin envía mensajes al Servidor de Slots, y los mensajes se eliminan tras ser leídos por el servidor, soportando transmisión entre máquinas, y también pueden ser transmitidos uno a muchos. (La longitud del mensaje de difusión está limitada a 400 bytes, y la longitud del mensaje la determina el Servidor de Slots de Correo cuando se establece para la transmisión uno a uno) Tubería La transmisión bidireccional se divide en Tubería Anónima y Tubería Nombrada. Anónimo Pipe se utiliza generalmente para la orientación estándar de entrada/salida entre el programa padre y el programa hijo, y se deben construir dos pipes para la comunicación bidireccional, que no puede ser a través de la red y está limitada a procesos con relaciones dependientes. Named Pipe puede usarse para intercambiar datos entre cualquier proceso y soportar la transferencia de procesos entre red. RPC La llamada de procedimiento remoto (RPC) permite a las aplicaciones llamar a funciones proporcionadas por otras aplicaciones y puede ser llamada a través de redes. Windows RPC cumple con el estándar ISO DCE y soporta integración entre sistemas operativos. Enchufes Windows Interfaz de comunicación abstracta basada en TCP/IP u otros protocolos de red, y el intercambio de datos se realiza a través de conexiones de red en la capa inferior. La Memoria Compartida es un método común de intercambio de datos utilizado por desarrolladores de C/C++ (Google puede encontrar muchos ejemplos de IPC implementados con Memoria Compartida en Linux), por lo que los desarrolladores de C/C++ suelen elegirlo como canal de comunicación en la plataforma Windows.
【Ejercicio práctico de memoria compartida】 Aunque hay menos personas que lo usan, .NET tiene un espacio de nombres System.IO.MemoryMappedFiles incorporado, no es difícil reproducir Memoria Compartida, casi igual que archivos operativos, siempre que tengas experiencia en operaciones relacionadas con FileStream, puedes empezar rápido, consulta el ejemplo de MSDN, escribí un mini ejercicio de programa.El inicio de sesión del hipervínculo es visible.
Escribí dos programas, ProcessA, para crear un espacio de 1024 bytes con MemoryMappedFile.CreateNew() y practicar pases y recepciones con el otro ProcessB. Como 1024 bytes son compartidos por dos programas, planeo que los primeros 512 sean escritos por ProcesoA para Proceso B y los últimos 512 para ProcesB, y el programa usa CreateViewStream para pasar la dirección de inicio y la longitud para apuntar a su propia área. Para evitar conflictos de lectura/escritura cuando el ProcesoA y el Proceso B acceden al MemoryMappedFile, uso el bloqueo Mutex para controlar que solo un Proceso pueda acceder al MemoryMappedFile a la vez. El proceso de prueba crea un MemoryMappedFile para ProcessA, escribe la cadena de mensajes – > ProcessB lee la cadena de mensajes y escribe la cadena de respuesta – > ProcessA lee la cadena de respuesta y termina.
El procedimiento ProcessA es el siguiente:
El procedimiento ProcessB es el siguiente:
¡La prueba fue un éxito!
【Consejos suplementarios】
1. ¿Cómo puedo ver el MemoryMappedFile que actualmente está habilitado en Windows?
SystemInternals cuenta con una herramienta AccessChk que lista todos los archivos, carpetas, registros, objetos y servicios de Windows accesibles para Windows. MemoryMappedFile es un objeto de Windows, y puedes usar el siguiente comando para listar todos los objetos y archivarlos accesschk -osv > e:\objList.txt Busca el nombre de MemoryMappedFile en él y, si existe, puedes ver un registro similar al siguiente: \Sesiones\1\BaseNombredObjetos\HILO OSCURO Tipo: Sección Nivel Medio Obligatorio (por defecto) [Sin Advertencia] RW NT/AUTHORITY/SYSTEM SECTION_ALL_ACCESS RW DOMINIO\Nombre de usuario SECTION_ALL_ACCESS RW DOMINIO\NombreUsuario-S-1-5-5-0-954410 SECTION_ALL_ACCESS
Descarga de la herramienta AccessChk:El inicio de sesión del hipervínculo es visible.
2. El preset MemoryMappedFile está habilitado en la sesión del usuario, y el preset no puede usarse entre sesiones. Por ejemplo, si dos ASP.NET pertenecientes a diferentes AppPools tienen identidades de ejecución distintas, incluso si el nombre de MemoryMappedFile es el mismo, sigue siendo una copia de cada uno, por lo que es necesario confirmar que la identidad de ejecución utilizada por ambas partes es la misma.
3. Para comunicarse entre diferentes identidades de ejecución, el MemoryMappedFile puede llamarse "Global\ Filename" (ten en cuenta que el caso de Global es diferente, pise el trueno que se escribió erróneamente como GLOBAL path es inválido), para que pueda accederse a través de las identidades de ejecución. Sin embargo, debe señalarse que los procesos distintos a la Sesión 0 (Servicio Windows) necesitan tener el permiso SeCreateGlobalPrivilege para crear un Global\... MemoryMappedFile。 (Archivo MSDN) Para la Sesión 0, puedes consultar este artículo de MVP en el otro lado - Penetrating Session 0 Isolation (1) (El inicio de sesión del hipervínculo es visible.Tiene una introducción muy detallada.
Reimpreso de:El inicio de sesión del hipervínculo es visible.
|