Last modified: Mon May 6 2002

ソフトウェアをいじる話 2002年(その1)

これより古い/新しい「ソフトウェアをいじる話」は 「らんらんのLAN」の目次から参照できます。

最新の「ソフトウェアをいじる話」は
http://www.kmc.gr.jp/~ranran/memo/software.html
で参照できます。リンクされる方は目的に応じてURLを使い分けてください。


2002/4/12

DivX 5.0

xkanon と esound


2002/4/2

未だに 16bit アプリケーションが世の中に存在するのがけっこーショックだったのだが、 Windows プログラミングに詳しい某後輩にこの話を振ってみたところ。
「インストーラは16bitがふつーっす。その方が容量小さくなるんで」
…… なるほど、そーゆーもんですか。

DivX 5.0


2002/2/28

Windows2000のシステムを丸ごとコピーする(4)


2002/2/26

Windows2000のシステムを丸ごとコピーする(3)


2002/2/25

Windows2000のシステムを丸ごとコピーする(2)


2002/2/24

Windows2000のシステムを丸ごとコピーする(1)

……うわ、何か既視感バリバリなタイトル(笑)

2002/2/22

DAEMON Tools再び

参考: Cue Sheet 基礎知識

2002/2/20

DivXのあれ(5)


2002/2/19

DivXのあれ(4)


2002/2/18

Emacs21


2002/2/17

DivXのあれ(3)


2002/2/16

DivXのあれ(2)


2002/2/10

共有メモリとロック(2)

排他制御の方法をもう一つ思いついた

DivXのあれ


2002/2/5

共有メモリとロック

プロセス間でメモリを共有したい、という場合がある。 例えば MP3 プレイヤーが fork して、 片方がMP3をデコードして PCM データを共有メモリに書き出し、 もう片方が共有メモリのPCMデータをサウンドデバイスに流し込む、 とか。

プロセス間で共有メモリ空間を作成する方法としては、

  1. SVR4由来の共有メモリ(shmget/shmat/shmdt)を使う
  2. mmap を MAP_SHARED オプションを付けて使う
  3. POSIX の共有メモリライブラリ(shm_open)を使う
の3種類があるらしい。といっても、3. は最終的に 2. に落ちるっぽいので、実質 2通りだけと考えていいだろう。B
shm は本来メッセージ交換のためのものなのであんまりデカい領域は確保できないらしいし、 mmap のほうはマップするためのファイル(しかも確保したい領域と同じ(かそれ以上)の サイズの)を用意しないといけない。 mmap は /dev/zero をマップするとか MAP_ANON オプションを使うとかすると ファイルを用意しなくてもいいようだけど、これがどこまで互換性があるのか不明。

で、共有メモリ空間はこの方法で作れるけど、この空間へのアクセスに排他制御を かけたいと思うとはたと困ってしまう。 Unix でロックというと flock とか lockf とかのファイルへのロックがあるけど、 これはファイルがないと使えない (テンポラリファイルを作って mmap する方法だとこの方法でロックできるんだけど)
では他の代表的なロック… mutex とか semaphore とかはどうか? POSIX に semaphore 関係の関数(sem_open/sem_init etc.) があるのでこれが使えるか、というと… FreeBSD では未実装、あるいは実装されてるけど「プロセス間で semaphore の共有はできません」とか書いてある(4.4R のマニュアル)。 Linux でも(そしておそらく他のフリーのPC-UNIXでも)状況は似たりよったりっぽい。 プロセス間で共有できなきゃ何のための semaphore やねんっ! とツッコミたくなってくるが、まぁ thread 間で使え、ということなんだろう。 …ってことは fork() するんじゃなくて pthread 使ってマルチスレッドにする しかテがないってことですカ!? あるいは共有メモリ使って排他制御するロジックを自分で組めと!? (メンドクセー)

… というとこで「何でこんな需要のありそうなもんが標準ライブラリにないんだろ」 と思って WWW で何か定石がないか探してみると… MM という共有メモリのライブラリを発見した。 共有メモリにロックをかけることもできる。 まさに私が求めていたライブラリである。

で、この MM がどうやって lock をかけてるのかを見てみると… ファイルがあれば flock を使うけど、ない場合は semaphore を使ってるっぽい。 といっても POSIX の semaphore ライブラリじゃなくて、 SVR4 由来の semget/semop のほうを使うようだ。 …そうか、こっちの semaphore だと FreeBSD や Linux でもプロセス間でも共有できるのか。じゃあ何で POSIX の semaphore ライブラリをこれで実装しないんだろう? 謎だ。

結論: POSIX並に互換性の高い関数でロックできる共有メモリを作る一般的な方法は ないらしい。
…うーん。

でも SVR4 の semget とか shmget って key が 分かれば他所のプロセスからもちょっかい出せるっぽいよねぇ。 自分的には「自分とその子プロセスでだけで使える共有メモリ」 が欲しいんだけど、できるのかな… まぁどっちも普通のファイルシステムっぽい permission の設定はできるみたいだから、すくなくとも他人にイタズラされる心配は なさそうだけど。


目次へ