[WIP] プロセス間通信の方式に関する調査

ROSのようなプロセス間通信(IPC)を、もっとOSが用意している基本的な方法でできないのかと思い、調査してみた。主にLinuxを対象に調べている。可能ならBSD系などでも使えたらいい。

やりたいこと

  • プロセス間で、できるだけ低遅延で任意のデータのやり取りをしたい。
  • ROS topicのようなPub/Subがしたい。
  • POSIXのような枯れた仕組みであるといい。

主なIPC方式

LinuxにおけるIPCの種類としては以下の物があるらしい。

共有メモリ

プロセス間でメモリを共有する仕組み。排他制御は自前で実装する必要がある。

セマフォ

整数型のデータを親子関係のないプロセス間で共有する仕組み。

マップトメモリ

複数のプロセスがファイルを介して通信する。ファイルとは言え通常のファイルではなく、メモリにマップされた仮想的なものになるらしい。

パイプ

親子関係のあるプロセスでデータ交換する仕組みで、コマンドラインで使われる「|」らしい。任意のプロセス間で使えるものではないとのことで、今回の用途には合わない。

FIFO

名前付きpipeとも呼ばれ、全てのプロセスが作成・アクセス・削除できる。 mkfifoコマンド、mkfifo関数によって作成できる。 排他制御も自動でやってくれるらしい。 macOSのmanで確認したところ以下のように記載があり、1988年策定のPOSIXにより規定されているとのこと。

IEEE Std 1003.1-1988 (``POSIX.1'')

ライブラリ関数かと思ったが、システムコールらしい。

ソケット通信

おなじみソケット通信。ネットワーク上とも通信できる。

POSIX メッセージキュー

プロセス間でメッセージの形でのデータのやり取りを行えるらしい。(調査中)

使えそうなのはどれなのか?

上記の中では、名前付きPIPEがもっともあっていそうだ。POSIXのシステムコールならOS間での可搬性もありそう。書き込み終了のハンドリングを行ってくれるのも便利そうだ。

mkfifoの場合、情報のやり取りはUNIX系のファイルやソケットと同様open/read/writeなどを使用して行うようだ。

今後の課題

  • raw dataの送受信の仕組みを利用して、callbackのような仕組みを実現するにはどうしたらいいのだろう。

参考

  • https://qiita.com/MoriokaReimen/items/5c4256ef620499a88bb3
  • https://blog.cles.jp/item/10135
  • https://qiita.com/n01e0/items/5484dbdc940baa4fde56

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です