Что они собой представляют и как работают?
Контекст оказывается SQL Server
Что они собой представляют и как работают?
Контекст оказывается SQL Server
Ответы:
И в системах Windows, и в POSIX именованные каналы обеспечивают способ межпроцессного взаимодействия между процессами, выполняющимися на одном компьютере. Именованные каналы дают вам возможность отправлять данные без потери производительности, связанной с привлечением сетевого стека.
Так же, как у вас есть сервер, который прослушивает IP-адрес / порт для входящих запросов, сервер также может настроить именованный канал, который может прослушивать запросы. В любом случае клиентский процесс (или библиотека доступа к БД) должен знать конкретный адрес (или имя канала) для отправки запроса. Часто существует обычно используемое стандартное значение по умолчанию (как и порт 80 для HTTP, SQL-сервер использует порт 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 First In First 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);
tell()
позиционировать, ни seek()
в трубе.
Согласно Википедии :
[...] Традиционный канал "безымянный", потому что он существует анонимно и сохраняется только до тех пор, пока выполняется процесс. Именованный канал является постоянным в системе и существует после истечения срока действия процесса и должен быть «отсоединен» или удален, как только он больше не используется. Процессы обычно подключаются к именованному каналу (обычно представляющемуся в виде файла) для выполнения IPC (межпроцессного взаимодействия).
сравнить
echo "test" | wc
в
mkdnod apipe p
wc apipe
туалет будет заблокирован до тех пор, пока
echo "test" > apipe
исполняет
Каналы - это способ потоковой передачи данных между приложениями. Под Linux я все время использую это для потоковой передачи вывода одного процесса в другой. Это анонимно, потому что целевое приложение не знает, откуда приходит этот входной поток. Это не нужно.
Имя труба просто способ активно закреплять на существующую трубу и пылесосить вверх свои данные. Это для ситуаций, когда провайдер не знает, какие клиенты будут поглощать данные.
Это эксперт от Technet (поэтому не уверен, почему отмеченный ответ говорит, что именованные каналы быстрее?):
Именованные каналы против сокетов TCP / IP
В среде быстрой локальной сети (LAN) сокеты протокола управления передачей / Интернет-протокола (TCP / IP) и клиенты именованных каналов сопоставимы по производительности. Однако разница в производительности между клиентами TCP / IP Sockets и Named Pipes становится очевидной в более медленных сетях, например в глобальных сетях (WAN) или в сетях удаленного доступа. Это происходит из-за различных способов взаимодействия механизмов межпроцессного взаимодействия (IPC) между одноранговыми узлами.
Для именованных каналов сетевое взаимодействие обычно более интерактивно. Одноранговый узел не отправляет данные, пока другой одноранговый узел не запросит его с помощью команды чтения. Чтение по сети обычно включает в себя серию сообщений о просмотре именованных каналов перед тем, как начать чтение данных. Это может быть очень дорогостоящим в медленной сети и вызывать чрезмерный сетевой трафик , который, в свою очередь, влияет на других сетевых клиентов.
Также важно уточнить, идет ли речь о локальных или сетевых трубопроводах. Если серверное приложение выполняется локально на компьютере, на котором работает экземпляр SQL Server, можно использовать локальный протокол именованных каналов. Локальные именованные каналы работают в режиме ядра и работают очень быстро.
Для сокетов TCP / IP передача данных более упрощена и требует меньше накладных расходов. При передаче данных также могут использоваться механизмы повышения производительности сокетов TCP / IP, такие как управление окнами, отложенные подтверждения и т. Д. Это может быть очень полезно в медленной сети. В зависимости от типа приложений такие различия в производительности могут быть значительными.
Сокеты TCP / IP также поддерживают очередь невыполненных работ. Это может обеспечить ограниченный эффект сглаживания по сравнению с именованными каналами, что может привести к ошибкам занятости канала при попытке подключения к SQL Server.
Как правило, TCP / IP предпочтительнее в медленных LAN, WAN или коммутируемых сетях, тогда как именованные каналы могут быть лучшим выбором, когда скорость сети не является проблемой, поскольку они предлагают больше функциональных возможностей, простоты использования и параметров конфигурации.
Межпроцессное взаимодействие (в основном) для приложений Windows. Подобно использованию сокетов для связи между приложениями в Unix.
Именованные каналы в контексте unix / linux могут использоваться для создания двух разных оболочек для взаимодействия, поскольку оболочка просто не может делиться чем-либо с другой.
Более того, один сценарий, дважды созданный в одной оболочке, не может использовать что-либо совместно с двумя экземплярами. Я нашел применение именованным каналам при кодировании демона, содержащего функции start () и stop (), и хотел использовать один и тот же сценарий для выполнения этих двух действий.
Без именованных каналов (или любого семафора) запуск скрипта в фоновом режиме не является проблемой. Дело в том, что когда он завершится, вы просто не сможете получить доступ к экземпляру в фоновом режиме.
Поэтому, когда вы хотите отправить ему команду остановки, вы просто не можете: запуск того же сценария без именованных каналов и вызов функции stop () ничего не даст, поскольку вы фактически запускаете другой экземпляр.
Решением было реализовать два канала, один READ и другой WRITE при запуске демона. Затем заставьте его, среди других его задач, слушать трубку READ. Затем функция Stop () содержит команду, которая запишет сообщение в конвейер, которое будет обрабатываться фоновым скриптом, который выполнит выход 0. Таким образом, наш второй экземпляр того же скрипта имеет только одну задачу: скажите первому экземпляру остановиться.
Таким образом, один и только один скрипт может запускаться и останавливаться.
Конечно, у вас есть разные способы сделать это, например, активировав стоп одним касанием. Но этот красивый и интересный для программирования.
Именованные каналы - это система Windows для межпроцессного взаимодействия. В случае SQL-сервера, если сервер находится на том же компьютере, что и клиент, можно использовать именованные каналы для передачи данных, в отличие от TCP / IP.