Domanda

Cosa sono e come funzionano?

Il contesto sembra essere SQL Server

È stato utile?

Soluzione

Sia sui sistemi Windows che POSIX, le named pipe forniscono un modo per la comunicazione tra processi tra i processi in esecuzione sulla stessa macchina. Ciò che ti dà il nome di pipe è un modo per inviare i tuoi dati senza avere la penalità prestazionale di coinvolgere lo stack di rete.

Proprio come un server che ascolta un indirizzo IP / porta per le richieste in arrivo, un server può anche impostare una named pipe in grado di ascoltare le richieste. In entrambi i casi, il processo client (o la libreria di accesso al DB) deve conoscere l'indirizzo specifico (o il nome della pipe) per inviare la richiesta. Spesso esiste un valore predefinito standard comunemente usato (molto simile alla porta 80 per HTTP, il server SQL utilizza la porta 1433 in TCP / IP; \\. \ Pipe \ sql \ query per una pipe denominata).

Impostando ulteriori named pipe, è possibile avere più server DB in esecuzione, ognuno con i propri listener di richieste.

Il vantaggio delle named pipe è che di solito è molto più veloce e libera risorse dello stack di rete.

- A proposito, nel mondo di Windows, puoi anche avere pipe nominate su macchine remote, ma in quel caso, la pipe denominata viene trasportata su TCP / IP, quindi perderai le prestazioni. Utilizzare le pipe denominate per la comunicazione della macchina locale.

Altri suggerimenti

Unix e Windows hanno entrambi cose chiamate "Named pipe", ma si comportano diversamente. Su Unix, una pipa denominata è una strada a senso unico che in genere ha solo un lettore e uno scrittore: lo scrittore scrive e il lettore legge, capito?

Su Windows, la cosa chiamata "pipe denominata" è un oggetto IPC più simile a un socket TCP - le cose possono fluire in entrambi i modi e ci sono alcuni metadati (puoi ottenere le credenziali della cosa dall'altra parte ecc.)

Le pipe con nome Unix appaiono come file speciali nel filesystem ed è possibile accedervi con normali comandi IO file, inclusa la shell. Quelli Windows non lo fanno e devono essere aperti con una speciale chiamata di sistema (dopodiché si comportano principalmente come un normale handle win32).

Ancora più confuso, Unix ha qualcosa chiamato "socket Unix". o socket AF_UNIX, che funziona in modo più simile (ma non completamente simile) a una win32 "named pipe", essendo bidirezionale.

Tubi Linux
Meccanismo di comunicazione tra programmi First In First Out (FIFO).

Tubi senza nome
Sulla riga di comando, rappresentata da un " | " tra due comandi.

Tubi nominati
Un file speciale FIFO. Una volta creato, puoi usare la pipe proprio come un normale file (apri, chiudi, scrivi, leggi, ecc.).

Per creare una pipe denominata, chiamata " myPipe " ;, dalla riga di comando ( man page ):

mkfifo myPipe  

Per creare una pipe denominata da c, dove " nome percorso " è il nome che desideri che la pipe abbia e " mode " contiene le autorizzazioni che si desidera disporre della pipe ( pagina man ):

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

Secondo Wikipedia :

  

[...] Una pipa tradizionale è " senza nome " perché esiste in forma anonima e persiste solo finché il processo è in esecuzione. Una pipe denominata è persistente del sistema ed esiste oltre la durata del processo e deve essere "non collegata". o cancellato quando non viene più utilizzato. I processi generalmente si collegano alla pipe denominata (di solito appare come un file) per eseguire IPC (comunicazione tra processi).

Confronto

echo "test" | wc

a

mkdnod apipe p
wc apipe

wc bloccherà fino a

echo "test" > apipe

esegue

I tubi sono un modo di trasmettere dati tra applicazioni. Sotto Linux lo uso sempre per trasmettere l'output di un processo in un altro. Questo è anonimo perché l'app di destinazione non ha idea da dove provenga quel flusso di input. Non è necessario.

Una denominata pipe è solo un modo di agganciarsi attivamente a una pipe esistente e di recuperare i suoi dati. È per situazioni in cui il provider non sa quali client mangeranno i dati.

Comunicazione tra processi (principalmente) per applicazioni Windows. Simile all'utilizzo dei socket per comunicare tra le applicazioni in Unix.

MSDN

Questo è un exeprt di Technet (quindi non sono sicuro del motivo per cui la risposta contrassegnata dice che le pipe denominate sono più veloci ??):

Named pipe vs socket TCP / IP

In un ambiente LAN (Local Area Network) veloce, i client socket e protocolli TCP / IP (Transmission Control Protocol) sono comparabili per quanto riguarda le prestazioni. Tuttavia, la differenza di prestazioni tra i client Socket TCP / IP e i client Named Pipes diventa evidente con reti più lente, come le reti WAN (Wide Area Network) o le reti dial-up. Ciò è dovuto ai diversi modi in cui i meccanismi di comunicazione tra processi (IPC) comunicano tra pari.

Per le pipe con nome, le comunicazioni di rete sono in genere più interattive. Un peer non invia i dati fino a quando un altro peer non lo richiede utilizzando un comando di lettura. Una lettura di rete in genere comporta una serie di messaggi di pipe denominati peek prima che inizi a leggere i dati. Questi possono essere molto costosi in una rete lenta e causare un traffico di rete eccessivo , che a sua volta influisce su altri client di rete.

È anche importante chiarire se si parla di pipe locali o di pipe di rete. Se l'applicazione server è in esecuzione localmente sul computer che esegue un'istanza di SQL Server, il protocollo Named Pipes locale è un'opzione. Le pipe con nome locale vengono eseguite in modalità kernel ed è molto veloce.

Per i socket TCP / IP, le trasmissioni di dati sono più snelle e hanno un sovraccarico minore. Le trasmissioni di dati possono anche sfruttare i meccanismi di miglioramento delle prestazioni dei socket TCP / IP come finestre, riconoscimenti ritardati e così via. Questo può essere molto utile in una rete lenta. A seconda del tipo di applicazioni, tali differenze di prestazioni possono essere significative.

I socket TCP / IP supportano anche una coda di backlog. Ciò può fornire un effetto di livellamento limitato rispetto alle pipe denominate che potrebbero causare errori di pipe-pipe quando si tenta di connettersi a SQL Server.

In generale, TCP / IP è preferito in una rete LAN, WAN o dial-up lenta, mentre le named pipe possono essere una scelta migliore quando la velocità della rete non è il problema, poiché offre più funzionalità, facilità d'uso e opzioni di configurazione.

Le pipe nominate in un contesto unix / linux possono essere usate per far comunicare due diverse shell poiché una shell non può condividere nulla con un'altra.

Inoltre, uno script creato due volte nella stessa shell non può condividere nulla attraverso le due istanze. Ho trovato un uso per le named pipe durante la codifica di un demone che contiene la funzione start () e stop () e volevo usare lo stesso script per eseguire le due azioni.

Senza pipe nominate (o qualsiasi tipo di semaforo) l'avvio dello script in background non è un problema. Il fatto è che quando finisce non puoi accedere all'istanza in background.

Quindi quando vuoi mandargli il comando stop non puoi proprio: eseguire lo stesso script senza named pipe e chiamare la funzione stop () non farà nulla dato che stai effettivamente eseguendo un'altra istanza.

La soluzione era implementare due pipe, una READ e l'altra WRITE all'avvio del demone. Quindi costringilo, tra le altre sue attività, ad ascoltare il tubo READ. Quindi la funzione Stop () contiene un comando che scriverà un messaggio nella pipe, che sarà gestito dallo script in esecuzione in background che eseguirà un'uscita 0. In questo modo la nostra seconda istanza dello stesso script ha solo attività da svolgere: dire alla prima istanza di interrompere.

In questo modo solo uno script può avviarsi e arrestarsi.

Naturalmente hai diversi modi per farlo innescando l'arresto tramite un tocco, ad esempio. Ma questo è bello e interessante da codificare.

Named pipe è un sistema Windows per la comunicazione tra processi. Nel caso del server SQL, se il server si trova sullo stesso computer del client, è possibile utilizzare le named pipe per trasferire i dati, anziché TCP / IP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top