差分

移動先: 案内検索

プロセス間通信

1,329 バイト追加, 2018年12月15日 (土) 18:03
/* System V IPC */
== IPCとは ==
プロセス実行中に他のプロセスと通信を行うための機構を考えます。通信といプロセス実行中に他のプロセスと通信を行うための機構を考えます。通信ということでは2つの方法を挙げることができます。うことでは2つの方法を挙げることができます。
* ローカルマシン内(もちろん動いているカーネルは1つという前提)で動作しているプロセス間での通信。
本章では前者のローカルマシン内での通信を取り上げます。もちろんローカルマシン内で動作するプロセス同士でもネットワーク経由と同じようにTCP本章では前者のローカルマシン内での通信を取り上げます。もちろんローカルマシン内で動作するプロセス同士でもネットワーク経由と同じようにTCP/IPを使って通信できますが、本章のプロセス間通信の説明からはTCPIPを使って通信できますが、本章のプロセス間通信の説明からはTCP/IPは除いておきます。IPは除いておきます。
ここでのプロセス通信(InterProcess Communication / IPC )とは、名前つき<ref> LinuxのIPCについては次の発表スライドが参考になります。 Michael Kerrisk, "An introduction toパイプLinux IPC", linux.conf.au 2013 http://man7.org/conf/lca2013/IPC_Overview-LCA-2013-printable.pdf </ref>とは、名前つきパイプ(named pipe)、pipe、UNIXドメインソケット(ローカルIPC)、セマフォーやあるいはシェアードメモリなどを指しています。これらにより高速にプロセス間でデータをやりとりするためのメカニズムと捉えます。Linuxでは、セマフォー<ref>Linuxのセマフォーに関しては次のWebサイトが詳しい。 http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html</ref>やあるいはシェアードメモリなどを指しています。これらにより高速にプロセス間でデータをやりとりするためのメカニズムと捉えます。Linuxでは、System Vで使われていたプロセス間通信の機能、4.2BSDで採り入れられたソケット、名前つきパイプが使えます。2BSDで採り入れられたソケット、名前つきパイプが使えます。
プロセス間通信の機能というと、System Vで使われていたプロセス間通信の機Vで使われていたプロセス間通信の機能(System V IPC)のセマフォー<ref>セマフォーとは、元々は列車運行で列車が単線の区間に入ることを許されているか、あるいは待つのかを示す信号機なのだそうです。セマフォーとは、元々は列車運行で列車が単線の区間に入ることを許されているか、あるいは待つのかを示す信号機なのだそうです。</ref>(semaphore)、メッセージキュー(message
queues)、シェアードメモリ(shared memory)が有名です。
ソフトウェアの世界では、複数のプロセスが同じ資源の競合を避けるために、ソフトウェアの世界では、複数のプロセスが同じ資源の競合を避けるために、使われる機能で、たとえば複数のプロセスが同時にファイルを書き込みするタイミングが同じになってしまわないように、セマフォを使って待ちます。使われる機能で、たとえば複数のプロセスが同時にファイルを書き込みするタセマフォは(ファイルのロックなどを使うよりも)高速に処理できるので、たとえばデータベースのようなアプリケーションでの処理のロックなどに使われています。イミングが同じになってしまわないように、セマフォを使って待ちます。セマしかし、同様な処理はmmapを使っても可能ですので、今日ではセマフォがなくては実装ができない、というわけではありません。むしろ、互換性のために残していると考えた方が良いでしょう。また今日ではSystem V IPCは、相対的に「重い」処理と考えられています。フォは高速に処理できるので、たとえばデータベースのようなアプリケーションでの処理のロックなどに使われています。しかし、同様な処理はmmapを使っても可能ですので、今日ではありまり価値があるとはいえません。むしろ、互換性のために残していると考えた方が良いでしょう。一方、POSIX IPC はマルチスレッドで安全であり、かつ、System V IPCより軽量なのでPOSIX IPCの利用が推奨されています。<ref>IBMのdeveloper worksのサイトの中にある "[https://www.ibm.com/developerworks/jp/linux/library/l-semaphore/index.html System V のセマフォー API を使用して POSIX のセマフォー API を実装する]" の本文中に「POSIX のセマフォーは System V のセマフォーよりもはるかに軽量」という記述も存在する。</ref>
メッセージキューは古いアプリケーションを動かすための互換性のために残さSystem V IPCを使ってのメッセージキューは古いアプリケーションを動かすための互換性のために残されているようなもと考えても良いレベルになって来ています。今日では新規のプログラムに使うような場面を見かけたことがありません。最近ではメッセージキューを使う所を名前つきパイプで済ますことができます。シェアードメモリもmmapが使えます。れているようなもと考えても良いレベルになって来ています。今日では新規のプログラムに使うような場面を見かけたことがありません。最近ではメッセージキューを使う所を名前つきパイプで済ますことができます。シェアードメモLinuxのカーネルが2.6以降ではPOSIX IPCが使えるようになりました。新しくプログラムを作る場合で、メッセージキューなどを使いたい時はSystem V IPCではなくPOSIX IPCを使うべきでしょう。リもmmapが使える今日ではあまり特別な価値はありません。現在もあるのは、互換性のためにあると考えてかまわないでしょう。== POSIX IPC == TBD
== 名前つきパイプ ==
これはTCP/IPネットワーク接続の機能のインタフェースと同じものを用意して、しかし、データはローカルなプロセス間通信に使おうというものです。元々はUNIXドメインソケットと呼んでいたのですが、Posix ではUNIXに依存しないのでローカルIPC という呼び方をしています。しかし、その呼ばれ方はあまりにも知られていないので、カッコつきでIPネットワーク接続の機能のインタフェースと同じものを用意して、しかし、データはローカルなプロセス間通信に使おうというものです。元々はUNIXドメインソケットと呼んでいたのですが、Posix ではUNIXに依存しないのでローカルIPC という呼び方をしています。しかし、その呼ばれ方はあまりにも知られていないので、カッコつきで(UNIXドメインソケット)と並べて置きました。と並べて置きました。
;補足: POSIXでは「ローカルIPC」という呼び方をしますが、UNIX流ではUNIXドメインソケットと呼びます。POSIXでは「ローカルIPC」という呼び方をしますが、UNIX流ではUNIXドメインソケットと呼びます。
socket(2)、bind(2)、accept(2)のようにTCP/IPの通信を行うやり方は、今までのUNIXとはセマンティクス(意味的なもの)が違います。UNIXが、すべてを名前つきパイプのように名前空間でアクセスしようとするのに対して、TCPIPの通信を行うやり方は、今までのUNIXとはセマンティクス(意味的なもの)が違います。UNIXが、すべてを名前つきパイプのように名前空間でアクセスしようとするのに対して、TCP/IP のような通信系のやり方は、一々、IPアドレスやポート番号を指定しなければいけません。のような通信系のやり方は、一々、IPアドレスやポート番号を指定しなければいけません。
....
ソケットをAF_LOCALで作成し、sun_familyをAF_LOCALに指定し、sun_path 部分にファイルパスを書きバインドすると、そのパスにファイルに見えるソケットが出来ます。こうすれば、あとのデータの送信/受信に関係するプログラムの構造はTCPの部分にファイルパスを書きバインドすると、そのパスにファイルに見えるソケットが出来ます。こうすれば、あとのデータの送信/受信に関係するプログラムの構造はTCP/IPと同じに作れます。その面ではインターネット経由でアクセスするプログラムとローカルにアクセスするプログラムが同じ構造で作れる利点があります。IPと同じに作れます。その面ではインターネット経由でアクセスするプログラムとローカルにアクセスするプログラムが同じ構造で作れる利点があります。
これはログデーモンがオープンしているソケットです。しかしながら、パス名で見えていても、ファイルではないので、通常のファイルを扱うコマンドでアクセスしてもエラーになります。これはログデーモンがオープンしているソケットです。しかしながら、パス名で見えていても、ファイルではないので、通常のファイルを扱うコマンドでアクセスしてもエラーになります。
これらはIPスタックを経由しません。IPは複数の独立したホストがあり、ネッこれらはIPスタックを経由しません。IPは複数の独立したホストがあり、ネットワーク構築された世界をIPパケットが中継されていくモデルです。そのためにIPパケットを処理するためには、そのための処理がなされます。一方、UNIXドメインソケットには、そんな付加する情報をつけたり処理したりする必要はありません。よって高速に処理することが可能になります。トワーク構築された世界をIPパケットが中継されていくモデルです。そのためにIPパケットを処理するためには、そのための処理がなされます。一方、UNIXドメインソケットには、そんな付加する情報をつけたり処理したりする必要は== 脚注 ==ありません。よって高速に処理することが可能になります。<references/> ----[[目次]]へ  このページへのショートURL: http://uc2.h2np.net/i/25.html