Hace poco leí sobre tuberías con nombre, y no podía entender por qué existen.
He leído en alguna parte que usar una tubería con nombre lleva menos tiempo que usar un archivo.
¿Por qué esto es tan?
Las canalizaciones con nombre también deben almacenarse en la memoria (y tal vez intercambiarse, al igual que los archivos).
Por lo que puedo ver, deben obtener un inodo al que debe hacer referencia el directorio actual, al igual que los archivos. Además, el programador debe eliminarlos, al igual que los archivos.
Entonces, ¿dónde radica la ventaja?
Respuestas:
Casi todo en Linux puede considerarse un archivo , pero la principal diferencia entre un archivo normal y una canalización con nombre es que una canalización con nombre es una instancia especial de un archivo que no tiene contenido en el sistema de archivos.
Aquí hay una cita de
man fifo
:Entonces, en realidad, una tubería con nombre no hace nada hasta que algún proceso lo lee y escribe. No ocupa espacio en el disco duro (excepto un poco de metainformación), no utiliza la CPU.
Puede verificarlo haciendo esto:
Crear una tubería con nombre
Vaya a algún directorio, por ejemplo
/home/user/Documents
, y gzip todo lo que contiene, usando una tubería con nombre.Aquí debería ver el PID del proceso gzip. En nuestro ejemplo fue 28584.
Ahora verifique qué está haciendo este PID
Verá que no está utilizando recursos . 0% de uso de CPU, 0% de uso de memoria.
Verifique el presentimiento sobre el uso del espacio de archivos
Y de nuevo
0
, nada. El tubo de ensayo podría usarse nuevamente si fuera necesario.No te olvides de matar a gzip, usando
kill -15 28584
. Y quite nuestra tubería con nombre usandorm /tmp/testpipe
Usos de ejemplo
Puede redirigir casi todo utilizando una canalización con nombre. Como ejemplo, puede ver este proxy de una línea .
También aquí hay una buena explicación más del uso de tuberías con nombre. Puede configurar dos procesos en un servidor para comunicarse utilizando una tubería con nombre en lugar de la pila TCP / IP. Es mucho más rápido y no carga recursos de red. Por ejemplo, su servidor web puede comunicarse con la base de datos directamente usando una tubería con nombre, en lugar de usar la
localhost
dirección o escuchar algún puerto.fuente
Es cierto que no usará la memoria del sistema, pero el hecho de que no use CPU en su ejemplo es solo porque no lee la tubería, por lo que el proceso está esperando.
Considere el siguiente ejemplo:
Ahora abra una nueva consola y ejecute:
Y en una tercera consola:
Si observa el cmd del reloj (segundo término), ¡mostrará un aumento en el consumo de CPU!
fuente
Aquí hay un caso de uso en el que las canalizaciones con nombre pueden ahorrarle mucho tiempo al eliminar las E / S.
Supongamos que tiene un BigFile, por ejemplo 10G.
También tiene divisiones de este BigFile en piezas de 1G, BigFileSplit_01 a BigFile_Split_10.
Ahora tiene una duda sobre la corrección de BigFileSplit_05
Ingenuamente, sin canalizaciones con nombre, crearía una nueva división de BigFile y compararía:
Con tuberías con nombre harías
A primera vista, eso puede no parecer una gran diferencia ... ¡pero con el tiempo la diferencia es enorme!
Opción 1:
Opcion 2:
Entonces, básicamente, la tubería con nombre le ahorra aquí una lectura y escritura de 1G más una limpieza del sistema de archivos (ya que no escribimos nada en el sistema de archivos excepto el nodo vacío de Fifo).
No hacer E / S, especialmente las escrituras, también es bueno para evitar el desgaste de sus discos. Es aún más interesante cuando trabaja con SSD, ya que tienen un número limitado de escrituras antes de que las células mueran.
(1) Obviamente, otra opción sería crear ese archivo temporal en RAM, por ejemplo si / tmp está montado en RAM (tmpfs). Sin embargo, estaría limitado por el tamaño del disco RAM, mientras que el "truco de la tubería con nombre" no tiene límites.
fuente
Puede dejar que un programa permanezca quieto y escuchar una canalización con nombre para algún evento externo. Tan pronto como ocurra el evento externo (por ejemplo, la llegada de algunos datos nuevos) esto podría ser detectado por otro programa que a su vez abre la tubería para escribir, escribiendo los datos de eventos relevantes en la tubería. Cuando se emite la declaración de cierre, el programa de escucha recibirá el flujo de datos a través de la tubería a través de una declaración de lectura, y está listo para procesar lo que tiene. No olvide cerrar la tubería después de leer el contenido. El programa de escucha también podría devolver resultados de su procesamiento a través del mismo, o a través de otra tubería con nombre. Tales comunicaciones entre programas son muy convenientes a veces.
fuente