2006年5月4日 (木曜日)

23:57:38 # Life SysV IPC shmの活用. shmget/shmatしたあとに,shmctlで,IPC_RMIDを指定してあげると, 利用している全プロセスがshmdtでデタッチするまでそのメモリ領域を確保し続けてくれる. ipcs で表示させると,statusがdestという状態になっているのがどうやらそうのようだ. LinuxのPOSIX shmには拡張があり,dest状態になっていてもアタッチはできて, 最終的にだれも使わなくなった時点で共有メモリセグメントが削除される,という仕様になっている. SysV IPC 共有メモリの不便な点としては,プロセスが全部死んでも共有メモリが確保されたまま残ってしまう ということだが,Linuxのこの拡張を利用すれば, shmget/shmatで確保して即削除指定することによって 誰も使わなくなった領域は削除される,という状況を実現することができる. 良いじゃないですか.

通常の共有メモリのワークフローと比較してみます. まず,通常版

そして,Linuxで可能な方法

shmdtは特に明示的に呼ぶ必要はなく,プロセスが終了すると自動で デタッチされるというようなものらしいので,アプリケーション側からは shmget,shmat を呼び出し,shmctlでフラグを付ける,ということだけをすればよさそうです. あとは,デフォルトで非常に少ない量しか確保されていない共有セグメントの 設定をユーザに増やしてもらう必要がある,という点がちょっとした課題でしょうか.

Junichi Uekawa

$Id: dancer-diary.el,v 1.90 2006/01/31 11:16:16 dancer Exp $