SHM
共有メモリを用いた高速で扱いやすいプロセス間通信マネージャ
|
[English | 日本語]
SHM(Shared-memory based Handy-communication Manager)は、共有メモリを用いたプロセス間通信を手軽に行うためのライブラリである。 このライブラリは、尾崎功一教授が自身の研究室でのロボット開発のためにC言語で作ったライブラリを基にしている。 基のライブラリは、シンプルなAPIによってプログラミング初学者でも簡単にプロセス間通信を記述することができた。 このライブラリでは、基のライブラリで培ってきたノウハウに加えて、C++のクラスによるオブジェクト指向なプログラムが実現できるように工夫を行っている。 また、通信の信頼性や機能性を向上させるために、fuRom[1]やROS(Robot Operating System)[2]の通信を参考にリングバッファや条件変数を取り入れている。
[1] 入江清. "ROS との相互運用性に配慮した共有メモリによる低遅延プロセス間通信フレームワーク." 第 35 回日本ロボット学会学術講演会予稿集, RSJ2017AC2B2-01 (2017). https://furo.org/irie/papers/rsj2017_irie.pdf
[2] Open Robotics, "ROS.org", http://wiki.ros.org/ja/
すべてのSHMのクラスと関数はirlab::shm名前空間内に置かれている。これは、ROSなどの他の類似したライブラリと競合しないようにするために必要である。
SHMでは、共有メモリの確保と開放をクラスが自動的に行う。
一方で、自動的な管理を行うために標準で通信に利用できるクラスはsizeof関数で正確なサイズが取得できるものに限られる。 例えば、Vectorのような可変長なデータを扱うクラスは標準でサポートされていない。 しかし、可変長なデータに対しても適宜特殊化を行うことで、対処することは可能である。 例えば、出版者/購読者モデルによる通信ライブラリであるshm_pub_subでは、Vecotorクラスを扱えるshm_pub_sub_vector.hppが用意されている。
共有メモリAPIは確保したメモリの先頭アドレスをvoidポインタで取得する。 C++はより安全な型変換を用いるため、通常ではvoidポインタを任意の型に変換することができない。 そのため、共有メモリAPIで確保したメモリを活用するには、reinterpret_castという強制的な型変換を行う必要がある。 この危険な操作を隠蔽することは、初学者に変な癖をつけないために重要なことである。
SHMでは、信頼性の高い通信ができるようにROSを参考にした様々な通信モデルを実装している。 ユーザは必要に応じて以下の通信モデルを使い分けることができる。
出版者/購読者モデルは、一つのプロセスが複数のプロセスに向かって情報を発信するためのモデルである。
このモデルは、ROSではServiceと呼ばれる単純な呼び出しと応答を行うモデルである。
Service通信はサーバーが応答するまでクライアントが待つ必要がある。 しかし、処理に時間がかかる場合には、クライアントが現在の状態を監視したりキャンセル要求を送りたい場合がある。 そのような処理を行うために、ROSではActionと呼ばれるモデルが用いられる。 便宜上、ROSに倣ってそのような通信モデルをActionと呼ぶこととする。 ただし、SHMのActionモデルは完全なROSのActionモデルではないことに注意すること。