¿Qué son las tuberías nombradas?

¿Qué son y cómo funcionan?

El contexto es SQL Server

Tanto en Windows como en los sistemas POSIX, los pipes con nombre proporcionan un camino para que la comunicación entre procesos ocurra entre los procesos que se ejecutan en la misma máquina. Lo que los pipes con nombre le brindan es una manera de enviar sus datos sin tener la penalidad de rendimiento de involucrar a la stack de red.

Al igual que tiene un servidor que escucha una dirección / puerto IP para las solicitudes entrantes, un servidor también puede configurar un conducto con nombre que pueda escuchar las solicitudes. En cualquier caso, el proceso del cliente (o la biblioteca de acceso a BD) debe conocer la dirección específica (o el nombre de la tubería) para enviar la solicitud. A menudo, existe un valor predeterminado estándar comúnmente utilizado (al igual que el puerto 80 para HTTP, el servidor SQL usa el puerto 1433 en TCP / IP; \\. \ Pipe \ sql \ query para un conducto con nombre).

Al configurar las canalizaciones con nombre adicionales, puede tener varios servidores de bases de datos en ejecución, cada uno con sus propios detectores de solicitudes.

La ventaja de las tuberías con nombre es que suele ser mucho más rápido y libera recursos de la stack de red.

– Por cierto, en el mundo de Windows, también puede haber canalizaciones con nombre a máquinas remotas, pero en ese caso, la tubería con nombre se transporta a través de TCP / IP, por lo que perderá rendimiento. Use conductos con nombre para la comunicación de la máquina local.

Tanto Unix como Windows tienen cosas llamadas “pipes con nombre”, pero se comportan de manera diferente. En Unix, una tubería con nombre es una calle de sentido único que generalmente tiene solo un lector y un escritor: el escritor escribe, y el lector lee, ¿lo obtiene?

En Windows, lo que se llama una “tubería con nombre” es un objeto IPC más parecido a un socket TCP: las cosas pueden fluir en ambos sentidos y hay algunos metadatos (puede obtener las credenciales de la cosa en el otro extremo, etc.).

Los conductos con nombre de Unix aparecen como un archivo especial en el sistema de archivos y se puede acceder con los comandos normales de archivo IO incluido el shell. Los de Windows no, y necesitan abrirse con una llamada al sistema especial (después de lo cual se comportan principalmente como un identificador win32 normal).

Aún más confuso, Unix tiene algo llamado “socket Unix” o socket AF_UNIX, que funciona más como (pero no completamente) como win32 “named pipe”, siendo bidireccional.

Tubos de Linux
Mecanismo de comunicación de interproceso First First First (FIFO).

Tuberías sin nombre
En la línea de comando, representado por un “|” entre dos comandos.

Canalizaciones con nombre
Un archivo especial FIFO. Una vez creado, puede usar la tubería como un archivo normal (abrir, cerrar, escribir, leer, etc.).

Para crear un conducto con nombre, llamado “myPipe”, desde la línea de comando ( página man ):

mkfifo myPipe 

Para crear un conducto con nombre de c, donde “nombre de ruta” es el nombre que desea que tenga el conducto y “modo” contiene los permisos que desea que tenga el conducto ( página man ):

 #include  #include  int mkfifo(const char *pathname, mode_t mode); 

De acuerdo con Wikipedia :

[…] Una tubería tradicional es “sin nombre” porque existe de forma anónima y solo persiste durante el tiempo que el proceso se está ejecutando. Una tubería con nombre es persistente en el sistema y existe más allá de la duración del proceso y debe ser “desvinculada” o eliminada una vez que ya no se utiliza. Los procesos generalmente se conectan a la tubería nombrada (generalmente aparece como un archivo) para realizar IPC (comunicación entre procesos).

Comparar

 echo "test" | wc 

a

 mkdnod apipe p wc apipe 

wc bloqueará hasta

 echo "test" > apipe 

ejecuta

Las tuberías son una forma de transmitir datos entre aplicaciones. En Linux utilizo esto todo el tiempo para transmitir la salida de un proceso a otro. Esto es anónimo porque la aplicación de destino no tiene idea de dónde proviene esa stream de entrada. No es necesario.

Una tubería con nombre es solo una forma de conectar activamente una tubería existente y aspirar sus datos. Es para situaciones en las que el proveedor no sabe qué clientes comerán los datos.

Comunicación entre procesos (principalmente) para aplicaciones de Windows. Similar al uso de sockets para comunicarse entre aplicaciones en Unix.

MSDN

Los conductos con nombre en un contexto de Unix / Linux se pueden usar para hacer dos shells diferentes para comunicarse, ya que un shell simplemente no puede compartir nada con otro.

Además, una secuencia de comandos instanciada dos veces en el mismo shell no puede compartir nada a través de las dos instancias. Encontré un uso para named pipes al codificar un daemon que contiene la función start () y stop (), y quería usar el mismo script para realizar las dos acciones.

Sin canalizaciones con nombre (o cualquier tipo de semáforo), iniciar el script en segundo plano no es un problema. El caso es que cuando termina no puedes acceder a la instancia en segundo plano.

Por lo tanto, cuando desea enviarle el comando de detención simplemente no puede: ejecutar el mismo script sin canalizaciones con nombre y llamar a la función stop () no hará nada ya que en realidad está ejecutando otra instancia.

La solución fue implementar dos tubos, uno LEER y el otro ESCRIBIR cuando inicie el daemon. Luego, haga que él, entre otras tareas, escuche el conducto READ. Luego, la función Stop () contiene un comando que escribirá un mensaje en la tubería, que será manejado por el script de ejecución en segundo plano que realizará una salida 0. De esta manera, nuestra segunda instancia del mismo script solo tiene que hacer una tarea: Dile a la primera instancia que se detenga.

De esta forma, una y solo una secuencia de comandos puede comenzar y detenerse.

Por supuesto, tienes diferentes formas de hacerlo activando la parada mediante un toque, por ejemplo. Pero este es lindo e interesante de codificar.

Este es un ejemplo de Technet (por lo que no estoy seguro de por qué la respuesta marcada dice que las tuberías con nombre son más rápidas):

Canalizaciones nombradas vs. Sockets TCP / IP

En un entorno de red de área local (LAN) rápida, los clientes de Protocolo de control de transmisión / Protocolo de Internet (TCP / IP) y clientes de Canalizaciones con nombre son comparables con respecto al rendimiento. Sin embargo, la diferencia de rendimiento entre los sockets TCP / IP y los clientes de Named Pipes se hace evidente con redes más lentas, como en redes de área extensa (WAN) o redes de acceso telefónico. Esto se debe a las diferentes formas en que los mecanismos de comunicación entre procesos (IPC) se comunican entre pares.

Para canalizaciones con nombre, las comunicaciones de red suelen ser más interactivas. Un par no envía datos hasta que otro par lo solicite usando un comando de lectura. Una lectura de red normalmente implica una serie de mensajes de pipa antes de que empiece a leer los datos. Estos pueden ser muy costosos en una red lenta y causar un tráfico de red excesivo , que a su vez afecta a otros clientes de la red.

También es importante aclarar si está hablando de tuberías locales o redes. Si la aplicación del servidor se ejecuta localmente en la computadora que está ejecutando una instancia de SQL Server, el protocolo local de Named Pipes es una opción. Los conductos con nombre locales se ejecutan en modo núcleo y son muy rápidos.

Para los zócalos TCP / IP, las transmisiones de datos son más sencillas y tienen menos gastos generales. Las transmisiones de datos también pueden aprovechar los mecanismos de mejora del rendimiento de Sockets TCP / IP, como ventanas, reconocimientos retrasados, etc. Esto puede ser muy útil en una red lenta. Dependiendo del tipo de aplicaciones, tales diferencias de rendimiento pueden ser significativas.

Los sockets TCP / IP también admiten una cola de retraso. Esto puede proporcionar un efecto de suavizado limitado en comparación con los conductos con nombre que podrían provocar errores de ocupado por la tubería cuando intente conectarse a SQL Server.

En general, se prefiere TCP / IP en una LAN lenta, WAN o red de acceso telefónico, mientras que los conductos con nombre pueden ser una mejor opción cuando la velocidad de la red no es el problema, ya que ofrece más funcionalidad, facilidad de uso y opciones de configuración.

Canalizaciones con nombre es un sistema de Windows para la comunicación entre procesos. En el caso del servidor SQL, si el servidor está en la misma máquina que el cliente, entonces es posible usar canalizaciones con nombre para transferir los datos, en lugar de TCP / IP.

    Intereting Posts