Pregunta

¿Qué son y cómo funcionan?

El contexto pasa a ser SQL Server

¿Fue útil?

Solución

Tanto en los sistemas Windows como POSIX, las canalizaciones con nombre proporcionan una forma para que se produzca una comunicación entre procesos entre los procesos que se ejecutan en la misma máquina. Lo que le proporcionan las canalizaciones con nombre es una forma de enviar sus datos sin tener la penalización de rendimiento de involucrar a la pila de red.

Al igual que usted tiene un servidor que escucha una dirección IP / puerto para las solicitudes entrantes, un servidor también puede configurar una canalización con nombre que puede escuchar las solicitudes. En cualquiera de los casos, el proceso del cliente (o la biblioteca de acceso a la base de datos) debe conocer la dirección específica (o el nombre de la tubería) para enviar la solicitud. A menudo, existe un estándar predeterminado comúnmente usado (como el puerto 80 para HTTP, el servidor SQL usa el puerto 1433 en TCP / IP; \\. \ Pipe \ sql \ consulta para una canalización con nombre).

Al configurar tuberías con nombre adicionales, puede tener múltiples servidores de base de datos en ejecución, cada uno con sus propios escuchas de solicitud.

La ventaja de las canalizaciones con nombre es que generalmente es mucho más rápido y libera recursos de la pila de red.

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

Otros consejos

Unix y Windows tienen dos elementos denominados " canalizaciones con nombre " ;, pero se comportan de manera diferente. En Unix, una canalización con nombre es una calle de sentido único que normalmente tiene un solo lector y un solo escritor; el escritor escribe y el lector lee, ¿entiendes?

En Windows, lo que se llama un " canalización con nombre " es un objeto de 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.).

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

Aún más confuso, Unix tiene algo que se llama un " socket Unix " o el zócalo AF_UNIX, que funciona más como (pero no completamente) un win32 denominado "pipe", siendo bidireccional.

Linux Pipes
Mecanismo de comunicación interproccess First In First Out (FIFO).

Canalizaciones sin nombre
En la línea de comando, representado por un " | " entre dos órdenes.

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 una canalización con nombre, llamada "myPipe", desde la línea de comando ( página de manual ):

mkfifo myPipe  

Para crear una tubería con nombre desde c, donde " nombre de ruta " es el nombre que desea que tenga la canalización y " modo " contiene los permisos que desea que tenga la canalización ( página de manual ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

Según Wikipedia :

  

[...] Una tubería tradicional no tiene un nombre " " porque existe de forma anónima y persiste solo mientras el proceso se está ejecutando. Una canalización con nombre es persistente en el sistema y existe más allá de la vida del proceso y debe estar " desvinculada " o borrado una vez que ya no se está utilizando. Los procesos generalmente se conectan a la canalización con nombre (que generalmente aparece como un archivo) para realizar la 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. Bajo Linux, lo uso 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 secuencia de entrada. No es necesario.

Un tubo llamado es solo una forma de conectar activamente a un tubo existente y de recoger sus datos. Es para situaciones en las que el proveedor no sabe qué clientes se comen los datos.

Comunicación entre procesos (en su mayoría) para aplicaciones de Windows. Similar a usar sockets para comunicarse entre aplicaciones en Unix.

MSDN

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

Canalizaciones con nombre frente a sockets TCP / IP

En un entorno de red de área local (LAN) rápida, los sockets de Protocolo de control de transmisión / Protocolo de Internet (TCP / IP) y los Piples con nombre son comparables con respecto al rendimiento. Sin embargo, la diferencia de rendimiento entre los clientes TCP / IP Sockets y Named Pipes se hace evidente con las redes más lentas, como en redes de área amplia (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 interlocutor no envía datos hasta que otro interlocutor lo solicite mediante un comando de lectura. Una lectura de red generalmente involucra una serie de mensajes peekes con nombre antes de comenzar 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 canalizaciones locales o de red. Si la aplicación del servidor se ejecuta localmente en la computadora que ejecuta una instancia de SQL Server, el protocolo local de Canalizaciones con nombre es una opción. Las tuberías locales con nombre se ejecutan en modo kernel y son muy rápidas.

Para los sockets TCP / IP, las transmisiones de datos son más simplificadas y tienen menos sobrecarga. Las transmisiones de datos también pueden aprovechar los mecanismos de mejora del rendimiento de TCP / IP Sockets, como ventanas, acuses de recibo retrasados, etc. Esto puede ser muy útil en una red lenta. Dependiendo del tipo de aplicaciones, estas diferencias de rendimiento pueden ser significativas.

Los sockets TCP / IP también admiten una cola de trabajos pendientes. Esto puede proporcionar un efecto de suavizado limitado en comparación con las canalizaciones con nombre que podrían llevar a errores de tubería cuando intenta conectarse a SQL Server.

En general, se prefiere TCP / IP en redes LAN, WAN o de acceso telefónico lentas, mientras que las canalizaciones 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.

Las tuberías con nombre en un contexto de Unix / Linux se pueden usar para hacer que dos shells diferentes se comuniquen, ya que una shell simplemente no puede compartir nada con otra.

Además, un script instanciado dos veces en el mismo shell no puede compartir nada a través de las dos instancias. Encontré un uso para canalizaciones con nombre 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 tuberías con nombre (o cualquier tipo de semáforo) el inicio del script en segundo plano no es un problema. La cosa es que cuando termina, no puedes acceder a la instancia en segundo plano.

Entonces, cuando quiere 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 conductos, uno LEER y el otro ESCRIBIR cuando inicias el daemon. Luego hágale, entre sus otras tareas, escuchar el tubo LEER. Luego, la función Stop () contiene un comando que escribirá un mensaje en la canalización, 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 manera, solo un script puede iniciarse y detenerse por sí mismo.

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

Las tuberías con nombre son 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, es posible usar canalizaciones con nombre para transferir los datos, en lugar de TCP / IP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top