Linux プロセス間の 3 つの通信方法は何ですか?

青灯夜游
リリース: 2021-07-23 16:46:40
オリジナル
7287 人が閲覧しました

Linux プロセス間で通信する 3 つの方法: 1. パイプ通信: 情報を送信するプロセスは書き込みプロセスと呼ばれ、情報を受信するプロセスは読み取りプロセスと呼ばれます。 2. メッセージバッファ通信は、メッセージバッファを中間媒体として使用し、通信双方の送受信動作はメッセージに基づいて行われます。 3. 共有メモリ通信。

Linux プロセス間の 3 つの通信方法は何ですか?

このチュートリアルの動作環境: Ubuntu 16.04 システム、Dell G3 コンピューター。

Linux におけるプロセス間通信の 3 つの方法

異なるプロセスは異なるメモリ空間で実行されるためです。一方の当事者による変数の変更は、他方の当事者には見えません。したがって。プロセス間の情報転送は、変数やその他のデータ構造を通じて直接実行することはできず、プロセス間通信を通じてのみ実現できます。

プロセス通信は、プロセス通信時の情報量の違いにより、制御情報の通信と大量のデータ情報の通信の2つに大きく分けられます。前者を低レベル通信、後者を高レベル通信と呼びます。

低レベル通信は、主にプロセス間の同期、排他、終了、一時停止などの制御情報の伝達に使用されます。

高度な通信は、主にプロセス間のデータ ブロックの交換と共有に使用されます。一般的な高度な通信には、パイプライン (PIPE)、メッセージ キュー (MESSAGE)、共有メモリ (SHARED MEM0RY) などが含まれます。

ここでは、主にこれら 3 つの高度なコミュニケーション方法の特徴を比較します。

パイプ通信 (PIPE)

2 つのプロセスがパイプを使用して通信する場合。情報を送信するプロセスは書き込みプロセスと呼ばれます。情報を受信するプロセスは読み取りプロセスと呼ばれます。パイプライン通信の中間媒体はファイルです。この種のファイルは通常、パイプライン ファイルと呼ばれます。書き込みプロセスと読み取りプロセスをパイプのように接続し、2 つのプロセス間の通信を実現します。書き込みプロセスは、書き込み側(送信側)を通じてパイプ ファイルに情報を書き込み、読み取りプロセスは、読み取り側(受信側)を通じてパイプ ファイルから情報を読み取ります。 2 つのプロセスは連携して継続的に書き込みと読み取りを行い、双方がパイプを介して情報を転送するパイプラインを形成します。

システム コール PIPE() を使用して、通常は名前なしパイプまたは PIPE と呼ばれる名前のないパイプ ファイルを作成します。名前付きパイプ ファイルを作成するには、システム コール MKNOD() を使用します。名前付きパイプまたは FIFO と呼ばれることがよくあります。匿名パイプは、非永続的なパイプ通信メカニズムです。アクセスしたすべてのプロセスが終了すると元に戻ります。名前のないパイプは、ファミリー関係のあるプロセス間でのみ使用できます。既知のパイプはシステム内に長期間存在する可能性があります。また、あらゆる関係のプロセスで使用するために提供されていますが、不適切に使用すると簡単にエラーが発生する可能性があります。したがって、オペレーティング システムは、名前付きパイプの管理権限を制御のためにシステムに渡します。パイプ ファイルの作成後、システム コール WRITE() および READ(); によってパイプ上の読み取りおよび書き込み操作を実現できます。通信が完了すると、CLOSE() を使用してパイプライン ファイルを閉じることができます。

メッセージ バッファ通信 (MESSAGE)

複数の独立したプロセスは、メッセージ バッファ メカニズムを通じて相互に通信できます。この種の通信は、メッセージバッファを中間媒体として実現されます。通信する双方の当事者の送受信操作はメッセージに基づいて行われます。メモリ内では、メッセージ バッファはキューに編成され、メッセージ キューとも呼ばれます。メッセージ キューを作成すると、複数のプロセスで共有できます。メッセージを送信するプロセスは、いつでも指定されたメッセージ キューに任意の数のメッセージを送信し、送信するメッセージを待機している受信プロセスが存在するかどうかを確認できます。存在する場合は、それを起動します。すると、メッセージを受信するプロセスは、メッセージが必要なときに、指定されたメッセージ キューからメッセージを取得できます。ニュースがまだ来ていない場合。その後スリープ状態になって待機します。

共有メモリ通信 (SHARED MEMORY)

メッセージのコピーに CPU を必要とするメッセージ バッファリングの欠点を考慮して。 OS は、名前が示すように、プロセス間で直接データを交換するための通信手段、つまり共有メモリを提供します。この通信方法では、外部通信プロトコルまたは同期および相互排他メカニズムのサポートにより、複数のプロセスが同じメモリ セグメントを (中間媒体として) 使用して通信できるようになります。最も効率的なデータ通信方式の一つで、中間リンクが存在しないのが特徴です。共有メモリ ページを介して直接接続します。相互に通信するプロセスのそれぞれの仮想アドレス空間にマッピングします。これにより、複数のプロセスが同じ物理メモリ ページに直接アクセスできるようになります。それは自分のプライベートスペースにアクセスするようなものです(ただし、実際にはプライベートではなく共有されています)。したがって、このプロセス間通信方法は、同じコンピュータ システム内のプロセス間の通信を実現する最速の方法です。そしてそこにその限界があります。つまり、メモリを共有するプロセスは同じコンピュータ システム内に共存する必要があります。共有できるのは物理メモリのみです。

3 つの方法の特徴 (長所と短所): 1. 名前のないパイプはシンプルで便利です。ただし、それは一方向通信の動作モードに限定されます。また、名前付きパイプは、どのような関係のプロセスにも提供できますが、パイプの共有は、パイプを作成したプロセスとその子孫プロセスの間でのみ実現できます。ただし、システムに長期間存在するため、不適切に使用するとエラーが発生する可能性があります。

2. メッセージのバッファリングは親子プロセスに限定されなくなりました。これにより、任意のプロセスが共有メッセージ キューを介してプロセス間通信を実現できるようになります。そして、システムはメッセージの送受信間の同期を実現するために関数を呼び出します。その結果、ユーザーは通信にメッセージ バッファーを使用するときに同期の問題を考慮する必要がなくなりました。使い方は簡単ですが、情報のコピーには追加の CPU 時間が必要です。情報量が多い場合や操作を頻繁に行う場合には不向きです。

3. 共有メモリは、メッセージ バッファの欠点を補うために、メモリ バッファを利用して直接情報を交換するため、コピーが不要で、速度と情報量が多いという利点があります。ただし、共有メモリ通信は、共有メモリ バッファをプロセスの仮想アドレス空間に直接接続することによって実現されます。したがって、これらのプロセス間の読み取りおよび書き込み操作の同期の問題は、オペレーティング システムでは実現できません。これは、他の同期ツールを使用して各プロセスで解決する必要があります。さらに、メモリエンティティはコンピュータシステム内に存在するため。したがって、同じコンピュータ システム内のプロセス間でのみ共有できます。ネットワーク通信には不便です。

関連する推奨事項: 「Linux ビデオ チュートリアル

以上がLinux プロセス間の 3 つの通信方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート