Pergunta

O que são e como eles funcionam?

Contexto passa a ser SQL Server

Foi útil?

Solução

sistemas

Tanto no Windows e POSIX, chamados-pipes fornecer uma maneira para comunicação entre processos para ocorrer entre os processos em execução na mesma máquina. O que pipes nomeados dar é uma forma de enviar os seus dados sem ter a pena de envolver a pilha de rede desempenho.

Assim como você tem uma escuta servidor para um endereço / porta IP para solicitações de entrada, um servidor pode também criar um pipe nomeado que pode escutar as solicitações. Em ambos os casos, o processo do cliente (ou a biblioteca de acesso DB) deve saber o endereço específico (ou o nome do pipe) para enviar o pedido. Muitas vezes, existe uma norma padrão comumente usado (muito parecido com a porta 80 para HTTP, o SQL Server utiliza a porta 1433 em TCP / IP; \\. \ Pipe \ sql \ query para um pipe nomeado).

Através da criação de pipes nomeados adicionais, você pode ter vários servidores de banco de dados em execução, cada um com seus próprios ouvintes solicitação.

A vantagem de pipes nomeados é que é geralmente muito mais rápido, e libera recursos pilha de rede.

- BTW, no mundo Windows, você também pode ter pipes nomeados para máquinas remotas - mas, nesse caso, o pipe nomeado é transportado através de TCP / IP, assim você vai perder desempenho. Use pipes nomeados para comunicação máquina local.

Outras dicas

Unix e Windows ambos têm coisas chamadas "Pipes nomeados", mas se comportam de forma diferente. No Unix, um pipe nomeado é uma rua de sentido único, que normalmente tem apenas um leitor e um escritor -? As gravações escritor eo leitor lê, você obtê-lo

No Windows, a coisa chamada de "pipe nomeado" é um objeto IPC mais como um soquete TCP - as coisas podem fluir nos dois sentidos e há alguns metadados (Você pode obter as credenciais da coisa na outra extremidade etc).

Unix chamado tubos aparecer como um arquivo especial no sistema de arquivos e pode ser acessado com arquivos normal IO comandos incluindo o shell. as janelas não, e necessidade de ser aberta com uma chamada de sistema especial (após o qual eles se comportam principalmente como um manipulador win32).

Ainda mais confuso, Unix tem algo chamado de "socket" ou tomada AF_UNIX, que funciona mais como (mas não completamente como) um win32 "pipe nomeado", sendo bidirecional.

Pipes Linux
First In First Out (FIFO) mecanismo de comunicação interproccess.

Pipes Sem nome
Na linha de comando, representada por um "|" entre dois comandos.

pipes nomeados
A FIFO arquivo especial. Uma vez criado, você pode usar o tubo como um arquivo normal (abrir, fechar, escrever, ler, etc).

Para criar um pipe nomeado, chamado de "mypipe", a partir da linha de comando ( ):

mkfifo myPipe  

Para criar um pipe nomeado a partir de c, onde "caminho" é o nome que você gostaria que o tubo de ter e "modo" contém as permissões que deseja o tubo ter ( homem página ):

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

De acordo com a Wikipedia :

[...] Um tubo tradicional é "sem nome", porque existe anonimamente e persiste apenas durante o tempo que o processo está em execução. Um pipe nomeado é persistente-sistema e existe além da vida do processo e deve ser "desligado" ou excluído, uma vez que não está mais sendo usado. Processos geralmente anexar ao pipe nomeado (geralmente aparecendo como um arquivo) para executar IPC (comunicação entre processos).

Comparar

echo "test" | wc

para

mkdnod apipe p
wc apipe

wc irá bloquear até

echo "test" > apipe

executa

Pipes são uma forma de streaming de dados entre aplicações. No Linux eu uso isso o tempo todo para transmitir a saída de um processo para outro. Esta é anônimo porque o aplicativo de destino não tem idéia de onde esse input-stream vem. Ele não precisa.

A nome tubulação é apenas uma maneira de ligar ativamente para um tubo existente e hoovering-up seus dados. É para situações em que o fornecedor não sabem o que os clientes serão comer os dados.

comunicação entre processos (principalmente) para aplicações do Windows. Semelhante ao uso de soquetes para se comunicar entre aplicações em Unix.

MSDN

Este é um exeprt da Technet (então não tenho certeza por que a resposta marcada diz pipes nomeados são mais rápidos ??):

pipes nomeados contra Sockets TCP / IP

Em um ambiente de rápida rede de área local (LAN), Transmission Control Protocol / Internet soquetes e pipes nomeados clientes Protocol (TCP / IP) são comparáveis ??em termos de performance. No entanto, a diferença de desempenho entre os Sockets IP / TCP e clientes Named Pipes se torna aparente com as redes mais lentas, como em redes de largura da área (WANs) ou redes dial-up. Isto é devido as diferentes formas da comunicação entre processos (IPC) mecanismos de comunicação entre pares.

Para pipes nomeados, as comunicações de rede são tipicamente mais interativo. Um peer não envia dados até que outro ponto pede para ele usando um comando de leitura. Uma rede ler normalmente envolve uma série de mensagens de peek pipes nomeados antes de começar a ler os dados. Estes podem ser muito caro em uma rede lenta e causar tráfego de rede excessivo , que por sua vez afeta a outros clientes da rede.

Também é importante esclarecer se você está falando de tubos locais ou tubos de rede. Se o aplicativo do servidor está sendo executado localmente no computador que está executando uma instância do SQL Server, o protocolo pipes nomeados local é uma opção. Locais pipes nomeados é executado em modo kernel e é muito rápido.

Para sockets TCP / IP, transmissões de dados são mais simplificados e têm menos sobrecarga. transmissões de dados também pode tirar proveito de mecanismos de melhoria de desempenho sockets TCP / IP, como de janelas, confirmações atrasadas, e assim por diante. Isso pode ser muito útil em uma rede lenta. Dependendo do tipo de aplicações, tais diferenças de desempenho pode ser significativo.

TCP / IP Sockets também suportam uma fila de backlog. Isso pode proporcionar um efeito de alisamento limitada em comparação com pipes nomeados que podem levar a erros de tubulação-ocupado quando você está tentando se conectar ao SQL Server.

Geralmente, TCP / IP é o preferido em uma LAN lenta, WAN ou rede dial-up, enquanto pipes nomeados pode ser uma escolha melhor quando a velocidade da rede não é a questão, uma vez que oferece mais funcionalidade, facilidade de uso, e opções de configuração.

Os pipes nomeados em um contexto unix / linux pode ser usado para fazer duas conchas diferentes para se comunicar desde que um shell simplesmente não pode compartilhar qualquer coisa com outra.

Além disso, um roteiro instanciado duas vezes no mesmo shell não pode compartilhar qualquer coisa através das duas instâncias. Eu encontrei um uso para pipes nomeados quando a codificação de um daemon que contém o start () e a função stop (), e eu queria usar o mesmo script para executar as duas ações.

Sem pipes nomeados (ou qualquer tipo de semáforo) a partir do roteiro no fundo não é um problema. A coisa é quando termina você simplesmente não pode acessar a instância no fundo.

Então, quando você quer enviar-lhe o comando de parada que você simplesmente não pode:. Executando o mesmo script sem pipes nomeados e chamando a função stop () não vai fazer nada desde que você está realmente em execução outra instância

A solução foi implementar dois tubos, um LEIA eo outro WRITE quando você iniciar o daemon. Em seguida, fazê-lo, entre suas outras tarefas, ouvir o tubo READ. Então, a função Stop () contém um comando que vai escrever uma mensagem no tubo, que será tratado pelo script em execução em segundo plano que irá realizar uma saída 0. Desta forma, nossa segunda instância do mesmo script tem apenas na tarefa de fazer: dizer a primeira instância para parar.

Desta forma, um e somente um script pode iniciar e parar em si.

Claro que você tem maneiras diferentes de fazê-lo, desencadeando a parada via um toque por exemplo. Mas este é agradável e interessante código.

Pipes nomeados é um sistema de janelas para a comunicação inter-processo. No caso do servidor SQL, se o servidor está na mesma máquina que o cliente, então é possível usar pipes nomeados para tranfer os dados, ao invés de TCP / IP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top