Question

Que sont-ils et comment fonctionnent-ils?

Le contexte est SQL Server

Était-ce utile?

La solution

Sur les systèmes Windows et POSIX, les tubes nommés permettent à une communication inter-processus de se dérouler entre des processus s'exécutant sur le même ordinateur. Ce que vous donnez aux canaux nommés est un moyen d’envoyer vos données sans entraîner de dégradation des performances en impliquant la pile réseau.

Tout comme vous avez un serveur écoutant une adresse IP / un port pour les demandes entrantes, un serveur peut également configurer un canal nommé qui peut écouter les demandes. Dans les deux cas, le processus client (ou la bibliothèque d'accès à la base de données) doit connaître l'adresse spécifique (ou le nom du canal) à laquelle envoyer la demande. Il existe souvent une valeur par défaut standard couramment utilisée (à l'instar du port 80 pour HTTP, SQL Server utilise le port 1433 dans TCP / IP; \\. \ Pipe \ sql \ query pour un canal nommé).

En configurant des canaux nommés supplémentaires, vous pouvez exécuter plusieurs serveurs de base de données, chacun avec ses propres écouteurs de requête.

L'avantage des canaux nommés est qu'ils sont généralement beaucoup plus rapides et libèrent des ressources de pile réseau.

- BTW, dans le monde Windows, vous pouvez également attribuer des canaux nommés à des machines distantes - mais dans ce cas, le canal nommé est transporté via TCP / IP, vous perdrez donc des performances. Utilisez des canaux nommés pour la communication machine locale.

Autres conseils

Unix et Windows ont tous deux un élément appelé "Named Pipes", mais ils se comportent différemment. Sous Unix, un pipe nommée est une rue à sens unique qui n’a généralement qu’un lecteur et un écrivain - l’écrivain écrit, et le lecteur lit, vous l’obtenez?

Sous Windows, l'élément appelé "canal nommé". est un objet IPC plus semblable à une socket TCP - les choses peuvent circuler dans les deux sens et il y a des métadonnées (vous pouvez obtenir les informations d'identification de la chose à l'autre bout, etc.).

Les canaux nommés Unix apparaissent sous forme de fichier spécial dans le système de fichiers et sont accessibles avec les commandes IO de fichier normales, y compris le shell. Ceux de Windows ne le font pas et doivent être ouverts avec un appel système spécial (après quoi ils se comportent généralement comme un handle win32 normal).

Encore plus déroutant, Unix a ce qu’on appelle un "socket Unix". ou AF_UNIX socket, qui fonctionne plutôt (mais pas complètement) comme un win32 "tube nommé", étant bidirectionnel.

Pipes Linux
Premier mécanisme, premier entré, premier sorti (FIFO).

Tuyaux sans nom
Sur la ligne de commande, représentée par un " | " entre deux commandes.

Pipes nommées
Un fichier spécial FIFO. Une fois créé, vous pouvez utiliser le tuyau comme un fichier normal (ouvrir, fermer, écrire, lire, etc.).

Pour créer un canal nommé, appelé "myPipe", à partir de la ligne de commande ( page de manuel ):

mkfifo myPipe  

Pour créer un canal nommé à partir de c, où " chemin d'accès " est le nom que vous souhaitez que le tuyau ait et "mode". contient les autorisations que vous souhaitez attribuer au tuyau ( page de manuel ):

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

Selon Wikipedia :

  

[...] Un tuyau traditionnel est "non nommé". car il existe de manière anonyme et ne persiste que tant que le processus est en cours d'exécution. Un canal nommé est persistant dans le système et existe au-delà de la durée du processus et doit être "non lié". ou supprimé une fois qu'il n'est plus utilisé. Les processus s’attachent généralement au canal nommé (apparaissant généralement sous la forme d’un fichier) pour effectuer une IPC (communication interprocessus).

Comparer

echo "test" | wc

à

mkdnod apipe p
wc apipe

wc bloquera jusqu'à ce que

echo "test" > apipe

exécute

Les pipes sont un moyen de diffuser des données entre des applications. Sous Linux, je l’utilise tout le temps pour diffuser la sortie d’un processus dans un autre. Ceci est anonyme car l'application de destination n'a aucune idée de l'origine de ce flux d'entrée. Ce n'est pas nécessaire.

Un tuyau nommé n’est qu’un moyen de s’accrocher activement à un tuyau existant et de passer ses données à la main. C'est pour les situations où le fournisseur ne sait pas quels clients vont manger les données.

Communication inter-processus (principalement) pour les applications Windows. Semblable à l’utilisation de sockets pour la communication entre applications sous Unix.

MSDN

Ceci est un extrait de Technet (vous ne savez donc pas pourquoi la réponse marquée indique que les pipes nommées sont plus rapides ??):

Tubes nommés et sockets TCP / IP

Dans un environnement de réseau local rapide (LAN), les clients Sockets et Named Pipes de Transmission Control Protocol / Internet Protocol (TCP / IP) sont comparables en termes de performances. Toutefois, la différence de performances entre les clients TCP / IP Sockets et les clients Named Pipes devient évidente avec les réseaux plus lents, tels que les réseaux WAN ou les réseaux d'accès à distance. Cela est dû aux différentes manières dont les mécanismes de communication interprocessus (IPC) communiquent entre homologues.

Pour les canaux nommés, les communications réseau sont généralement plus interactives. Un pair n'envoie pas de données jusqu'à ce qu'un autre pair le demande à l'aide d'une commande de lecture. Une lecture en réseau implique généralement une série de messages de canal nommés avant de commencer à lire les données. Celles-ci peuvent être très coûteuses dans un réseau lent et provoquer un trafic réseau excessif , ce qui affecte d'autres clients du réseau.

Il est également important de préciser si vous parlez de tuyaux locaux ou de tuyaux de réseau. Si l'application serveur s'exécute localement sur l'ordinateur qui exécute une instance de SQL Server, le protocole local Named Pipes est une option. Les canaux nommés locaux s'exécutent en mode noyau et sont très rapides.

Pour les sockets TCP / IP, les transmissions de données sont plus simples et nécessitent moins de temps système. Les transmissions de données peuvent également tirer parti des mécanismes d'amélioration des performances des sockets TCP / IP tels que le fenêtrage, les accusés de réception retardés, etc. Cela peut être très utile dans un réseau lent. Selon le type d’application, ces différences de performances peuvent être importantes.

Les sockets TCP / IP prennent également en charge une file d'attente de backlog. Cela peut fournir un effet de lissage limité par rapport aux canaux nommés, ce qui pourrait entraîner des erreurs de canal lorsque vous essayez de vous connecter à SQL Server.

Généralement, le protocole TCP / IP est préférable dans les réseaux LAN, WAN ou dial-up lents, alors que les canaux nommés peuvent constituer un meilleur choix lorsque la vitesse du réseau n’est pas en cause, car elle offre davantage de fonctionnalités, une plus grande facilité d'utilisation et options de configuration.

Les pipes nommés dans un contexte unix / linux peuvent être utilisés pour créer deux shells différents afin de communiquer car un shell ne peut tout simplement pas partager quoi que ce soit avec un autre.

De plus, un script instancié deux fois dans le même shell ne peut rien partager entre les deux instances. Lors de la codification d’un démon contenant les fonctions start () et stop (), j’ai trouvé un usage intéressant pour les canaux nommés et je souhaitais utiliser le même script pour effectuer les deux actions.

Sans les canaux nommés (ni aucun type de sémaphore), le démarrage du script en arrière-plan n’est pas un problème. En fin de compte, vous ne pouvez pas accéder à l'instance en arrière-plan.

Donc, lorsque vous voulez lui envoyer la commande stop, vous ne pouvez plus: exécuter le même script sans les tubes nommés et appeler la fonction stop () ne fera rien, car vous exécutez une autre instance.

La solution consistait à implémenter deux tubes, l'un READ et l'autre WRITE lorsque vous démarrez le démon. Ensuite, faites-lui écouter, entre autres tâches, le tuyau READ. Ensuite, la fonction Stop () contient une commande qui écrira un message dans le canal, qui sera géré par le script en arrière-plan qui exécutera une sortie 0. De cette manière, notre deuxième instance du même script n'a qu'une tâche à accomplir: dites à la première instance de s'arrêter.

Ainsi, un et un seul script peut démarrer et s’arrêter de lui-même.

Bien sûr, vous avez différentes façons de le faire en déclenchant l’arrêt via une touche par exemple. Mais celui-ci est agréable et intéressant à coder.

Les tubes nommés sont un système Windows pour la communication interprocessus. Dans le cas d'un serveur SQL, si le serveur est sur la même machine que le client, il est possible d'utiliser des canaux nommés pour transférer les données, par opposition à TCP / IP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top