mkfifo: ¿ocurre realmente la E / S de disco?

10

Tengo 2 aplicaciones:

  • Productor (N instancias)
  • Consumidor (1 instancia)

Actualmente escribo resultados intermedios de los productores, y luego el consumidor lee estos archivos del disco y produce un resultado final .

Me gustaría minimizar esta E / S "transmitiendo" los resultados de los productores directamente al consumidor.

Me encontré con tuberías con nombre (mkfifo) y un ejemplo posterior aquí . Esto se ve muy bien, pero lo que no puedo determinar es cómo se implementa realmente. ¿Se está almacenando la cola FIFO en un archivo? Si es así, eso probablemente no me ayudaría. Me gustaría que el contenido se transmita "a través de la memoria" por completo sin utilizar el disco. ¿Quizás esto no sea posible en todos los procesos?

Jmoney38
fuente

Respuestas:

10

No hay E / S de disco (excepto quizás cuando se navega por el sistema de archivos para abrir el archivo fifo).

Desde la página del comando man fifo (7) de Linux :

Un archivo especial FIFO (una tubería con nombre) es similar a una tubería, excepto que se accede como parte del sistema de archivos. [...] Cuando los procesos intercambian datos a través de FIFO, el núcleo pasa todos los datos internamente sin escribirlos en el sistema de archivos. Por lo tanto, el archivo especial FIFO no tiene contenido en el sistema de archivos; la entrada del sistema de archivos simplemente sirve como punto de referencia para que los procesos puedan acceder a la tubería utilizando un nombre en el sistema de archivos.

Mark Plotnick
fuente
Perfecto. Leí la página de manual de mkfifo, pero no pensé en buscar una página sobre "fifo". ¡Gracias!
Jmoney38
3

Realmente no importa si su resultado está respaldado en disco o no, porque si hay suficiente memoria disponible, de todos modos se almacenará en caché y no se realizará ninguna E / S de disco real. Por el contrario, si tiene respaldo de memoria y no hay suficiente memoria disponible, podría cambiarse al disco.

Si tuviera que adivinar, diría que la tubería está realmente basada en la memoria, pero entonces, esto solo debería cambiar si los datos en cola se conservan entre los reinicios.

Lo que debe tener en cuenta es que, dado que tiene varios productores, sus escritos deben ser atómicos para que no se intercalen en la cola. Consulte man 7 pipepara obtener detalles sobre cómo asegurarse de que una escritura sea atómica.

pqnet
fuente