Что такое именованные каналы?


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

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

10 110

10 ответов:

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

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

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

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

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

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

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

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

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

Linux Pipes
Первый в первом Out (FIFO) механизм межпроцессной связи.

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

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

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

mkfifo myPipe  

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

#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

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

echo "test" > apipe

выполняет

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

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

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

MSDN

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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