GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de archivos para IPC de memoria compartida

Esencialmente, estoy tratando de entender qué sucede cuando dos procesos tienen el mismo archivo abierto al mismo tiempo, y si uno podría usar esto para ofrecer una comunicación segura y eficaz entre los procesos.

Si está utilizando archivos regulares usando read y write operaciones (es decir, no mapeo de memoria), entonces los dos procesos no comparten ninguna memoria.

  • Memoria de espacio de usuario en Java Buffer los objetos asociados con el archivo NO se comparten entre espacios de direcciones.
  • Cuando un write se realiza la llamada al sistema, los datos se copian desde páginas en el espacio de direcciones de un proceso hasta páginas en el espacio del kernel. (Estos podrían ser páginas en la memoria caché de la página. Eso es específico del sistema operativo).
  • Cuando un read se realiza la llamada al sistema, los datos se copian desde páginas en el espacio del núcleo hasta páginas en el espacio de direcciones de los procesos de lectura.

Tiene que hacerse de esa manera. Si el sistema operativo compartiera páginas asociadas con los búferes de procesos de lectura y escritura a sus espaldas, eso sería un agujero de fuga de información/seguridad:

  • El lector podría ver datos en el espacio de direcciones del escritor que aún no se habían escrito a través de write(...) , y tal vez nunca lo sería.
  • El escritor podría ver los datos que el lector (hipotéticamente) escribió en su búfer de lectura.
  • No sería posible abordar el problema mediante un uso inteligente de la protección de la memoria porque la granularidad de la protección de la memoria es una página frente a la granularidad de read(...) y write(...) que es tan pequeño como un solo byte.

Claro:puede usar de forma segura la lectura y escritura de archivos para transferir datos entre dos procesos. Pero necesitaría definir un protocolo que le permita al lector saber cuántos datos ha escrito el escritor. Y el lector sabiendo cuándo el escritor ha escrito algo que podría implicar encuestas; p.ej. para ver si el archivo ha sido modificado.

Si observa esto en términos de solo la copia de datos en el "canal" de comunicación

  • Con los archivos asignados a la memoria, copia (serializa) los datos de los objetos del montón de la aplicación al búfer asignado y una segunda vez (deserializa) del búfer asignado a los objetos del montón de la aplicación.

  • Con los archivos ordinarios hay dos copias adicionales:1) desde el búfer de procesos de escritura (no asignado) a las páginas de espacio del kernel (por ejemplo, en la memoria caché de la página), 2) desde las páginas de espacio del kernel al búfer de procesos de lectura (no asignado) .

El siguiente artículo explica lo que sucede con la lectura/escritura convencional y el mapeo de memoria. (Está en el contexto de copiar un archivo y "copia cero", pero puede ignorarlo).

Referencia:

  • Zero Copy I:Perspectiva de modo de usuario

Linux
  1. ¿Cómo recuperar archivos borrados en Linux usando la herramienta de recuperación de datos Scalpel?

  2. Linux:¿problemas de permisos para el directorio compartido en un servidor?

  3. ¿Pseudoarchivos para datos temporales?

  4. Usando rsync para sincronizar archivos

  5. ¿Estoy usando virtio para mi invitado KVM?

Cómo verificar la memoria compartida de Linux usando el comando ipcs

Uso de GPG para cifrar y descifrar archivos en Linux [práctica para principiantes]

Usando Bash para la automatización

Consejos para usar tmux

Consejos para usar la pantalla

Cómo instalar y usar Okteta para archivos de datos RAW en Linux