使用 - みる会図書館


検索対象: UNIX MAGAZINE 1991年10月号
193件見つかりました。

1. UNIX MAGAZINE 1991年10月号

UN Ⅸへの招待⑩ ウを使ったものです。これは DEC 社で開発されたも ので、 X ウインドウ・システムに標準で提供されてい ます。 この連載では、これらのメール関連コマンドのうち、 ucb mail と MH について説明します。最初の数回で ucb mail を、続いて MH を紹介する予定です。 Sys- tem V の mail を勉強したい方は、とりあえす ucb mail の利用方法をマスターしてください。前述のよう に、 System V の mail は ucb mail よりも機能が劣 ります。また、 ucb mail が System V の mail の上 位圧換というわけでもありません。しかし、 SystemV の mail を利用するうえでの参考にはなると思います。 System V の mail を使う方は、 こでの説明を参考に して使用しているシステムのマニュアルをぜひ一読して ください。 なお、以降に挙げる例は、 ( とくに断わらないかぎり ) すべて SunOS 4.1.1 上で実行したものです。 SunOS では ucb mail をさらに拡張し、もとの ucb mail では 提供されていない機能を追加しています。このような機 能をとりあげるときには、 Sun 固有のものであることを そのつど説明することにしましよう。また、例で使用し ているメールの宛先はすべて架空のものです。 mail コ マンドの練習をするときには、この宛先を使わないよう お願いします。 SunOS でも BSD 系 UNIX でも、 ucb mail の実 行可能ファイルは /usr/ucb にある mail と Mail と いうファイルです ( Ma ⅱは、 mail にリンクされていま す ) 。また bin mail のほうは、 /bin( または /usr/bin) にある mail というファイルです。自分では ucb mail を使うつもりでも、シェル変数 path の値に /bin や /usr/bin が /usr/ucb よりもさきに設定されている と、 % mail としても、 bin mail が実行されてしまいます。 ucb mail を mail というコマンド名で使う場合は、 path の 値として /usr/ucb の後ろに /bin や /usr/bin を含め るようにしましよう。 Emacs でも、 RMAIL 、 MAIL 、 mh-e など、メー ルのためのシステムか提供されています。しかしここで は、あえてこれらについては触れません。 Nemacs の メールシステムを使用する方は、本誌 1990 年 11 月号 と 1991 年 1 月号の「 Nemacs 入門」に詳しく説明さ れていますので、そちらを参考にしてください。 m 題ⅱの基本動作と用語 こでは、以降で使う、、用語 " の意味と ucb mail の 基本動作について説明します。用語の意味を明確にして おかないと、途中で何がなんだか分からなくなってし まうかもしれません。言葉の意味を明確にするために、 ucb mail の基本動作にちょっとだけ触れておく必要が おもな用語 あります。 154 に System V の mail に触れなけれは・ならない場合は、 ドという言葉で ucb mail を表すことにします。とく と呼ぶことがあります。ただしここでは、 mail コマン ンドを、 System V のそれと区別するために ucb mail バークレイで改良された mail コマ 前述したように では最初に、用語について約束しておきましよう。 SystemV の mail コマンド " と注記します。 mail コマンドには、さまざまなオフションがありま す。唐突ですが、ⅵの機能を思いだしてください。ⅵに は、コマンド行のオプションがあります。たとえは、 % Vi では、ⅵが異常終了したときに編集していたファイル が回復できます。一方、ⅵのなかでは、 : set number などを実行し、ⅵそのもののオプションが設定できま す ( この場合は、各行の先頭に行番号が付きます ) 。さ らにⅵでは、ユーサーが ( ホームディレクトリやカレ UNIX MAGAZINE 1991.10

2. UNIX MAGAZINE 1991年10月号

ースーバーユーサーへの道 6 図 2 トランシーパ・ケープルのピンの割付け 6 〇 6 6 6 6 6 〇 図ー RS232C の結線例 ストレート 1 2 3 4 5 6 7 8 20 イ 1 っ 4 つ -4 - りー -8 一つ 4 〇〇〇〇〇〇〇 ビン 1 control shield 2 control input A 3 data output A 4 data input shield 5 data input A 6 voltage common 7 control output A 8 control output shield 規格 ( IEEE802.31 ) では、すべてのピンの役割が定められ ています ( 図 2 参照 ) 。 ですから、旧い規格のケープルだと、必要なピンが揃わ しつは違うケープルがあることです。では、どのような類 すに痛い目に遭うかもしれません。そんなことにならない 似品 ( ? ) が存在するのかみていきましよう。 トランシーパ・ケープルを購入する ( あるいは、よ そからくすねてくる ) 場合には、本体側の規格にかかわらす ストレートとクロス すべてのピンが揃ったものを入手するようにしましよう。 ワークステーションと端末 ( パソコンなど ) をつなぐと 電話のモジュラーケープルか ? きには、一般に RS232C ケープルを使います。ところが、 RS232C ケープルにも 2 種類あります。 1 つはストレー Ethernet の規格にもいくつかの種類がありますが、そ トケープル〃と呼はれるもので、ケープルの両端のコネク のなかに IOBASE-T と呼はれるものがあります。このケ タが、そのまま 1 対 1 に対応しています。これと異なり、両 ープルの外観は電話のモジュラーケープルと同しで、コネ 端の 2 、 3 番ピンが入れ替わっているものを、、クロスケープ クタもよく似ています。普通の電話では電極数 6 ( そのう ルクと呼びます ( 図 1 参照 ) 。一般に、端末をつなぐときに ち 2 極使用 ) ですが、 IOBASE-T は ISDN 電話と同しで はクロスケープルを、モデムなどの場合はストレートケー 電極数 8 ( そのうち 4 極使用 ) です。ただし、 6 極のプラグ プルを使います ( 仕様書をよく読んで確かめてください ) 。 でも 8 極のジャックに入ってしまいますから注意が必要で RS232C ケープルは使用頻度が高く、接続する相手によ す。いすれにせよ、インピーダンスなどのケープルの特 ってクロスなのかストレートなのかは、バラバラです。そ が違うので代用にはなりません。 のため、接続するときにケープルを間違えないように、ク そのほかの似ているケープル ロスかストレートかが分かるように目印を付けておいたは うがよいでしよう。 そのほかに似ていて間違えそうなものに、 Thin Ether- net ケープルがあります。これは、ディスプレイのケープル 旧いものと新しいもの とそっくりです。コネクタまで似ていますから、ちょっと Thick Ethernet で、計算機本体からトランシーバまで 見ただけでは判断できません。これら 2 つのケープルはイ をつなぐのに利用するのが、、トランシーパ・ケープル〃で ンピーダンスが異なりますので、つないでも動作は保証さ す。しつは、このケープルも 2 種類あります。トランシー れません。 パ・ケープルの以前の規格では、 9 本のピンだけが決めら 1 正確にいうと、 Ethernet の規格が IEEE802.3 に史新されたわけではないので れており、残りは空いていました。これに対して、現在の すが、話がややこしくなるので・・・ 13 12 11 10 9 15 14 ビン 9 cont rol input B 10 data output B 11 data output shield 12 data input B 13 positive voltage 14 voltage shield 15 control output B ス ロ ク、 1 っ 4 叮 0 -4 - りー 8 : 0 一 41 UNIX MAGAZINE 1991 ユ 0

3. UNIX MAGAZINE 1991年10月号

設計上の留意点 クラスの言雌十 オプジェクト指向設計においては適正なクラスの設計 が重要であるが、これはそれほど簡単にできるものでは ない。たとえば、以下のような恥頁を決定しなければなら 解決すべき間題のなかにどのようなオプジェクトがある ・どのような分類が可能か ( これによって、クラスの定義 が導かれる ) 。 ・どのようなクラスイゞなされるのか。 1. 独立したクラス定義 2. 里の嬲里するクラス定義 3. 既存のクラス定義にもとづくクラス定義 4.1 および 2 のガ去の混合 最初の点は重要である。たとえは、複数の要素からなる 木を、要素のクラスおよびこれらの要素から木を作る独 立したクラスとして実装できる。一方、複数の要素から なる木の 1 つだけのクラスを実装することも可能であ る。設計上、どちらを選択すべきかは状況によって異 なる。 クラスの記述にあたっては、クラスのインターフェイ ス、クラスの値、そしてこれらの値にどのような変更か加 えられるか ( どのプロシージャを使うか ) 、を記さなけれ ばならない。以降では、クラスの言 t に必要なこれらの問 情報隠蔽、抽象 題について述べる。 UNIX MAGAZINE 1991.10 の名前をすべて知らなければならない。 必になろう。プログラマーは、これらの関数とその引数 算などの演算子 ( 関数 ) を含むインターフェイスの定義が たとえば、クラス、、複素数 " を実装するには、加算、乗 いる ) とクラスの実装をうしている。 れは、ユーサーがクラスを使えるよう十分に小さくなって ス ( クラスのユーサーが見ることを許されているもの。 オプジェクト指向設引・では、クラス・インターフェイ 連載①オプジェクト指向の世界 この問題は、実装の間題とは切り離すべきである。複素 数の実装には、極座標系あるいは月 2 べクトルが選択がで きる。どちらを選択してもクラス複素数の機能に景彡響はな い。あとで既存の実装を変更する場合、ノウ。リックなイン ターフェイスは変更されずに実装だけが変更されるので、 クラス複素数を使用しているコードは変更による景グをま ったく受けない。 1 つのクラスをノ。リックなインターフェイスとプライ べートな実装とに分離する過程は、抽象化の一部である。 抽象においては、まずクラス・インターフェイス ( そのク ラス・オプジェクトの振舞い ) を決めておき、それを具体 的な実装とは分離する。 クラス定義相互の依存 オプジェクト指ー旬設言の可用性を高めるためには、きれ いにうまく設引・された継承グラフ ( クラスの依存関係を記 述するグラフ ) がオプジェクト指向設計の要であることを 理解しなけれはならない。クラスが適切に設計されておら す、互いに十分に独立していないと、、、オプジェクト指向 スパゲッティ " になってしまう。つまり、すべてか互いに 依存しており、モジュールも柔車幻生もない。したがって、 継承グラフはできるだけ弱くすべきであり、依存関係はで きるだけ少なくすべきである。 クラスの実装に隠されている項目 ( プライベート ) をク ラスのノワ・リックな部分に移すのはごく簡単である。しか し、これがなされると継承グラフは強くなり、望ましくな い結果をもたらす。言い換えれば、何をノウ・リックにすべ きで、何を / ワ。リックにすべきでないかについては、細心 の注意を払わなけれはならないのである。 継承のメカニズム 継承を働かせるには、クラスの拡張性に留意して言 1 す る必要がある。クラスの定義にあたっては、再利用性と拡 張陸に留意することか重要である。つまり、そのクラスが どこで使われるのか、また、はかの竟で容易に使用でき るようにするにはどうすべきか、ということについて十分 に考慮しなければならない。 ライプラリ ライプラリの概念は以前からあるが、オプジェクト指向 プログラミングではライプラリの使用がより魅力的なもの 131

4. UNIX MAGAZINE 1991年10月号

システムの動作を確認、モニターするためのツールがい くつかあります。これらを使えば、詳細にシステムの状態 を知ることができます。 vmstat システム全体の動作状態を知りたいときに、 /usr/ucb/ vmstat (virtual memory statistics) を使います ovmstat システムの動作状態を知る 0 0 0 0 0 0 0 0 30 14 16 71 0 0 、、、はシステム内を検索し、プロセス、仮想メモリ、ディスク、 トラップ、 CPU アクティビティについての統計情報を知 らせてくれます。ですから、どうも反応が遅いような場合 にはこのコマンドで調べてみると、原因の所在を判断する 手助けになるでしよう。使い方は次のとおりです。 vmstat [ -cfisS ] [ [ interval [ co 社厩 ] ] 通常は 1 回だけの表示ですが、切ルおよび 00 ″厩 を指定すれば、連続的に切ルに 1 回の表示をじ厩 回おこないます。 % vmstat 5 5 procs memory cpu re 0 0 0 0 0 at 0 5 0 0 0 page 0 0 0 0 1 po di sk faults avrn 0 0 0 0 0 fre 400 320 284 300 312 PI 3 0 0 0 0 fr 4 0 0 0 0 sr SO dl 1 0 0 0 0 d2 s3 in sy cs us sy id 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 84 86 18 187 3 89 14 402 5 169 19 20 17 18 2 1 0 0 2 96 5 94 1 99 0100 各フィールドの意味は、次のようになっています。 procs プロセスの状態を表す 58 us は優先順位が普通のものと低いもののユーサー時間、 cpu CPU 時間の使用割合を表示 数、 cs は CPU のコンテクスト・スイッチの回数 ⅲはデバイスによる割込み回数、 sy はシステムコール 単位で表示 faults トラップと割込み回数を 5 秒ごとに平均化し 1 秒 disk ディスクのアクセス回数を表す 平均化して 1 秒単位で表示 page ページングの回数と利用状況を 5 秒ごとに集計し、 つねに 0 を表示 ) フリーな実メモリのサイズ (avm は SunOS の機構上、 avm は現在使われている仮想メモリのページ数、 fre は memory 仮想メモリと実メモリの使用状況を表す 行可能であるがスワップアウトされているプロセス ジング待ちなどでプロックされているプロセス、 w は実 r は run キューに入っているプロセス、 b は I/O やペー sy はシステム時間 3 、 id は CPU のアイドル時間 -s 、 -S 、一 f オプションを与えると、 vmstat はプー ト以後に蓄積したデータのサマリーを出力します。この場 pstat す。 vfork の数、そのときの仮想メモリのページ数を表示しま 出力されます。また、 f オプションを付けると、 fork と フラグではデバイスごとの割込み回数の総数と発生頻度が 合、れや 0 ″厩引数は無視されます。たとえば、 -i システム内のテ pstat を使います。 ープルの使用状態を知るには、 / etc / 3 プロセスが、ユーザー・モード ( システムコール以外 ) で消費した時間を第ユー ザー時間をといいます。また l. プロセスのシステムコールを実行するためと割 込み処理のカーネルが働いている時間を第システム時間〃と呼びます。 UNIX MAGAZINE 1991.10

5. UNIX MAGAZINE 1991年10月号

ピクセル・コビー 図 9 タイルの貴し 実行前 実行後 33 22 11 DD CC 1 1 BB 00 AA BB AA 境界の揃ったメモリ・ワード 読込み元ポインタ 境界の揃ったメモリ・ワード 書込み先ポインタ 境界の揃ったメモリ・ワード 右端においては、サーバーはスパンの終り以降のすべ てのステイプル・ピットをマスクする。ステイプルの データに対するこれらの調整は、すべての透明ステイプ ルのスパンのワードを左端と右端とで効果的に揃える。 ーは 0 の N 。 Op 性を利用して、残りのスティ プル・ビットが 0 である場合に、スパンの 32 ピクセル・ セグメントの描画を止める。 書込み先ピクセルに応じて変化するグラフィックス関 数を使って透明ステイプルを描画する場合、 16 の枝を もつ分岐はステイプル・パターンがまばらな ( 1 のピ ットが少ない ) ものでないとうまく働かない 23 。咼速の write 命令ではなく、低速の読込み / 変更 / 書込みシーケ ンスになってしまうためである。さいわい、一般化さ れたグラフィックス関数はこの状況にうまく適合する。 ーは、不透明ステイプルのために作成されたも のに似た 16 工ントリのテープルを使用するが、スティ プルが 0 の部分は背景ピクセルを描画するのではなく、 NoOp(andbits がすべて 1 、 xorbits がすべて 0 ) にな るようにする。結果のコードは不透明ステイプルのコー ドによく似ているが、アラインメントとループの終了を 実現するために 0 のビットがもつ N 。 Op 特性を使用し ている。 タイル タイル塗潰しは、ピクセルをタイルから書込み先にコ ピーする。読込み元と書込み先のアラインメントは、相 互にどのようになっていてもよい。図 9 は、タイル塗潰 しの最初の 2 ピクセルである。 23 訳注 : 1 のピットが少ない、つまり 0 が多いということは、プレーン マスクカ陏効で、書込みのみで描画できることを意味する。 88 こでも、サーバーは、スパンの内部を一度に 4 ピ UNIX MAGAZINE 1991.10 性能を表す数値はすべて、 xllperf プログラムによっ 書き換える方法を示す。 ズムを単純な数学的変換によって、より効率的な形式に いかたちに記述されてしまう理由と、これらのアルゴリ 節では、よく知られたアルゴリズムがしばしば最適でな のピクセル・コピーの手法を示す。最後に線分の描画の Area では、読込み元がキャッシュ・メモリ内にない場合 テイプルとして描画する場合の変更方法を示す。 Copy- 狭く縄区しのないピットマップを、透明および不透明ス を説明する。 PolyText と ImageText の例では、幅が まざまな塗潰しスタイルの手法をどのように変更したか る。 こでは、特定の描画操作に適合させるために、さ X プロトコルには、何種類かの描画リクエストがあ 描画リクエストの高速化 たのちに、塗潰し関数を使用する。 する andbits と xorbits に格納する前処理をおこなっ で、サーバーはピクセル・データの 32 ビットを、対応 化された Copy 関数は塗潰し関数よりもさらに複雑なの ーはタイルのビット群を適当に回転させる。一般 トーンの実現に使用する。ステイプルの場合と同様に 幅 4 ピクセル高さ 6 ピクセルのタイルをカラー・ハーフ る。たとえば、 Display PostScript System[1][7] は、 分である。各ピクセルに任意の色を使用できるからであ れは 4 ピクセル幅にすぎないが、たいていはこれで十 ーは幅が 32 ビットのタイルを最適化する。 CopyArea の手法を使用する。 することはできないので、サーバーでは彳する低速の 残念なことに、 C 言語からこれらの命令に直接アクセス レスか揃っている場合にくらべて 1 サイクル多くなる。 シュされている ) にストアされるので、この処理はアド ードを読み取る。タイルはつねにメインメモリ ( キャッ 令と Load Word Right 命令を使って、タイルの各ワ ーは Load Word Left 命 できる。理想的には、サーバ セットでは、アドレスか揃っていない場合も容易に処理 トが同しである ) 場合には容易である。 MIPS の命令 ている ( 読込み元と書込み先のアドレスの最下位 2 ピッ クセルすっ塗り潰す。これは読込み元と書込み先か揃っ

6. UNIX MAGAZINE 1991年10月号

における形状、塗潰しスタイルおよびグラフィックス関 ーには低 数の組合せは膨大な数にのは、る。カラーサー 水準の描画マクロの呼出しが 300 近くあり、その多くは 複雑なレンダリング・アルゴリズムで使われている。 れらのすべてについて動的にコードを生成するのは現実 的でない。 これらの代わりに汎用性の高い関数を導き出すことに よって、グラフィックス関数の種類を減らした。設定し た目標は以下のとおりである。 ・使用頻度の高い関数 ( とくに Copy) を高速に実行さ せる。 Copy 、 Clear 、 Set 、 CopyInverted の各関数では書 込み先ピクセルを読ますにすませる 8 。 ・前掲の独立したプレーンマスク式は使わす、プレー ンマスクによる指定も可能なかぎり導出関数に組み 込む。 ・はとんどの描画処理では既知である読込み元の値 ( 前 景ピクセルまたは背景ピクセル ) を使うという事実を 利用する 9 。 DECstation 3100 のサーノヾーを稼動させるために、 最初は各描画ルーチンを 3 通りにコンパイルした ( マク 口を用いたコードで条件コンパイルをおこなった ) 。 1 つ は Copy 、 1 つは Xor 、残りはその他すべての描画処理 のためである。 Copy と Xor は定義されたとおりに実 装されたが、残りの 14 の関数は switch 文を使い、描 画する際に適切なコードへと分岐した。 ところが、この方法にはいくつかの欠点がある。プレ ーンマスク・セマンティクスを組み込んでおらず、 Copy や Xor 以外の関数を使用するすべてのリクエストの描 画速度はたいへんに遅く、 switch 文を使って生成され たコードは Copy と Xor の 4 ~ 8 倍の大きさになる。 次のリリースではパラメータをとる関数を使って、 switch 文をまったく使わないことにした。 16 の関数は、 塗潰し操作のための 4 つの関数 ( これらは既知の前景 びタイリングのための 6 つの関数 10 の組合せに分解で きる。塗潰し関数は 0 ~ 7 つの論理演算を必要とする。 CopyArea ファミリーの関数は 0 ~ 8 つの論理演算を必 要とする。それぞれのソースファイルを、最初の方法よ りも回数を重ねてコンパイルしたが、合計のコードサイ ズはこちらのほうが小さく、残りの 14 の関数による描 画速度はずっと速くなった。 MIT の Keith Packard にこの結果を伝えたところ、 彼は即座に別の面から問題の解決に取り組んだ。さきは どの導出関数は 3 つの一般形に分かれ、本来の X11 関 数とは別の系統を示している。 Keith は 3 つの関数に 縮約することが可能だと気づいたので、 16 の関数のす べてを表す単一の論理式をみつけようと試みた。塗潰 し操作のための彼の最初の汎用論理式は次のとおりであ ( (dst XOR xorbits) AND andbits) OR orbits こで、ノヾラメータ xorbits 、 andbits 、 orbits は既 知の読込み元ピクセルから導かれる。彼は、さらにこれ を次のように縮約した。 (dst AND andbits) XOR xorbits 1 つの一般式で 16 の関数すべてを実現できるので、 ピクセルの各プレーンは、適切な andbits と xorbits の 選択によって別々の関数を適用できる。プレーンマスク が 0 のプレーンの場合、 NoOp 関数 (andbits=l 、 xor- bits=O) を表すように andbits と xorbits を調整すれ は 12 、 0 のビットを含むプレーンマスクは、論理演算を 追加することなく自動的にプレーンマスク機能をもっこ とになる。 一般関数は、使用されることのない書込み先の読込み や無意味な論理演算を避けるために、より特化した関数 に分割できる。導出された 3 つの塗潰し関数 DFcopy 、 X サーバーの高速化 および背景を描画する ) 、 8 訳注 : 表 1 から分かるように、 9 訳注 : 表 1 から分かるように、 CopyArea 、 PutImage およ これらの関数は dst を使わない。 ほとんどの関数が src を使う。 10 11 12 UNIX MAGAZINE 1991.10 これらは、ソース・ピクセルをメモリ中のある領域からとってくる ので、有用なかたちにするための前処理をおこなうのは難しい。 訳注 : ここでは、 CPU に実装されている基本的な論理演算 xor 、 and 、 or 命令を使って表している。この式は、 xorbits 、 andbits 、 orbits がそれぞれ (0,1,src,—src) の 4 通りの値をとりうるので、 64 不頁の関数を表すことになり、 X の描画関数全体を表すにはかな り冗長である。次の式では 4 x 4 = 16 通りの式を表しており、冗 長さがない。 訳注 : この場合、 (dst AND 1 ) XOR 0 = dst XOR 0 = dst となり、 NoOp の意味になる。 81

7. UNIX MAGAZINE 1991年10月号

864 本のスキャンラインだけである。ハードウェア・グ ラフィックス・アクセラレータを装備したシステムでは、 残りの 160KB はフォント情報やピックスマップのオフ スクリーン・キャッシュとしてよく使われる 2 。しかし、 メインメモリより性能が劣り、メモリ管理も複雑になる ため、このメモリは利用しなかった。 メインメモリとピデオメモリは、同し内部バスとタイ ミング論理回路を使う。 CPU は、ワード内の 1 ピクセ ルから 4 ピクセルまでの任意の連続したピクセルの読み 書きを、 1 回のメモリアクセスでおこなうことができる。 メモリアクセス時間の実測値は、書込みが 400nS 、読 ) 一 みが 410nS 、読込みと書込みの連続が 760nS であった。 連続した書込みでの帯域幅は 10. OMB / s であり 3 、連続 したコピーでの帯域幅は 5.3MB/s である。 フレームノヾッフアには、 8 ビットのプレーンマスクが ある。これは、 1 ワード ( 32 ビット ) の全体をカバーす るように 4 回複製して 32 ビット幅にして使われる。プ レーンマスクの、、 1 " のピットは、対応する書込み先ビッ トの上書きを許可するものであり、 0 のビットは、対 応する書込み先ビットの変更を禁止するものである。 れによって、 0 のビットが 1 つ以上あるプレーンマ スクをグラフィックス・リクエストが指定したときでも、 ーは読込み / 変更 / 書込みのサイクル 4 をおこなわ なくてもよい ( ハードウェア・プレーンマスクを使えば、 マスクの設定 / 書込みの 2 つの操作だけでよい ) 。 DECstation 5000 / 200CX のフレームノヾッフア・メ モリの構成は、 DECstation 3100 と同じである。ピデ オメモリは CPU とは密結合されていないので、 TUR- BOchannel の I / O バス経由でアクセスされる。フレー ムバッフアに、、ページモード " 論理回路が含まれている ので、大部分の書込みは高速である。 VRAM のあるべ ージへの最初の書込みは、通常のメモリサイクルを使用 2 訳注 : スキャンライン 1 本分は 1 , 024 x 8 ピット = 1 KB で、 1 , 024- 864 = 160 本ぶんが表示されない。 3 訳注 : 1 回のメモリアクセスで 4 ピクセルか書けるので、 4 バイトの書 込みには 400nS かかる。 1 バイトにつき 100 x 10¯9sec なので、 1 秒あたり 107 バイト = IOMB 書けることになる。 4 訳注 . : フレームバッフアに描画するときには、一ヨ殳に 1 ) 書込み先ピットを読み取って (read) 2 ) こちらの描画要求に従って変更し (modify) 3 ) それを書き戻す (write) という操作をおこなう必要がある。 UNIX MAGAZINE 1991.10 X サーパーの高速化 するので 360nS かかる。以降の同しページへの書込み は、高速ページモード・サイクルを使用するので 180nS である ( 1 つの VRAM ページの長さは、フレームバッ フアの 2 スキャンラインにあたる ) 。連続する書込み時 の帯域幅は 22MB/s である。バスには、 120nS のペー ジモード書込みをおこなう能力もある。しかし、ポード 面積の不足により、実際にはこの速度でのアクセスはサ ポートされていない。 ある VRAM ページへの最初のアクセスにおける読 込み時間は 610nS であり、ページモードでの読込みは 440nS である。読込みが遅い原因の 1 つは、最小読込み サイクルが 160nS という TURBOchanne レヾスの設計 にある。さらに、 1 ワードの読込みよりも、キャッシュ からの複数ワードの読込みに最適化されている R3000 チッフの設計にも起因する。連続したコピー時の帯域幅 は 6.0MB/s であり、 DECstation 3100 よりもわすか によいだけである。 ページモード論理回路がポード上でかなりの面積を占 めているため、プレーンマスクの論理回路を入れること はできなかった。しかし、後述するソフトウェア技術に よって、ハードウェア・プレーンマスクの必要性が少 なくなったため、ページモード・メモリアクセスのハー ドウェアのみの実装でも、ほとんどの局面で生能が向上 した。とはいえ、 DECstation 3100 より DECstation 5000 / 200CX のほうが遅い描画処理もある。 CPU の構成 DECstation 3100 は MIPS Computer System の R2000 プロセッサ [ 6 ] を 60ns ( 16.7MHz ) のクロックで 使用している。この CPU は、一般的な整数演算の場合 VAXII / 780 の 12 ~ 14 倍の速度をもつ。 DECstation 5000 は、 R3000 プロセッサを 40ns(25MHz) のクロッ クで使用している。こちらの CPU は、 VAXII / 780 の 約 20 倍の高速である。 どちらのマシンでも、 CPU はダイレクト・マップの 命令キャッシュを 64KB もっており、さらにライトス ルーでダイレクト・マップのデータキャッシュももって いる。本稿では、直前にアクセスされた小さなコードや データ・テープルがキャッシュされるものと仮定してい 77

8. UNIX MAGAZINE 1991年10月号

X サーパーの高速化 ているわけではない。グリフがきわめて小さいため、コ ンパイラはグリフ・ビットのフェッチに上交的長い時間を かけているからである。 DECstation 5000 上では、サ ーはビデオ RAM ページを頻繁に切り替えるので、 書込みの多くは高速ページモード・サイクルを利用でき ない。また、すでに述べたように、コンパイラは case 分岐に関してはあまり適切でないコードを生成する。 ーは、上記のアルゴリズムをアセンプ カラーサー ノ、 前景 リ・コードを使って実装している。アセンプリ・コードは 既存のビクセル Times-Roman()O ホイント、 75dpi) を DECstation て得たものである。サーバーと xllperf は同じマシン上 3100 上では 64 000 文字 / s 、 DECstation 5000 上では で動かし、 UNIX ソケットを使って通信した。 xllperf 91 , 000 文字 / s で描画する。また、次節で述べる改良を は、サーバーがさまざまなグラフィックスおよびウイン 施すと、 6 x 13 のフォントを DECstation 3100 上で ドウ管理リクエストを実行するために消費した時間を測 は 69 000 文字 / s 、 DECstation 5000 上では 102 000 定する。コードの実行時間測定とチューンのためにこれ 文字 / s で描画するようになる。 をおおいに利用した。 ImageText PoIyText ImageText リクエストは P01yText リクエストに似 ているが、各グリフを不透明ステイプルの手法で描画す PolyText リクエストは文字列をスクリーンに描画す る。サーバーは最初に各文字のフォント固有のグリフ る。同しフォントに属するものでも、グリフによって幅 と高さは異なる。たとえば、文字、、 : " は 2X7 のグリフ ( ビットマップ・ピクチャー ) を参照する。次に、透明ステ にマップされ、文字、、 H " は 5 x 9 のグリフにマップさ イプルの手法で一度に 1 つのグリフを描画する。グリフ れる。各グリフは、概念的にはフォント全体の高さに達 中の 1 のピットに対応する前景ピクセルを描画し、 0 に 対応する書込み先はそのままにしておく。図 10 に、、 Z " するまで 0 のピットを付加して上下に延長され、グリフ の文字コードがどのように描画されるかを示す。 間の隙間は 0 のビットによって埋められる。 ImageText は、おもに、、固定メトリック " フォントを PolyText は、 WYSIWYG ェデイタで頻繁に使われ 使用する端末工ミュレータでの利用を主眼としている。 る。これにより、ユーサーは同し行に異なる高さのフォ このようなフォント中の各グリフは、同じ幅と高さ ( た ントを混在させることができるようになる。これらの工 とえは、 6X13 のなかのグリフはすべて幅が 6 ピット、 デイタではその行のなかでもっとも背の高いフォントに 高さが 13 ビットである ) をもつ。 1 つのフォント ( 可変 合わせて文字の行の背景の矩形を描画する。そして、そ ピッチのものも含む ) しか使えないテキスト・ウインド の背景の上に PolyText で文字を描画する。 ウでも、 ImageText を使用する。 ImageText は、フォ 上記の透明ステイプルの手法を用い、 C 言語による ント中のすべてのグリフを自動的に同し高さに拡大する p 。 lyText の実装をおこなうと、可変ピッチ・フォントの からである。 Times-Roman()0 ポイント、 75dpi) を DECstation ImageText を実装するもっとも簡単な方法は、背景 3100 上では 31 , 000 文字 / s 、 DECstation 5000 上で の矩形をクリアしてから PolyText コードを用いて則景 は 57 , 000 文字 / s で描画する。また、幅と高さを 6X13 ピクセルを描画することである。この単純な手法は驚く に固定したフォントの場合は、 DECstation 3100 では ーはすべての可 38 000 文字 / s 、 DECstation 5000 上では 46 000 文 ほどうまくいく。そして、カラーサー 変ピッチ・フォントをこの方法で描画する。これらのフォ 字 /s になる。 ントにおいて背景と前景を同時に描画するのは難しい。 これらの数値は素晴らしいものであるが、限界を示し 、、 Z " を描画する PolyText 図 10 グリフ・ビットマップ 画面 文字 ロ■ロロ ロロ■ロ ロ■ロロ ロロ■ロ 000 0 00 000 住 0000 ■ ■ 89 UNIX MAGAZINE 1991.10

9. UNIX MAGAZINE 1991年10月号

X サーパーの高速化 表 4 CopyArea と類似の縮約されたグラフィックス関数 X11 関数 C lear And AndReverse Copy AndInverted NoOp Xor Or Nor Equiv lnvert OrReversed Copylnverted OrInverted Nand Set D Cgeneral D Cgeneral D Cgeneral DCcopy D Cgeneral D Cxor D Cxor D Cgeneral D Cgeneral DCxor DCxor D Cgeneral DCgeneral D Cgeneral D Cgeneral D Cgeneral 表 5 4 つの CopyArea 関数の定義 Copy 関数 DCcopy DCcopySPM DCxor DCgeneral 定義 XOR ((src AND andbits2) XOR xorbits2) (dst AND ((src AND andbitsl) XOR xorbitsl)) dst XOR ((src AND andbitsl) XOR xorbitsl)) (dst AND xorbitsl) XOR (src AND andbits2) xorbits2 を計算する。次に、一般化された塗潰し関数で 使用するために fgandbits と fgxorbits を則景ピクセル から導出する。そして同様に、 bgandbits と bgxorbits を背景ピクセルから導出する。これらの値は 4 個になる まで複製して 32 ピット幅 ( ワード蝠 ) に増やし、サー バーがスパンの内部を一度に 4 ピクセル ( 1 ワード ) す つ描画できるようにする。 一般化された塗潰し関数を使用する各ソース・ファイ ルは、 3 通りにコンパイルし、一般化されたコピー関数 を使用する各ソースは 4 通りにコンパイルした。ソース コードは、一般化された塗潰し関数やコピー関数を、つ ねに C 言語のマクロ関数を使って、、呼び出す " 。 Make- file は、実際に導出されたグラフィックス関数のうちの 適当なものに制御を渡す。関数がそのパラメータの一部 分しか使わない場合、使われないパラメータは C プリ プロセッサによって出力されたコードから参照されるこ とはない。したがって、描画ルーチンが DFcopy のよ うな関数のためにコンパイルされた場合には、そのルー UNIX MAGAZINE 1991.10 チンは書込み先ピクセルや andbits を参照しない。 X には、ソリッド、不透明ステイプル、透明スティフ ル、タイルの 4 つの塗潰しスタイルがある。本節ではこ れらの塗潰しスタイルと、これらを効率よく描画する手 法について述べる。どの塗潰しスタイルについても 1 つ のスパンの扱いしか記していないが、実際には形状は任 意の数のスパンからなる。なお、、、マージする " という 語は、、グラフィックス関数を読込み元ピクセルと書込み 先ピクセルに適用し、プレーンマスクを使用して結果を 書込み先ピクセルに書き込む " という意味で使う。 ソリッド塗潰し ソリッド塗潰し (SoIid FiII) スタイルはもっとも単純 である。サーバーは、指定されたグラフィックス関数を 用いて前景ピクセルを書込み先ピクセルにマージする。 塗潰しの最適化 83

10. UNIX MAGAZINE 1991年10月号

X サー ハーの高速化 図 4 ソリッド塗潰し描画コード Pixe18 int Pixe132 *pdst ; width , raggedLeftBytes ; fgandbits, fgxorbits ; / * Paint ragged left edge * / CFBFILLLEFT(pdst , fgandbits , fgxorbits) ; ー = raggedLeftBytes ; width pdst + = raggedLeftBytes ; / * paint full words until 1 ー 4 pixels left * / while (width > 4 ) do { CFBFILL ( ( Pixe132 *)pdst, fgandbits, fgxorbits) ; width pdst + = 4 ; / * Paint ragged right edge * / CFBFILLRIGHT (pdst + width—l , fgandbits , fgxorbits) ; 表 6 不透明スティカレの前景 / 背景マッピング・テーカレ グリフ・ビット 0000 0001 0010 1110 1111 andbits bga bga bga bga bga bga bga fga bga bga fga bga fga fga fga bga fga fga fga fga xorbits bgx bgx bgx bgx bgx bgx bgx f gx bgx bgx fgx bgx fgx fgx fgx bgx fgx fgx fgx fgx 表 6 に示すように fgandbits 、 fgxorbits 、 bgandbits 、 UNIX MAGAZINE 1991.10 塗り潰すときには、サーバーがもっている専用描画ルー アプリケーションが矩形などの図形をステイプルで だけをフェッチすることに注意 ) 。 うなグラフィックス関数は、 andbits を使わす xorbits トをフェッチするような命令は含まない ( DFC 叩 y のよ プのオーバーヘッドを含んでいるが、ステイプル・ヒ、ツ 令にまで描画時間を減らすことができる。これにはルー ラフィックス関数による描画は、 4 ピクセルにつき 5.5 命 をおこなうループに展開する。これにより、 DFCopy7 データをもっている場合、同時に 4 ピクセルすつの描画 サーバーが 32 ビット以上の描画すべきスティフル・ する 4 ピクセルに対応する。 工ントリは、適切な背景または前景ビットからなる連続 の bgandbits を表し、はかも同様である。各 32 ビット bgxorbits からなる。 bga は 8 ピット ( ピクセルの深さ ) チンに都合のよい大きさのパターンを使うことがよくあ る。とくに、サーバーは 32 ビット幅のステイプルをき わめて効率よく描画する ( サーバーは 2 、 4 、 8 、または 16 ビット幅のステイプルを複製し、 32 ピットの描画 コードを使うようにする ) 。サーバーがスパンを描画す るとき、スティフル・ピットをスパンの始まりに合わせ るように適当に回転 (rotate) し、 32 ピクセルの全体を 通じてこのステイプル・ピットを再利用する。 このような最適化により、 DECstation 3100 のメモ リ帯域幅は飽和するが、 DECstation 5000 では飽和し ない。スパンが十分に広い場合には、 4 つのピクセルに ついて同時に andbits と xorbits を参照し、このデータ を 32 バイト間隔で描画するほうが速い。 DECstation 5000 では、この 4 ピクセルのグループが 3 回以ーヒ繰り 返されないと、メモリの帯域幅は飽和しない 17 。 不揃いな左端において、サー ーは Store Word Right 命令を使用する。右端では Store Word Left 命 令を使用する前に、レジスタにあるソースデータを最上 位バイトへシフトする。 17 訳注 : 96 ピクセル、つまり 32 ピクセルが 3 つ以上続く場合には、 32 ピクセルごとに同しデータカ俵れることを利用した描画をおこな う ( ーヨ殳に、ステイプルの蝠は 32 ピクセルの約数であることが多い。 そのため、多くの場合、 32 ピクセルごとに同じ値になる ) 。この場 合、 32 ピクセルごとに 4 ピクセルすつまとめて同しデータて描画す る。 85