質問
それらは何ですか?またどのように機能しますか?
コンテキストはたまたま SQL Server です
解決
WindowsシステムとPOSIXシステムの両方で、名前付きパイプを使用すると、同じマシンで実行されているプロセス間でプロセス間通信を行うことができます。名前付きパイプを使用すると、ネットワークスタックを使用することでパフォーマンスを低下させることなくデータを送信できます。
サーバーが着信要求のIPアドレス/ポートをリッスンしているように、サーバーはリクエストをリッスンできる名前付きパイプをセットアップすることもできます。どちらの場合でも、クライアントプロセス(またはDBアクセスライブラリ)は、リクエストを送信するために特定のアドレス(またはパイプ名)を知っている必要があります。多くの場合、一般的に使用される標準のデフォルトが存在します(HTTPのポート80と同様に、SQLサーバーはTCP / IPでポート1433を使用します。名前付きパイプには\\。\ pipe \ sql \ query)。
追加の名前付きパイプを設定することにより、それぞれ独自の要求リスナーを持つ複数のDBサーバーを実行できます。
名前付きパイプの利点は、通常、はるかに高速であり、ネットワークスタックリソースを解放できることです。
- ところで、Windowsの世界では、リモートマシンへの名前付きパイプを使用することもできますが、その場合、名前付きパイプはTCP / IPを介して転送されるため、パフォーマンスが低下します。ローカルマシンの通信に名前付きパイプを使用します。
他のヒント
UnixとWindowsには両方とも「名前付きパイプ」と呼ばれるものがありますが、動作が異なります。 Unixでは、名前付きパイプは一方通行であり、通常は1人のリーダーと1人のライターのみです。ライターは書き込みを行い、リーダーは読み取りますか?
Windowsでは、「名前付きパイプ」と呼ばれるものTCPソケットのようなIPCオブジェクトです-物事は双方向に流れることができ、メタデータがあります(相手の物事の資格情報を取得することができます)。
Unix名前付きパイプは、ファイルシステム内の特別なファイルとして表示され、シェルを含む通常のファイルIOコマンドでアクセスできます。 Windowsのものはそうではなく、特別なシステムコールで開く必要があります(その後、通常のwin32ハンドルのように動作します)。
さらに紛らわしいことに、Unixには「Unixソケット」と呼ばれるものがあります。または、AF_UNIXソケット。これは、win32の「名前付きパイプ」のように(ただし完全には似ていません)双方向に動作します。
Linux パイプ
先入れ先出し (FIFO) プロセス間通信メカニズム。
名前のないパイプ
「|」で表されるコマンドラインで2つのコマンド間。
名前付きパイプ
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
to
mkdnod apipe p
wc apipe
wcはブロックするまで
echo "test" > apipe
実行
パイプは、アプリケーション間でデータをストリーミングする方法です。 Linuxでは、これを常に使用して、1つのプロセスの出力を別のプロセスにストリーミングします。宛先アプリはその入力ストリームがどこから来たのかわからないため、これは匿名です。必要ありません。
A named パイプは、既存のパイプに積極的に接続し、そのデータをフーバーアップする方法にすぎません。プロバイダーがどのクライアントがデータを食べているかを知らない状況のためです。
Windowsアプリケーションのプロセス間通信(主に)。ソケットを使用してUnixのアプリケーション間で通信するのに似ています。
これは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コンテキストの名前付きパイプを使用して、2つの異なるシェルが通信できるようにすることができます。シェルは他のシェルとは何も共有できないからです。
さらに、同じシェルで2回インスタンス化された1つのスクリプトは、2つのインスタンスを通じて何も共有できません。 start()およびstop()関数を含むデーモンをコーディングするときに名前付きパイプの使用法を見つけました。2つのアクションを実行するために同じスクリプトを使用したかったです。
名前付きパイプ(または任意の種類のセマフォ)なしで、スクリプトをバックグラウンドで開始することは問題ではありません。問題は、それが完了すると、バックグラウンドでインスタンスにアクセスできなくなることです。
したがって、彼に停止コマンドを送信したいときは、できません。名前付きパイプなしで同じスクリプトを実行し、stop()関数を呼び出しても、実際には別のインスタンスを実行しているため、何も実行されません。
解決策は、デーモンの起動時に2つのパイプ、1つは読み取りパイプ、もう1つは書き込みパイプを実装することでした。次に、他のタスクの中で、彼にREADパイプを聞かせます。次に、Stop()関数には、パイプにメッセージを書き込むコマンドが含まれています。このコマンドは、出口0を実行するバックグラウンド実行スクリプトによって処理されます。このように、同じスクリプトの2番目のインスタンスは、実行するタスクのみを持ちます:最初のインスタンスに停止するように指示します。
これにより、1つのスクリプトのみが自分自身を起動および停止できます。
もちろん、タッチなどで停止をトリガーすることで、さまざまな方法でそれを行うことができます。しかし、これはコードとしては素晴らしく、興味深いものです。
名前付きパイプは、プロセス間通信用のWindowsシステムです。 SQLサーバーの場合、サーバーがクライアントと同じマシン上にある場合、TCP / IPではなく、名前付きパイプを使用してデータを転送できます。