共有メモリを使ったプロセス間通信
■光音共演コンピュータにおける共有メモリを使ったプロセス間通信
音楽の音の波長に応じて。ハイパワーLEDの光の色を変える光音共演コンピュータでは、PC上のWindowsインタフェースから音を入力するプロセスと、入力した音を解析しArduino Unoへ解析結果を送る2つのプロセスがあります。これらの2つのプロセスは同時に動作し、共有メモリを介して0.1秒間の音データのコミュニケーションを行っています。通信データ用の共有メモリのバッファは2つ用意し、滞りなく音の入力と解析が同時に処理を実行する必要があります。このためプロセス間通信の方法として共有メモリを選定しました。共有メモリへのアクセスは、ごく短い処理時間で可能です。
■共有メモリを使ったプロセス間通信の特徴
筆者は、データベースソフトウェアの利用経験がありますが、当該DB管理システムでは、APとDBのプロセス間通信として、PIPEと呼ばれるメモリ空間を介すか、TPC/IPを使ってサーバ間もしくはサーバ内の通信をするか、いずれかになります。
PIPEを使ったプロセス間通信は、メモリでの情報の授受であるため、高速な処理であり、また複数のAPプロセスの各々にDBプロセスを用意し、APプロセスとDBプロセスがそれぞれPIPEを使った通信が可能となっています。しかしPIPEの読み書きでは相手のプロセスから応答を待つ仕組みになっています。TCP/IPを使った通信も同様に通信相手の応答を待つことになります。
光音共演コンピュータで実現している共有メモリを介したプロセス間通信は、2つの共有メモリセグメントを交互に使うので、2つのプロセスが停止することなく動き続けます。PIPEの読み書きのような待ちは発生しません。
また光音共演コンピュータの動作前提として、音声の入力と解析がそれぞれ一つづつのプロセスで実行するため、PIPEのような複雑な管理メカニズムは不要なのです。
■Windowsの共有メモリアクセス関数
光音共演コンピュータでは、Windowsの以下のシステム関数を使用しています。これらの関数を使えばWindows環境で簡単に共有メモリを使ったプログラムが作成できます。
getsharedmem():共有メモリの取得処理。
createFileMapping():ファイルマッピングオブジェクトを作成する
OpenFileMapping():指定した識別子のファイルマッピングオブジェクトをオープンする。
mapViewOfFile():呼び出し側プロセスのアドレスに共有メモリのアドレスをマッピングする。