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(...)
ywrite(...)
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