Как называются трубы? - PullRequest
       28

Как называются трубы?

120 голосов
/ 06 октября 2008

Что они и как они работают?

Контекстом является SQL Server

Ответы [ 10 ]

136 голосов
/ 06 октября 2008

И в системах Windows, и в системах POSIX именованные каналы обеспечивают способ межпроцессного взаимодействия между процессами, работающими на одной машине. То, что дают именованные каналы, - это способ отправки данных без снижения производительности при использовании сетевого стека.

Так же, как у вас есть сервер, прослушивающий IP-адрес / порт для входящих запросов, сервер также может настроить именованный канал, который может прослушивать запросы. В любом случае клиентский процесс (или библиотека доступа к БД) должен знать конкретный адрес (или имя канала) для отправки запроса. Часто существует стандартное стандартное значение по умолчанию (как и порт 80 для HTTP, сервер SQL использует порт 1433 в TCP / IP; \\. \ Pipe \ sql \ query для именованного канала).

Устанавливая дополнительные именованные каналы, вы можете запустить несколько серверов БД, каждый со своими слушателями запросов.

Преимущество именованных каналов состоит в том, что они обычно намного быстрее и освобождают ресурсы сетевого стека.

- Кстати, в мире Windows вы также можете иметь именованные каналы для удаленных машин, но в этом случае именованный канал транспортируется по TCP / IP, поэтому вы потеряете производительность. Используйте именованные каналы для локальной связи с машиной.

38 голосов
/ 07 октября 2008

В Unix и Windows есть вещи, называемые «именованные каналы», но они ведут себя по-разному. В Unix именованный канал - это улица с односторонним движением, в которой обычно есть только один читатель и один писатель - писатель пишет, а читатель читает, вы понимаете?

В Windows то, что называется «Именованный канал», является объектом IPC, больше похожим на сокет TCP - все может проходить в обоих направлениях, и есть некоторые метаданные (вы можете получить учетные данные этого объекта на другом конце и т. Д.).

Именованные каналы Unix появляются в виде специального файла в файловой системе, и к ним можно получить доступ с помощью обычных команд ввода-вывода файла, включая оболочку. В Windows этого нет, и их нужно открывать специальным системным вызовом (после чего они ведут себя в основном как обычный дескриптор win32).

Еще более запутанно то, что в Unix есть нечто, называемое «сокет Unix» или сокет AF_UNIX, который работает больше как (но не совсем как) «именованный канал» win32, будучи двунаправленным.

22 голосов
/ 06 октября 2008

Linux Pipes
Механизм межпроцессного взаимодействия First In First Out (FIFO).

Безымянные трубы
В командной строке, представленной «|» между двумя командами.

Именованные каналы
Специальный файл FIFO. Созданный канал можно использовать как обычный файл (открыть, закрыть, записать, прочитать и т. Д.).

Чтобы создать именованный канал, называемый myPipe, из командной строки ( man page ):

mkfifo myPipe  

Чтобы создать именованный канал из c, где «pathname» - это имя, которое вы хотели бы иметь для канала, а «mode» содержит разрешения, которые вы хотите иметь для канала ( man page ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
16 голосов
/ 06 октября 2008

Согласно Википедии :

[...] Традиционный канал "неназванный", потому что он существует анонимно и сохраняется только до тех пор, пока процесс запущен. Именованный канал является системно-постоянным и существует после окончания срока службы процесса и должен быть «не связан» или удален, если он больше не используется. Процессы обычно подключаются к именованному каналу (обычно в виде файла) для выполнения IPC (межпроцессное взаимодействие).

10 голосов
/ 06 октября 2008

Сравните

echo "test" | wc

до

mkdnod apipe p
wc apipe

wc будет блокироваться до

echo "test" > apipe

выполняет

5 голосов
/ 06 октября 2008

Трубы - это способ потоковой передачи данных между приложениями. Под Linux я использую это все время для потоковой передачи результатов одного процесса в другой. Это анонимно, потому что целевое приложение не знает, откуда поступает этот поток ввода. Это не нужно.

A именованный канал - это просто способ активного подключения к существующему каналу и сбора данных. Это для ситуаций, когда поставщик не знает, какие клиенты будут есть данные.

5 голосов
/ 06 октября 2008

Межпроцессное взаимодействие (в основном) для приложений Windows. Аналогично использованию сокетов для связи между приложениями в Unix.

* MSDN 1004 *

4 голосов
/ 03 июня 2014

Это exeprt от Technet (поэтому не уверен, почему отмеченный ответ говорит, что именованные каналы быстрее ??):

Именованные каналы против сокетов TCP / IP

В среде быстрой локальной сети (LAN) клиенты с сокетами протокола управления передачей / Интернет-протоколом (TCP / IP) и по именованным каналам сравнимы по производительности. Однако разница в производительности между клиентами сокетов TCP / IP и именованных каналов становится очевидной в более медленных сетях, таких как глобальные сети (WAN) или коммутируемые сети. Это связано с тем, что механизмы межпроцессного взаимодействия (IPC) взаимодействуют между одноранговыми узлами.

Для именованных каналов сетевые коммуникации обычно более интерактивны. Одноранговый узел не отправляет данные, пока другой одноранговый узел не запросит их с помощью команды чтения. Сетевое чтение обычно включает в себя серию сообщений с именованными каналами перед тем, как начать читать данные. Они могут быть очень дорогостоящими в медленной сети и вызывать чрезмерный сетевой трафик , что, в свою очередь, влияет на других сетевых клиентов.

Также важно уточнить, говорите ли вы о локальных каналах или сетевых каналах. Если серверное приложение выполняется локально на компьютере, на котором запущен экземпляр SQL Server, можно использовать локальный протокол именованных каналов. Локальные именованные каналы работают в режиме ядра и работают очень быстро.

Для сокетов TCP / IP передача данных более рационализирована и требует меньших накладных расходов. Передача данных также может использовать преимущества механизмов повышения производительности сокетов TCP / IP, таких как управление окнами, отложенные подтверждения и т. Д. Это может быть очень полезно в медленной сети. В зависимости от типа приложений такие различия в производительности могут быть значительными.

Сокеты TCP / IP также поддерживают очередь невыполненных работ. Это может обеспечить ограниченный эффект сглаживания по сравнению с именованными каналами, что может привести к ошибкам при загрузке канала при попытке подключения к SQL Server.

Как правило, TCP / IP предпочтителен в медленной сети LAN, WAN или коммутируемой сети, в то время как именованные каналы могут быть лучшим выбором, когда скорость сети не является проблемой, поскольку они предлагают больше функциональности, простоты использования и параметры конфигурации.

3 голосов
/ 14 июля 2011

Именованные каналы в контексте unix / linux могут использоваться для связи двух разных оболочек, поскольку оболочка просто не может ничего делить с другой.

Кроме того, один экземпляр, дважды созданный в одной и той же оболочке, не может совместно использовать что-либо через два экземпляра. Я нашел применение для именованных каналов при кодировании демона, содержащего функции start () и stop (), и я хотел использовать один и тот же сценарий для выполнения этих двух действий.

Без именованных каналов (или любого другого семафора) запуск сценария в фоновом режиме не является проблемой. Дело в том, что когда он заканчивается, вы просто не можете получить доступ к экземпляру в фоновом режиме.

Поэтому, когда вы хотите отправить ему команду остановки, вы просто не можете: запуск этого же сценария без именованных каналов и вызов функции stop () ничего не сделают, поскольку вы на самом деле запускаете другой экземпляр.

Решением было реализовать две трубы, одну READ и другую WRITE при запуске демона. Затем заставьте его, среди других своих задач, прослушать канал READ. Затем функция Stop () содержит команду, которая запишет сообщение в канал, которое будет обработано фоновым запущенным сценарием, который выполнит выход 0. Таким образом, наш второй экземпляр того же сценария выполняет только задачу: скажите первому экземпляру остановиться.

Таким образом, один и только один скрипт может запускаться и останавливаться сам.

Конечно, у вас есть разные способы сделать это, например, с помощью нажатия кнопки «Стоп». Но этот хороший и интересный для кода.

1 голос
/ 06 октября 2008

Именованные каналы - это система Windows для межпроцессного взаимодействия. В случае сервера SQL, если сервер находится на том же компьютере, что и клиент, то для передачи данных можно использовать именованные каналы, а не TCP / IP.

...