ページ 1 / 1
共有メモリの書き込み完了フラグ
Posted: 2013年4月14日(日) 03:31
by ghffmj
boost::interprocessを使って、共有メモリによるプロセス間通信を行なっています。
プログラムをA(送信側)、B(受信側)としたとき、Aからサイズの大きなファイルを共有メモリに書き込んで、Bが共有メモリから読み込むというプログラムを考えた場合、Aが共有メモリに書き込んでいる最中にBが共有メモリを読みこんでしまうという問題があると思います。
この問題は、次のような流れで防ぐことが可能でしょうか。
・プログラムA
共有メモリへファイル書き込み
↓
セマフォON
・プログラムB
セマフォがOFFならばストップ
セマフォがONならば共有メモリから読み出し
懸念しているのは、プログラムAのセマフォをONにした時点で共有メモリへファイルが全て書き込めているかどうかです。
(書き込み途中ならばプログラムBで書き込み途中のファイルを共有メモリから読みだしてしまう恐れがあると思うのですが)
また、boostでのセマフォの使い方は、
http://www.boost.org/doc/libs/1_45_0/do ... semaphores
を参考にしようと思っているのですが、これで出来るでしょうか。次のように、wait()とpost()で囲む所です。
コード:
data->nempty.wait();
data->mutex.wait();
data->items[i % shared_memory_buffer::NumItems] = i;
data->mutex.post();
data->nstored.post();
よろしくお願いします。
Re: 共有メモリの書き込み完了フラグ
Posted: 2013年4月14日(日) 11:23
by softya(ソフト屋)
boost::interprocessを使ったことはないですが、nemptyとmutexで2重掛けにする意図とは良く分かりません。
それはそれとして、共有メモリの書き込みが終わっているかを気にする必要は無いと思います。
プログラムの流れとしてファイルから共有メモリの書き込みが非同期ではないなら書き込みを終わっているものとして処理して構いません。
それと読み込みと書き込みを同時に処理するためにダブルバッファにした方が良いと思います。そうすれば読み込んでいる間に新たな内容を書き込めます。
同期処理では、有効なバッファの通知を行うようにすればよいでしょう。 ※ この通知情報の共有メモリだけ排他制御する。
Re: 共有メモリの書き込み完了フラグ
Posted: 2013年4月18日(木) 01:22
by ghffmj
softyaさん、ありがとうございます。返信が遅くなってすみません。病気で倒れてしまっていました。
>nemptyとmutexで2重掛けにする意図は良く分かりません。
私も2つある理由がよくわかりませんでした。Semaphoreの所のサンプルコードがこのように使っていたため、とりあえず同様にすればよいのかとは思ったのですが、これだとまずいですよね。nemptyが特によくわからなかったのですが、nemptyというのは何か意味があるものなのでしょうか?もしご存知ならば教えていただきたいです。
>それはそれとして、共有メモリの書き込みが終わっているかを気にする必要は無いと思います。
>プログラムの流れとしてファイルから共有メモリの書き込みが非同期ではないなら書き込みを終わっているものとして処理して構いません。
>それと読み込みと書き込みを同時に処理するためにダブルバッファにした方が良いと思います。そうすれば読み込んでいる間に新たな内容を書き込めます。
>同期処理では、有効なバッファの通知を行うようにすればよいでしょう。 ※ この通知情報の共有メモリだけ排他制御する。
仰るとおり、読み込みと書き込みが同時に出来るならば処理速度も向上しそうで確かに良さそうです。しかし、ダブルバッファというのがよく分かりません。実は、セマフォ等の並列(同期)処理はほぼ初めてでして。。。
共有メモリの書き込みが終わっているかを気にする必要は無いとのことでしたので、少し進めてみて、やりたいことが少し変わりましたので、もう少し詳しく言います。(おかしい部分があればご指摘ください)
2つのプログラムA,Bがあります。
Aはメインプログラム。Bはある計算を行うプログラムです。A,Bのプロセス間通信を行います。
Aの動作中にBの計算結果が必要となったときに、AがBに欲しいという信号(セマフォ)を送り、Bがその信号を受け取り、Aに計算した値を返してやるということがしたいです。その計算結果は、大きなマトリックスなので書き込みにはある程度の時間がかかります。この伝送は出来る限り早いことが必要です。
実は、今はBoostのセマフォがよくわからなかったため、bool型のflagを共有メモリに書き込むことでA,Bのやりとりをしながら同期をとっています。それだとやはり伝送速度等で問題が生じるのでしょうか?また、早くするためには、仰るような読み込みと書き込みが同時に出来ることが良さそうなので、もう少し詳しく説明していただけないでしょうか。
長々とすみません。よろしくお願いします。
Re: 共有メモリの書き込み完了フラグ
Posted: 2013年4月18日(木) 15:24
by softya(ソフト屋)
えーとややっこしいのですが、AとBが最初と逆では?
最初:A(送信側)、B(受信側)
現状:Aはメインプログラム。Bはある計算を行うプログラム
それとセマフォは通信するものでは無く、同時アクセスを避けるための仕組みです。
イベントとか通知に関する仕組みがあるかよく分からなかったので、セマフォは相手にデータを要求するフラグなどの読み出し・書き換え用のガードして使ってください。
ダブルバッファに関しては、共有メモリを2つ設けるか、1つの共有メモリを前後の2つに分割して、フラグで2つの内どっちが読みだし用か通知する事で読み出しと書き出しを同時に制御することができます。