【どくしゃかきてもんだい】
読者-書き手問題 とは?
💡 図書館の閲覧ルール、読むのは自由だけど書き込みは一人ずつ
📌 このページのポイント
- 読み手(Reader)は複数同時にデータを読める
- 書き手(Writer)はデータを変更するため、他の読み手・書き手と同時にアクセスできない
- 読み手優先・書き手優先・公平方式など複数のバリエーションがある
- データベースの共有ロック・排他ロックやRWロックとして実装される
読者-書き手問題って何?なんだか国語の話みたいだね!
なるほど!読むだけなら何人でもOKだけど、書くときは独占しないといけないんだね?
その通り。読み手同士はデータを変更しないから衝突しない。でも書き手がいる間に読み手がアクセスすると、書き換え途中の中途半端なデータを読んでしまう可能性があるんだ。
じゃあ全部を排他ロックすれば簡単じゃないの?
それだと読み手同士も同時にアクセスできなくなって、性能がガタ落ちするんだ。読み取りが多いシステム(Webサイトとか)では、読み手の同時アクセスを許可するだけで性能が何倍にもなるよ。
どうやって実装するの?
RWロック(Read-Writeロック)という仕組みを使うよ。読み手は共有ロック、書き手は排他ロックを取得する。Javaの ReadWriteLock やPythonの threading.RLock、PostgreSQLの共有ロック/排他ロックもこの考え方だね。
読み手優先とか書き手優先って聞いたことがあるけど、何が違うの?
読み手優先だと、読み手がいる限り書き手はずっと待たされる。書き手がなかなか実行できない「飢餓状態」が起きるよ。逆に書き手優先だと、書き手が待っている間は新しい読み手が入れない。公平方式は到着順で処理するけど実装が複雑になるんだ。
実際のシステムではどれが使われているの?
Linuxカーネルのrwlockは書き手優先、PostgreSQLのMVCCは読み手がロックなしで古いバージョンを読める仕組みで、読者-書き手問題をさらに賢く解決しているよ。Webの世界では「読み取り99%・書き込み1%」みたいな偏りが多いから、RWロックの効果は絶大なんだ。
まとめ:ざっくりこれだけ覚えればOK!
「読者-書き手問題」って出てきたら「読むのは同時OK、書くのは一人だけという並行制御の基本問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Readers-Writers Problem」 = 読者と書き手の問題
💬 1971年にコートニー&ランポートが提唱した並行処理の古典問題だよ