SHM
共有メモリを用いた高速で扱いやすいプロセス間通信マネージャ
|
[English | 日本語]
SHM (Shared-memory based Handy-communication Manager)の目的は,異なるプロセス間でできるだけ安全かつ高速な通信を行うことである.また、学生が使用しやすいように、考慮して設計したはずである.インストール方法などは,README.mdを参照すること.
宇都宮大学計測・ロボット工学研究室では,一般にプログラムで利用されるローカルメモリに加えて,プログラム間のデータのやり取りに利用できる共有メモリを使用する. 共有メモリはローカルメモリとは異なり,開発者が確保したメモリを開放する必要がない(不用意に開放すると他のプログラムにデータが渡せなくなる)ことやポインタを利用するために初学者に対する敷居が微妙に高いこと,設計者が新しいライブラリを作成する度にそれぞれのメモリに合わせて処理を作成する必要があることなど問題点があった. 本フレームワークは,共有メモリによるデータのやり取りを隠蔽し,初学者にもわかりやすいプロセス間通信を提供する.
共有メモリの領域確保やバッファへのアクセスをクラスに隠蔽することで、容易にプロセス間通信する機能を実現した。ただし、標準では標準レイアウト型のクラスのみをサポートする。その他のクラスについては都度特殊化したPublisher/Subscriberを定義することで対応できる.詳細はサンプルを参照のこと.
基本的に、ローカルメモリに確保した変数を出版者(Publisher)に渡したり、購読者(Subscriber)からのトピックを受け取るのみであり、従来のように共有メモリのポインタを意識してコーディングすることがなくなった.
開発者とは,本ライブラリなどの研究室内外のライブラリを利用して新しいプログラムを作成するものを指す.主に、学部4年生などのプログラミング初学者を対象としている.
設計者とは,本ライブラリを利用して新しいライブラリを作成し,現状のノウハウを後輩に受け継ぐものを指す.主に,修士2年生を対象としている.
ローカルメモリとは,1プロセス内でアクセスできる仮想記憶領域を指す.通常のプログラミング時に利用される記憶領域であり,利用後にちゃんと開放しないと将来的に大変な(プログラムがしばらく正常に動いていたのに,急に動かなくなる)ことになる領域である.
共有メモリとは,プロセス間で共通して利用可能な記憶領域を指す.特殊な手段によって確保される記憶領域であり,様々な実装方法があるが、今回はPOSIXのファイルマップドメモリを採用している.これは、共有メモリに格納するデータをファイルとして扱う方式であり,Linuxでは/dev/shmの直下に確保したメモリ領域が確認できる.
クラスまたは構造体にC言語にはない仮想関数のような特定のC++言語の機能が含まれておらず,すべてのメンバーに同じアクセス制御が含まれている場合、それは標準レイアウト型である.memcpyが可能で,Cプログラムで使用できるようにレイアウトが明確に定義されている.標準レイアウト型は,ユーザー定義された特殊なメンバー関数を持つことができる.さらに,標準レイアウト型には,次のような特性がある.
Posix共有メモリの概要が記載されているURLを以下に示す. https://linuxjm.osdn.jp/html/LDP_man-pages/man7/shm_overview.7.html