• ベストアンサー

共有メモリについて

Linux関連でプログラムの作成をしているのですが、 共有メモリについての知識がほとんどありません。 それで 1.共有メモリの最大サイズ(カーネルの設定によると思いますが、デフォルトの値など) 2.共有メモリを使用するさいの排他処理について などがわかる方、もしくは解説したHPなどがありましたらどうか教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

プログラミングのセクションで尋ねればもっと 早く回答が得られたと思いますよ。 1.について。  SHMMAX:1セグメント(1回のshmgetで割り当てられる  共有メモリ領域)あたりの最大バイト数  SHMALL:システム全体の共有メモリの最大ページ数  1.1 /proc/sys/kernel/shmmax, /proc/sys/kernel/shmall     をcatで見れば、現在のshmmaxとshmallの値が分かると思います。  1.2 man shmgetに書いてないでしょうか?  1.3 カーネルソースをインストールしていれば、ソースを見てみると      どこかに書いてあると思います。      /usr/src/linux/include/asm-i386/page.h      /usr/src/linux/include/asm-i386/shmparam.h      などがそうじゃないかと思います。  ページサイズは.../page.hの中で、1UL << 12となっています。  1を12回左シフトすると読めば、4096バイトでしょうか? 2.SysV IPCには排他制御の仕組みとしてセマフォを実現する関数群 (semget, semctl, semop)が用意されていますが、どうせ共有メモリ を使用するなら、自分でセマフォのようなものを作られたら良いと 思います。  例えば、共有メモリの先頭にchar型1文字分の領域を確保しておいて、 共有メモリへの読み書きの前には必ずそこをチェックし、0ならば それを1に変更してから読み書きをする。読み書きが終われば0に戻す。 チェック時に1ならば0になるまで待つ。というようにすれば簡単な 排他制御ができます。データは共有メモリの先頭からchar1個分だけ ずれたところから格納するようにします。  工夫次第で色んな形の排他制御ができます。例えば、上記のcharを 読み出し用と書き込み用を用意すると、読み出しは重複して行って も良いが、書き込みはダメ、というような排他制御が行えます。 (ただしその際は上記のチェックアルゴリズムでは不十分で、  ひと工夫必要です。)  また、共有メモリ領域を複数の部分に分けてそれぞれについて 排他制御を行うと、一々共有メモリ全体がロックされることがないので、 共有メモリへのアクセスが頻繁に行われるようなら、効率があがる と思います。  あるいは、排他制御用のcharフラッグとデータ領域を一まとめにした 構造体やクラスを宣言して、メモリ領域のポインタを構造体ポインタに キャストして、構造体やクラスのメンバ関数を通してのみ共有メモリに アクセスするようにすると、排他制御機構を構造体やクラスのなかに 隠すことができ、プログラムがすっきりすると思います。

clow_h
質問者

お礼

詳しい解説、ありがとうございました。 とても参考になりました。

その他の回答 (1)

回答No.1

turbolinuxで良ければ参考URLを見てみて下さい。 他のlinuxも同様かと思います。 ※共有メモリ等はいろいろなプログラムで既に使用されている場合があるのでipcs等で使用状況を把握してからID 等を割り振ったほうが良いと思います。

参考URL:
http://www.turbolinux.co.jp/world/library/features/c_magazine/vol_05.html
clow_h
質問者

お礼

ありがとうございます。 参考URL、とっても勉強になりました。