[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

ロック

Table of Contents
ロックの概要
TODO

プロセス間の同期化は(Unixカーネルの提供する)ロック機構を用いて行ないます。 fml8 でサポートされているロックメカニズムは flock(2) もしくは lockf(2) を元にしたロック機構のみです。

ロックの概要

ながらく giant lock でしたが、2003/03 に giant lock をなくしました。

現在では、いろいろなりソースごとに、ロックチャンネルが用意されています。

たとえば、Mail::Delivery 関連はメンバーリストにアクセスするので、 いろいろとロックが必要です。

Mail::Delivery::SMTP の操作の際にはメンバーリストのロックが必要です。 現在は、Mail::Delivery::SMTP を呼び出す FML のクラス (実は FML::Send と FML::Process::Delivery の2箇所しかない) の中でロック処理をしています。

一方、Mail::Delivery::Queue は見るだけ (mailq コマンド)か、 並列操作可能なものだけなので、ロックは考えなくて良いはずです。

そして、reader writer lock まで大げさでなくとも、 一般に map へアクセスする際にはロックが必要です。 そして write 用の lock が必要とは限りません。 たとえば FML/Command/UserControl.pm や FML/Command/Auth.pm には write 用の lock が必要ですが、 FML/Credential.pm は read 用の lock だけでよいです。

しかしながら、いまのところ reader writer lock は実装されていませんので、 リソースごとの細かいロック制御で critical region の時間を短くするようにしています (メーリングリストドライバで、 RWlock が必要なほど並列度の高い読み込み要求は来ない気がします)。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >