1. 概要

このチュートリアルでは、パイプとソケットの違いについて説明します。 また、プロセス間通信(IPC)メカニズムと、そもそもなぜそれらが必要なのかについても説明します。

2. IPCメカニズム

プロセスは同じアドレス空間、スタック、レジスタを共有しないため、プロセスを企業化するにはIPCメソッドを使用する必要があります。プロセス間で通信する方法は複数あります。 パイプとソケットは、プロセス間で通信するこの機会を与えるいくつかの方法ですが、共有メモリは、同じ種類のことを行うための他のアプローチの1つでもあります。

これらのメカニズムにはすべて独自の機能があり、さまざまな種類のタスクを実行するためにそれぞれが必要です。 共有メモリは優れたソリューションですが、あるプロセスが別のマシンで動作する別のプロセスと通信する必要がある場合は、パイプやソケットなどの他のソリューションが必要になる場合があります。 次のセクションでそれらについて詳しく説明しましょう。

3. パイプ

パイプは、最も広く使用されているIPC方式の1つです。 その名前からもわかるように、両端のあるチャンネルです。 これを使用すると、実際にはカーネルメモリの一部が使用されます。 システムコールpipeは、常にパイプと関連するファイル記述子を作成します。 fd [0] はパイプからの読み取り用で、 fd[1]はパイプへの書き込み用です。 。 ファイル記述子のパラメータを配列として受け取ります。 次の図は、プロセス間で通信するパイプ2を作成する方法を示しています。

3.1. パイプはどのように機能しますか?

新しいプロセスを作成するシステムコールfork()で常にパイプを使用します。ご想像のとおり、プロセスが1つしかない場合はパイプを使用する意味がありません。 次の図は、不要なファイル記述子を閉じない場合に、親プロセスと子プロセスの間に双方向パイプを設定する方法を示しています。

未使用のファイル記述子を閉じると、次のような図になります。下の図の正しいバージョンからわかるように、使用すると、親プロセスと子プロセスの両方がパイプの読み取りと書き込みを行うことができます。 パイプおよびフォークただし、パイプは単方向であるため、単方向に通信する場合は注意が必要です。つまり、親と子の両方が相互にデータを送信できます。 その場合、1本のパイプが機能しないため、2本のパイプが必要になります。 親から子へのデータフロー用の1つのパイプと、子から親へのデータフロー用の1つのパイプ。 不要なパイプ記述子も閉じる必要があります:

前述したように、パイプは関連するプロセスに適したIPCメソッドです。通信は生のバイナリバイトを使用するのに十分単純でなければならないためです。 実際、シェルスクリプトで使用するパイプは、パイプの最適なアプリケーションです。 彼らがしていることは、基本的にバイナリプログラムを実行するということです。 したがって、パイプの制限は、関連するプロセスにのみ適用でき、1対1の通信が可能であることは明らかです。

より高度なIPCの場合、もちろん、共有メモリメッセージキュー、ソケットなどの他の方法があります。

4. ソケット

ソケットは、今日のインターネットで重要な役割を果たしています。ソケットという用語は、ARPANETで使用された1971年に RFC147で最初に造られました。 これは、ネットワーク内で情報が送信される、または送信される一意のIDです。 今日のソケットの最新の実装は、バークレーソケットから来ています。 ソケットはオペレーティングシステムとプロセスに直接関連しており、UnixOSに由来するBerkeleySoftware Distribution(BSD)のBerkeleyソケットアプリケーションプログラミングインターフェイス(API)からこの状況を理解できます。

ネットワークプロトコルスタックのAPIは、ソケット記述子であるアプリケーションによって生成された各ソケットの接続を確立します。 これは、Unixライクなオペレーティングシステムのファイル記述子のようなものです。 このプロセスは、チャネルの読み取りおよび書き込み操作で使用できるように保存します。

4.1. ソケットはどのように機能しますか?

ネットワークソケットは、送信に使用される一種のネットワークプロトコルの組み合わせにバインドされます。この組み合わせには、ホストのネットワークアドレスとポート番号が含まれます。 ポートは、ノード上の番号付きのリソースであり、異なる種類のソフトウェア構造を示します。 これらはプロセスのサービスタイプを識別し、外部からアクセス可能なロケーションコンポーネントとして機能し、他のホストがそれらに接続できるようにします。 ネットワークソケットを使用して、2つのノード間の永続的な接続を確立したり、コネクションレス型およびマルチキャスト通信を利用したりできます。

要約すると、ソケットを使用すると、異なるマシン上でも実行されるプロセス間の接続を確立できます。ソケットAPIは、sendおよびrecv操作をサポートします。カーネルレベルの通信バッファの内外でメッセージバッファを共有します。

socket 呼び出しを使用すると、カーネルレベルのソケットバッファーを作成できます。 また、実際のメッセージの移動とともに、ソケットに関連付ける必要のあるカーネルレベルの処理を関連付けます。 すでに述べたように、通信を確立するためにソケットを使用する場合、異なるマシン上のプロセス間で発生する可能性があります。

5. パイプとソケットの違い

パイプとソケットについて説明し、それらがどのように機能するかを直感的に説明しました。 これまで見てきたように、プロセス間の接続を確立しようとすると、それらの役割はまったく異なります。 それは実際に状況とどちらを使用するのがより適しているかという問題に依存します。 ただし、それらの違いのいくつかに下線を引くことができます:

  • パイプでの通信は一方向ですが、ソケット通信では双方向です。
  • プロセス間の通信をパイプで確立するには、プロセスを相互に関連付ける必要があります。 彼らは親と子のプロセスのような関係を持っている必要があります。 ただし、ソケットにはそのような制限はありません。
  • もう1つの重要な違いは、パイプを使用して同じ物理マシン上のプロセスを接続できることです。 一方、ソケットを使用して、異なる物理マシン上のプロセス間の接続を確立します。 そのため、これらはネットワークシステムの基本的な概念の1つです。
  • パイプにパッケージするという概念はありません。 ソケットは、IPv4またはIPv6を使用した通信を通じてパッケージを持つことができます。 ソケットは大きなサイズのデータを小さなチャンクに分割してそのように送信できますが、パイプはそれを行うことができません。

6. 結論

このチュートリアルでは、最初にIPCメカニズムが必要な理由を簡単に説明し、次にメッセージパッシングメソッドのカテゴリに分類されるIPCメカニズムであるパイプとソケットの定義を共有しました。 その後、パイプとソケットの違いをいくつか指摘しました。

Unixライクなオペレーティングシステムの範囲でこれらのIPCメカニズムについて説明しますが、Windowsでもこれらのメカニズムの一部を使用することは可能です。