2010年12月12日日曜日

UNIX原典(2)

前回の投稿からだいぶ空いてしまいましたが、読んでみて特に面白かったBlitの章についてコメントしてみます。

Blit - 多重化されたグラフィクス端末
Rob Pikeによる、X以前の世界でもグラフィクス端末のお話。UNIX 7th Edition〜8th Editionの頃の話のようです。何と言っても面白いのが、グラフィクス端末側にもプログラムをロードして実行できる、という考え方。ご存知のようにXなんかの世界では、ユーザプログラムはXクライアントとして動き、Xサーバへは描画命令の単位で依頼を出します。これって、今時のアプリケーションによっては、通信の多い切り口でレイヤーを区切っちゃってるんですよね。VNCやRDPなんかのリモートデスクトップともなるとなおさら。更新のあった描画区画単位でBitmap情報をやり取りするので、通信はすごく多い。

一方で、ウェブの世界を考えてみると、実はもう少し賢い。MVCモデルで言うと、Modelをサーバサイドでセッション管理をしながら実行。Viewについては素材をサーバサイドで提供しつつ、クライアントサイドのブラウザが最終的なViewを構築。Controlについてもクライアントサイドのブラウザが提供するわけですが、Web2.0以降になってくると、この辺はサーバから送られてブラウザ上で実行されるJavaScriptが担っており、気の利いたUIや滑らかな画面更新が実現されています。

Blitの作りはこのWeb2.0に似てたりします。Blitが初めに目指すところは端末の多重化。今で言えば、画面に複数のターミナルを開きたい、というただそれだけの欲求です。サーバ側ではmpxというプログラムが走り、その中で複数のシェルが実行されます。今で言えばGNU screenみたいなものでしょうか。ディスプレイサイドではmtxtermというプログラムが走り、サーバとの間はRS-232(19,200bps!!!)で接続されます。mtxtermは多重化されたシェルの入出力を復元し、複数のウィンドウ上で動くシェル環境を再生。原始的なXに近い外観を提供しています。ただXと本質的に違うのは、ディスプレイ側でも直接アプリケーションプログラムが実行できる点。例えばエディタなどでは、画面を表示して、ユーザのカット&ペーストなどを制御するアプリケーションコードがBlit側にロードされ、このサブプログラムにより編集されたデータが定期的にUNIXサーバ側に渡される、といった具合です。

描画に関連するオブジェクトはシリアライズしてRDPクライアント側に送りつけ、ユーザ側に近い場所で実行。セキュリティ的に難しいところはあるかもしれませんが、今風に味付けすれば、色々と研究しがいがありそうなテーマにも思えます。WindowsなんかではDirectXのコードがクライアント側のGPUを使って動く、なんて話もあるみたい(*1)なので、これから面白くなってくるのかなぁ、なんて思ってます。クラウドを考える際の切り口の1つとしても面白いのではないでしょうか。

百聞は一見にしかず、という事でYouTubeで見つけた紹介動画を埋め込んでおきます。


(*1): Windows 7のRDP 7ではDirect 2D/3Dがクライアント側でレンダリングされる話があったのですが、製品レベルに到達しなかったのか、RCからリリース版に移る際に外れてしまったようです。

1 件のコメント:

とよしま さんのコメント...

おー、すでに面白い事になってるんですね。

Blitが失敗したのは、サーバサイドとクライアントサイドに分けたプログラミングが複雑だったから、だと思います。この辺はWebの世界でも同様で、Webは筋の悪さを元気で補っているように感じます。止まったら負け、みたいな。なので、RDPのDirect 3Dクライアントレンダリングは(詳しく見てないのですが)、その辺を意識せずにプログラムが書け、分散実行できるのが面白いのかな、と思いました。CPUとGPUという境界線は、比較的分離しやすい切り口ですかね。自動並列化ならぬ自動分散化。そういう方面でもすでに成熟してたら勉強不足ですみませぬ。