Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

mkfifo myPipe  

Чтобы создать именованный канал из c, где " pathname " это имя, которое вы хотите, чтобы канал имел и "режим" quot; содержит разрешения, которые должен иметь канал ( страница man ):

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

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

  

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

Сравнить

echo "test" | wc

Для

mkdnod apipe p
wc apipe

туалет будет блокироваться до тех пор, пока

echo "test" > apipe

выполняет

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

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

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

MSDN

Это 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 или коммутируемой сети, в то время как именованные каналы могут быть лучшим выбором, когда скорость сети не является проблемой, поскольку они предлагают больше функциональности, простоты использования и параметры конфигурации.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top