プロセスその21
「EventFlagもCritical Sectionではないか?」と言われれば間違いなくそういう側面はある。ただWindowsにおけるCritical Sectionと異なるのは、これがInter-Process Communicationとして活用されていたからだ。SYS$QIOの話で言えば、EventFlagは「I/O完了」というメッセージの通知となる。特徴的なのはCommon/PrivateどちらのEventFlagも64個用意されることで、幾ばくかはSystem Reserveとしても、かなりの数のEventFlagをアプリケーションで自由に利用できる。だからこそSYS$WFLORとかSYS$WFLANDなんて命令が生きてくるからで、これらは同期と同時に状態を伝えるメッセージ伝達の役に立つことになる。
といっても、Event Flagは所詮1bitのメッセージでしかない。64個のEvent Flagを使えば64bitデータが伝達できることになるが、それでもまだ多いとは言えない。Event Flagの弱点は当然ながらQueuingの機能を持たない事で、どうしても必要ならばEvent Flagの状態を常に監視してそれをQueuingするようなProcessを作るしか無いが、これは馬鹿馬鹿しい。そこでQueuingが可能なCommunicationとして用意されたのがMailboxである。
Mailboxは、VAX/VMS上ではVirtual I/O Deviceとして作成される。したがってプログラムは、このI/O Deviceに対してI/Oを行うような形だ。機能的には、
- メッセージを格納・送出する
- メッセージ到着などの通知を行う
の2つが可能である。名前の通り、要するに腕木付き郵便受けをイメージしたものだ。これに近い概念は、TCPにおけるConnection付きのSocketに近いものだろうか? あるいは、UNIXにおけるMailboxを連想してもいいかもしれないが、この比喩だと微妙に違う、という話は206回にも触れたことだ。
さて、使い方としてはまずSYS$CREMBX(Create Mailbox and Assign Channel)を発行して、メモリ中に仮想のMailboxを生成し、そこに対してのChannelを割り当てる。Channelというのは、言ってみればUNIXで言うところのFile Descriptorに相当する「番号」である。ここでMailboxにアクセスするための番号が割り当てられ、以後のリクエストはこの番号を指定して行う形だ。その後は、SYS$QIOを使ってMailboxにメッセージを送ったり、逆にSYS$QIOを使ってメッセージを受け取るという形になる。このあたりは、実体はメモリ中にありながらもDeviceとして扱われる以上、Deviceとしてハンドリングする必要があるという事だ。
さてMailboxに対してのI/Oを行う場合、
- そのMailboxにMessageが到着した
時にEvent(つまりASTの起動)が発生するのはごく当然の事だ。同様に、
- そのMailboxにMessageを書き込んだ
場合もEventを起動することが可能だが、それ以外に、
- (他のProcessが)MailboxにReadを行った
- (他のProcessが)MailboxにWriteを行った
というEventが発生するのがちょっと他のDeviceと異なる部分だ。これを用いることで、メッセージの受け渡しを行っているProcess同士「以外」のProcessも同期を取ることが可能になる。また、Mailboxは(NonPage Memoryを使う関係で)余り大きいサイズにすることは推奨されないが、それでも例えば256Bytesとかにすることが出来るので、Eventflagの様にMailboxそのものを使って伝達する必要が無い。Eventflagだと、例えば#10がSetされたら処理1を行うとか、#12がClearされたら処理を中断するなどと、EventflagそのものをMessageとする必要があるが、Mailboxを使って同じ事をする場合に、例えば#10のMailboxにMessageが送られたら...なんて使い方はしない。単に共通のMailboxに"Process #1"とか"Stop #1"といった意味を持つMessageを送ればすむからだ。
このMailboxが便利だったのは、
- Memoryに対する処理なので、レイテンシが少ない
- Mailboxの処理はIPL11を使って行われるため、他の処理よりも優先されやすい
というあたりだ。対する欠点は、Network Wideの対応が乏しい事である。一応機能的にはRemote Mailboxと呼ばれるものがあり、これを使ってネットワーク越しにアクセスすることも不可能ではないが、そもそも制約が色々ある(VMSではなくOpenVMSでの話だが、これなどが参考になるだろう)上に、ネットワーク越しにするとレイテンシが巨大になってしまい、折角の高速デバイスであるMailboxのスピードが生かせなくなってしまうことだ。