通信機構の方式
2006/11/28
サーバプロセスの主たる業務は、同じファイルを同時に編集して、編集内容が失われることがないように調整することである。だが、今まで俺は、各プロセス間の通信を行う専門のモジュールを用意することは考えてこなかった。そのため、試行錯誤した結果としてサーバプロセスが通信基盤としての役割も担うことになってしまった。
だが、通信を司る役目と、主筆間の排他制御とには、本質的な関連性は何もない。であれば、この二つは分割するのが筋であるはずだ。つまり、独立した通信基盤を用意するのが良いのではないか、サーバはその上で動く一つのプロセスにしてしまうのが良いのではないか、ということに思い至った。
まぁ、気が付くのが遅いと言われれば返す言葉はないのだが。
では、独立した通信基盤というものを作るとした場合、それは一体どういう作りにするのが良いのだろうか? つまり、インターフェースをどうするべきなのか?
この通信基盤に乗っかって相互に会話を行うプロセスは、現状では三種類ある。クライアントとサーバと主筆本体だ。この三種類のプロセスは、それぞれまったく違ったパターンで通信を行う。
クライアントは、ユーザから入力された指示をパケットにしてサーバに送りつける。そしてサーバからの応答を受け取る。つまり、一問一答の形式で通信を行い、そしてそのままプロセスを終了してしまう。
サーバはクライアントとはまったく異なり、起動したら常に受信可能な状態で待機しており、誰かから何らかのパケットを受信したら、それに応じた処理を行い結果を返している。また、サーバは明示的な終了の指示が来るまでずっと存在し続ける。
主筆本体はサーバと似ているが、求めるインターフェースが大分異なる。パケットを送信する部分は他の二者と同様なのだが、データの受信はディスクリプタからの読み込みでなければならない。これはXはMotifの仕様によるものであり、曲げるわけにはいかない。
だから、主筆で使用する通信基盤は、それら三種類のプロセスが期待する通信形態を全て満足するような機能を提供しなければならない。
また、プロセスの起動を誰がやるのかという問題もある。サーバや主筆本体の起動は、通信基盤で責任を持ってやるのだろうか。あるいはクライアントやサーバプロセスで行うのだろうか。そもそも、通信基盤のプロセスは誰が起動するのだろうか? クライアントだろうか?
さらに、通信基盤のインスタンスはシステム全体に一つだけ用意するのか、各ユーザごと用意するのか?
通信基盤の構造はどうなるのか? 通信関係を司るプロセスを用意するのか、独立したプロセスは用意せず、各プロセスにリンクされるライブラリとプロトコルだけにするのか?
単純に通信基盤だけ独立させると言っても、決めなければならないことは多数ある。だが、ここを独立させることが出来れば、大分構造を明瞭にすることができるのはないだろうか。一考の価値はあるようだ。

