JU N T 便り 今月は、、 JUNET ハッカー列伝〃の第 4 回目として、ネ ットワークに詳しい尾上淳さんを紹介します。 ・ JUNET ハッカー列伝 ( 4 ) 尾上淳さん@ ソニ みるく 用のメールシステム設定ファイル sendmail.cf は尾上さ また、 WIDE プロジェクトでも活躍されていて、 WIDE もあります。 多かったのですが、去も丘は尾上さんのはうが多いという声 名です。以前は齊藤明紀さん ( 大阪大学 ) のフォローの数が に関する話題へのフォローが素早くてしかも詳しいので有 尾上さんは、 JUNET 上ではメールやニュースシステム 尾上 . 東京生まれの東京育ちです。 生まれはどちらですか ? みるく : それでは恒例の質間から始めたいと思います。お んが作ったそうです。 みるく : コンピュータに関して、何かエピソードがあれば る管理者業を始めて 2 年ほどです。 尾上 . ノ、ツカーになるかどうかは分かりませんが、いわゆ いですか ? みるく : 意外に短いのですね。ではハッカー歴はどのくら ょっとです。 たが、、、歴〃というと研究室に入ってからですから、 3 年ち 尾上大学 3 年のときに授業で ls とⅵと lpr は使いまし みるく : なるほど。では、 UN IX 歴はどのくらいですか ? いたようなものです。 で、ほとんど追加したハードを扱うためのソフトを書いて かといえばハードウェアのほうに未をもっていましたの っていたように記憶しています。でも、そのころはどちら のカスタマイズをしようとして 6809 のアセンプラをいし 立たなかったのですが・・・・・・。それからしは・らくは、 BASIC を触ったのが始めですね。結局、絵を描くのにめげて役に 尾上 . 高校 3 年のときに文化祭で使おうといって、 BASIC みるく : コンピュータとの出会いはいつごろでしようか ? 教えてください。 108 尾上 : C について 3 日間先輩に教えてもらって、最初に書 かされたのが shell もどきでした。今にして思えは、そのこ ろ砂原秀樹さん ( 現・電気通信大学 ) に質間にいったのがハ マるきっかけだったんでしよう。 みるく : ところで、尾ーヒさんのフォローやリプライは素早 くて詳しいと定評があるんですが、 1 日にどのくらいニュ ースやメールの読み書きをしているのでしようか。 尾上 . うーん、素早いかすごく遅いかどっちかですね : ー ) メールはだいたい 1 日平均 200 通くらいでしよう。リプラ イは 10 通あまりかな。遅筆 ( ? ) なもんで、あまり書けない んです。 みるく : まるで、ニュースやメールを読むのが仕事とみな されているようですが : ー ) 本来のお仕事は何ですか ? 尾上 . コンピュータ・ネットワークに関することならなん でも、と思っています。 みるく : そういえは、 WIDE プロジェクトで共同研究され なお、現在の参加手続きは以前とは変わっているそうな 組織もあるとのことです。 そうです。なかには正しい手順を踏まないで申請してくる ところには JUNET への参加申請がかなり溜まっている ところで話は変わりますが、現在 junet-admin の方の みるく : どうもありがとうございました。 ろですが・・ とも、どうなるのが、、よい〃のかという解釈は難しいとこ のになるか〃という意識をもっていてほしいですね。もっ を利用するだけではなく、全員が、、どうしたらよりよいも ットワークではないと思います。現在提供されている環境 の意味もあることは否定しませんが、そのための連絡用ネ 尾上 . 今の JUNET に情報収集源あるいは社交場として について何か一言お願いします。 みるく : なかなか大変そうですね。では、最後に JUNET ろです。 やらなければ分からないというジレンマに陥っているとこ 田います。そのためには、いわゆる雑用を実際にいろいろ が、いかに簡単に管理できるかを考えていくのが大切だと も雑用が増えるような気がします。 JUNET でも同しです 尾上 : 研究の規模が大きくなってくるにつれて、どうして トについてなにか話していただけませんか。 ているそうですが、さしつかえなけれは、このプロジェク UNIX MAGAZINE 1990.9
連載 22 ワークステーションのおと 坂下 あるらしいので 1 、手伝いをしました。そのときのこと しがありました。私は荷物の梱包や搬入、搬出に才覚が 先日、 jus ( 日本 UNIX ューザ会 ) の事務所の引っ越 引っ越しとサランラップ ss: あれ、これって箱あれへんの ? jus: うん、お願し、 ss: 計算機の梱包しましよか。 てす。 84 ードウェアの設置”の章を読んでください。 1 1990 年 5 月号「ネットワーク時代のワークステーション管理」の jus : ほんまに。ありがとう。 ss: 計算機の梱包はだいたし、できましたけど。 テーフ。で箱を叩く音だったので どの「ガンガン、バシ、ノくシ」というのは、このガム の形がしやっきりとして収まりがよくなります。さきほ テーフ。で箱の角の近くを叩し、てやるのてす。すると、箱 こで、ふたを閉じるときに、あまり使っていないガム 前に折っておいてもいいのてすが、めんどうでそ ゃんと折をつけてやらなくてはいけません。組み立てる たがきちんとしまらないことがあります。てすから、ち 新しい段ボール箱は、折がまだついていないので、ふ Jus: ガンガン、ノくシ、ノくシ ! ss: うん。 jus: ちょっと、ガムテーフ。力、して。 まらへんねん。 くれへんかな。むりやり入れてるから、ちゃんとし ss : あの、ちょっといい ? ちょっと、箱のふたを押えて ( 箱に計算機をつめる ) ss : はいはい。ええと・・ jus: そうなの。この段ボール組み立てて使ってくれる ? 秀 ss: ほかになんかありますか ? sea あ、 ss ちゃん、ちょっとそー のサランラッフ町乂っ てくれる ? ss: はいはい、これで・翔 sea: ありがとう。 ss : あのお・・・・・・でも、なんでこんなときに、 フ。がいるんて一茆か ? sea : う使うのよ。 ss&jus : おお ! ーナランラッ さて問題てす。このサランラッフ。、いったい何に使っ たのでしようか ? 答は、 1. 食器を包んた。 2. 抽出しの小物入れを包んた。 で茆。 そこでサランラッフ。の登場です。これらの小物は、ふ 入れないと運んでいる最中にばらけてしまいます。 えません。箱に入れようにも収まりが悪いし、きちんと ンやホッチキス、糊、クリッフ。などの小物が始末にお いとしても、一番上の抽出しに入っている、ポールペ るのは、机の抽出しの中身の処理です。書類はまあい 次は抽出しです。引っ越しの際に意外と手数がかか です牙 越し先で洗う手間が省けます。なかなかのアイディア こで、新聞紙でくるむ前にラッフ。で包んでおけば引っ もたいへんなのですから、これではめんどうです。そ あと、全部洗わなくてはし、けません。引っ越したけで れますれということは、引っ越し先で食器を出した ないように新聞紙などでくるんでから段ボール箱に入 最初の食器ですが、ふつう引っ越しのときには、割れ つうトレイに入れていますれ ラッフ。で巻いてしまうのです。 このトレイごとサラン こうすればもう安心で UNIX MAGAZINE 1990.9
連載 C ADVISOR 丘 om UNIX REVIEIW Eric Allman 仮想記憶の話 PDP-II 時代の UNIX 話は旧聞に属するが、 PDP-II 時代の UNIX には仮想 メモリなど備わっていなかった。もっとも、当時はほとん どのマシンが仮想メモリなど必要としていなかった。プロ セッサには 16bit のアドレス空間があるだけで、 UNIX 型 システムにとってはセグメンテーション・レジスタでゲー ムをするなんてとんでもないことだったので ( 初期のパソ コンとは事情が異なり、プロセス間の機密保持という点で そう信しられていた ) 、メモリの限界はきっちり 64KB と 決められていた。 当時、 UNIX のコンテクスト・スイッチングは次のよう にしていた。ます、新しいプロセスがメモリ - にロードされ ているかどうかを確かめる。メモリにあれは・、メモリ管理 レジスタをロードして新しいプロセスを指すようにし、実 行を継続する。メモリになけれは、システムはます新しい プロセスのために空間を捜さねはならないのだが、通常こ れはメモリから別のプロセスをはしき出すことを意味した。 これは、、オール・オア・ナッシング手法〃とでもいうやり 方だ。それだけでは役立たないつまらぬ、つまり使われな いプロセスの一部を追い出すのではなく、プロセス全体を 追い出すのだ。これには、プロセスのセグメントをすべて ディスクに書き込むということも含まれている ( 実際には、 、、真のテクスト〃をもっプロセスはもうちょっと簡単だ。真 のテクストであるプロセスは、自分自身のコードを修正し ないことになっている。つまりテキストはけして変更され ないので、プロセスをスワップアウトするときにディスク に書き出す必要がないということだ ) 。新しいプロセスのた めに空間か確保されると、それをメモリに読み込むことが できる。小さいプロセスなら、一度に複数個がメモリに共 100 存できる ( かって、 UNIX は小型でこしんまりとしたシス テムとして知られていたことを思い出してはしい ) 。たとえ は、シェルと cat と ed くらいなら物理メモリに共存でき るだろう。 真性 UNIX ハッカーのあなたなら上に述べたことにい くっか不正確な部分があると指摘されるかもしれないが、 基本となるアルゴリズムはここでの目的にかなっているし、 根本的な誤りがあるわけではないので委細かまわす先に進 むことにする。 そして VAX 登場 もちろん、 UNIX 世界のすべてがつねに夢と光に満ちあ ふれていたわけではなかった。 VAX が誕生したとき、その 32bit のアドレス空間は夢のように思えたものだ。だが、残 念なことに VAX にはしめて移植された UNIX 32 / V は 依然スワップペースのシステムだった。つまり、プロセス の切替え時には基本的に上で述べたのと同し方法を使って いたのだ。プロセスが 64KB ならば、完全なイメージをデ イスクに書き込むのもうなすける。ところがプロセスが何 MB もあるときは、ディスクに書き込むのにとても時間が かかる。いすれにしても、 32bit のアドレス空間がフルに使 われることはなかったのである。というのは、ハードウェ アが実際にはそんな膨大な物理メモリをサポートしていな かったので、たとえお金があったとしても実現不可能だっ たのだ ( ちなみに、メモリを 256KB 増設するごとに数千ド ルかかった ) 。 仮想メモリをサポートする必要が出てきた最大の要因は、 デマンドベージングだ。これは、簡単にいうとプロセスが スタートするときにそのすべてをメモリにコピーするので はなく、いくっかのページが欠けたままで走らせてしまお UNIX MAGAZINE 1990.9
連載 An lntroduction tO X Window System ー朝 144 R3 の twm 4 誰です、すぐに LI + A などに指が伸びる人は ? R4 の相違をまとめておきますので参考にしてください。 っておくのは有益かと思います。次ページの表 1 に R3 と 合わせるのもシャクですが、どの部分が拡張されたかを知 R4 では機能がかなり拡張されていますから低いはうに うが簡単で便利です。 のはうが使いよいので、すべての . twmrc を同しにしたほ もあります。一方、 X を操作する側からいえば 1 つの環境 ンが混在している場合、なかには R3 のものカ鯤ざること 方もおられると思います。また、各社のワークステーショ めでした。読者のなかにも R3 の twm をまだ使っている りで作った . twmrc を R3 の twm で使おうとしていたた 冒頭で紹介した私の失敗ですが、しつは R4 対応のつも れた各社の X にも含まれることが多かったようです。 ことから、 core 部分ではなかったものの製品として提供さ メタキーに指を触れすに基本的なウインドウ操作ができる R3 で主役だった uwm に比べると、派手なタイトル表示と はユーサー構築ソフトウェアとして配布されていました。 さて R4 から主役の座に躍り出た twm ですが、 R3 まで にリソースやオプションを設定するのがコツでしよう。 オントをもっている場合はできるだけこれを利用するよう ーを充実すればよいのですが、 X 端末が ROM 化されたフ ロードです。これを根本的に解決するにはフォントサー 結局、 X 端末で発生する多くの問題はフォントのダウン してみてください ) 。 ますから、これを活用してうまく切り抜けるなどの努力は TELNET などによるリモートログイン端末機能があり ることが少ないので気楽です 4 ( でも、多くの X 端末には、 ったり、思わすリセットしてしまっても他人に迷惑をかけ ります。また、なにか変な状態に陥って電源スイッチを切 理も簡単、壊れたら取り替えるだけと捨てがたい魅力があ とはいっても、 X 端末には手頃で何より静かで小型、管 ( それでもなおかっ便利です ) 教訓その 4 : それでもやつばり猫が好き では問題となる場合があります。 パイラは一般に提供されませんので、形式の違うもの同士 uwm を愛する方へ 残念ながら主役を退いた uwm ですが、あの慎ましい姿 が好きだというューザーもいらっしやるかと思います。た とえば、タイトノレヾーはたしかに twm の長所ですが、多く のウインドウをディスプレイ上に表示しているときにはい たすらに場所を寒いでいるようにも思えますし、いざウィ ンドウの操作をしようと思ったときにタイトルバーが別の ウインドウの下にあったりしてけっこう面倒に感しること もあります。 R4 の twm では、 uwm などはかのウインド ウ・マネージャーの特徴を採り入れて多少とも便利になっ てきています。そこで、ここでは . twmrc の言当のヒントを 述べてみたいと思います。 ます、、究極 ! twm を uwm 的に使う方法〃をお教えしま しよう ( 末尾のリスト 2 参照 ) 。ポイントは、 NoTitIe をす べてのウインドウに適用してタイトルバーを付けないよう にするところです。さらに NoIconManagers を設定し て、アイコン・マネージャーも表示させないようにします。 uwm では、マウスをすこし移動するとはしめて機能する delta 機能がありました。 twm には delta はありません が、これに代わる機能として f. deltastop があります。 れはユーザー定義機能の記述のなかで用いて、変数値 DeItaMove を超える移動があった場合、この記述以降の 実行をとりやめるものです。ですから論理的には delta と は逆になりますが、これを用いたユーサー定義関数を用意 することで似た操作環境を構築できます 5 。 NoTitIe では、 { } にウインドウ名のリストをつけて特 定のウインドウだけタイトルバーを付けないよう孑バでき ます。さらに、リストを付けすにすべてタイトルバーなし にしておき、逆の指定ーー MakeTitle と対象ウインドウ のリストによって特定のウインドウにかぎってタイトルバ ーを付けるようにするのも一案でしよう。そこまでして uwm ふうにして使わなくても、と思う方もいらっしやる かもしれません。もうちょっと小さければタイトルバ 捨てがたいという場合には、 SqueezeTitle 指定の利用を お勧めします。 SqueezeTitIe は、タイトルバーを小さくし て、あたかもウインドウにしおりを挟んだような表示とな 5 f. deltastop の利用に際しては、ユーザー定義機能の記述中、これにさきだって 移動やリサイズなどのマウス移動を利用する機能が実行されてはしめて有効 となる点にも注意してください。 UNIX MAGAZINE 1990.9
連載 , ℃ ADVISOR ⑩ イト列のコピーは避けられたが、全体の効率は変わらない。 copy-on-write と呼はれるテクニックを使えば、書込 みも速くできる。簡単にいうと、カーネルが直前のデータ をディスクにコピーする前にそのページに書き込もうとし ないかぎり、メモリ上のページはコピーされないのだ。書 き込む則にカーネルがページのコピーを終えていれば、ま ったくコピーせすにすむ。システムは、カーネルがページ のコピーを終了するまで、メモリ管理ハードウェアにその ページは書き込めないというマークをしておく。そのあい だにプロセスが同しページに再書込みしようとすると、 ードウェアはフォールトを出してそのデータがコピーされ、 あたかもすっと自分自身のコピーをもっていたかのように 処理を継続できる。プログラムでダブル・バッファリング というテクニック ( 2 つの出力バッファ間での切替え ) を 使っていれは、はとんどっねにカーネルが使用するものと は異なるバッフアに書き込むことになり、考えうる最咼の パフォーマンスが得られる。 ちょっと話は逸れるかもしれないが、初期の VAX ハー ドウェアには copy-on-write を不可能にする、、機能〃 ( つ まりはバグ ) があった。 3 BSD に導入されたシステムコー ル vfork は、この問題を回避するための意図的かっ巧妙な 手段だった。 copy-on-write が可能なら、新しいシステム コールを追加しなくてもはば同等のパフォーマンスが得ら れる。オリジナルの vfork のマニュアルページに「 fork が copy-on-write と同等の機構で実装されていれは、 ( この システムコールは ) 不要だったかもしれない。現在のシステ ムはこのような機構をサポートしていないので、 vfork が 必要となった」という訓戒が含まれている所以である。 もちろん、これらのトリックはバッフアがページ境界に 位置調整されており、かっぺージサイズの偶数倍である ( す なわち、バッフアの最後からのはみ出しがない ) 場合にかぎ って機能する。ページの大きさが 512 バイトであることを 前提にしてはならない。さまざまな大きさがあるのだ。こ れまでにも、 128 バイトから 16KB のものまでを見たこと がある。 BSD べースのシステムには getpagesize という システムコールがあり、システムのメモリ管理に使われて いるべージサイズを教えてくれるようになっている。ディ スクファイルがつねにシステムメモリと同し大きさの単位 で割り当てられているとはかぎらないので、個々のファイ ルに対して stat や fstat システムコールを使いたくなる こともあるだろう。 BSD システムでは、結果として得られ UNIX MAGAZINE 1990.9 る構造体 stat の st-blksize フィールドに最適なプロッ クサイズがある。 BSD では、もうすこし暮らしやすくするためにこれら のヒントを入出力や malloc など、お馴染みのルーチンの 多くに活かし、バッフアを適切に位置調整してパフォーマ ンスを高めるようにしている。このようなカーネルとユー サー・プロセス間の協調関係は UNIX の、、バイトストリー ム〃モデルを妨けすに、比較的痛みの少ない方法でパフォ ーマンスの改善を図るものだ。 malloc での位置調整ができないのであれば、自分自身 でしなけれはならない。さきほどの例の Cache のように たくさんのバッフアを割り当てる場合、もっとも簡単な方 法はバッフアをもう 1 っ余分に割り当てて自分自身でポイ ンタ位置を正しく調整することだ。たとえば、次のような コードになる。 char ・ *bp ; bp = m 訌 10C ( (MAXCACHE + 1 ) * BUFSIÆ) ; if ()p = = NULL) bp = ()p + BUFSIZE ー 1 ) & ~ ( B S 工ー 1 ) ; BUFSIZE が 512 だとすると、これによってもっとも近 い 512 バイト境界に四捨五入される。 グラムは OS と共存しているのだ。システムを理解し、 結び付いた全体像を理解することに通しる。あなたのプロ てきた。でも優れた C コードを書くことは、つねに緊密に 私は、今回のコラムを C にまったく触れすに書こうとし なんと申しますか なときは、これらをシステムにまかせてしまうのだ。その サイズなどについて先入主を抱いてはならない。そのよう 真にポータブルなコードを書こうとするときには、ページ は、それがローカルシステムに対して最適化しうることだ。 システムのライプラリ・ルーチンを使用する利点の 1 っ ければ。 っても益のあることだ。システムを、、よき隣人〃と考えな れと協調していくことは、システムにとってもあなたにと UNIX REVIEW 1990 年 6 月号より 「 VirtuaIly Memory 」 はうが、すっと楽もできるしね。 103
マジカノレ・ミステリー ものを親と呼びます。 ・ツアーいたしましょ とめて書いてあるのがクラス ( クラス定義というほうが正 確 ) です。前回のクロージャーを作る関数 make ー stack は、クラス定義とインスタンス生成用のオプジェクトを兼 ねたものといえます。 そして、インスタンスを作るときはそのクラス定義を見 てインスタンス変数の領域を取り、手続きたちを指すよう なポインタをインスタンス変数のそはに入れておきます。 渟通はこうして作られたインスタンスのホインタが返され るので、それを変数に保持して使うことになります。 つまり、 C の static 変数の感覚とは違い、手続きとデー タの実体が分離しているので手続きのコピーが起きること インヘリタンス は絶対にありません。 106 なったクラスたちをスーパークラス、すぐ上の関係にある ころだけを書くようにします。インヘリタンスすることに リタンスするように指定し、あとはそのクラスと異なると クラスを定義するときには一番近そうなクラスをインへ けられたのではないようです。あしからす ) 。 があります ( あっ、インヘリタンスは実用性のためだけに設 なので、インヘリタンス (inheritance : 継承 ) というもの ールという考えはありません。でもそのままでは非実用的 ピュアなオプジェクト指向言語では、サプルーチン・コ ラミングするのが渟通のようです ) 。 どのオプジェクト指向拡張版はそういうスタイルでプログ よいという考えもありますし、ムも匠の C 、 PascaI 、 Lisp な メソッドから手続きや関数をサプルーチン・コールすれは 共有できます ( もちろん、クロージャーで遊んだ Lisp なら 逆に、普通の手続き型言語ではサプルーチンで手続きを もコードをコピーしないわけにはいきません。 有することはできませんでした。したがって、同しもので 手続きは完全に独立しており、複数のクラスで手続きを共 しかし、前回のクロージャーの例などではクラスごとの まいます。 りません〃という経済的な長所と正反対の矢可斤になってし さきほど述べた、、手続きのコピーが起きることは絶対にあ なメソッドのコピーだらけになってしまいます。これは、 らの手続き ( メソッド ) を共有できないとしたら、同しよう きを考えてみましよう。似たものがたくさんあるのにそれ 今度は話を変えて、似たようなクラスがいつばいあると こういうふうに、インヘリタンスを利用して目的のクラ スと一番近そうなクラスを親に指定し、そのクラスと違う メソッドだけ書き足したり書き直したりするやり方を、デ イファレンシャル・プログラミング ( 差分プログラミング ) というおしゃれな名前で呼んだりします。なんのことはな い、似ているサプルーチンをコピーして書き直すようなこ とは、だれだって日頃からやっていますね : ー ) でも Machintosh の C などでこれをいい加減にやっていると、 コードがやたらとコピーされて、無駄なコードは増えるわ、 保守性は悪くなるわで非オプジェクト指向言語の限界を田 うことしきりです。 機械に即したメソッドの探し方 インヘリタンスまで出てきましたが、現実の機械はうま くメソッドを探せるのでしようか ? クラス定義のなかに親のクラスへのポインタをもては、 たいしたことはないですね。メソッドサーチをするときは、 ます最初にメッセージを受け取ったオプジェクトのクラス のなかを捜しにれは、前回のクロージャーが cond で捜し まわっていたとおりです ) 、それで見つからなけれは親のク ラスのなかを捜し、それでなけれは・さらにその親のクラス を捜し、最後までインヘリタンスをたどって見つからなけ れはエラーになるということです。 恐るべし、オプジェクト指向 どうでしよう、最初の例、℃でオプジェクト指向ごっこ〃 の雰囲気は伝わったでしようか ? C でもあのやり方を使って難しい問題がけっこう書きや すくなるのですが ( たんに頭のなかが整理しやすくなって いるだけだともいえます ) 、手続きがデータのポインタを取 り出し、それで指されているデータを操作しているという 感しはどうしても隠せません。 それに対して、オプジェクト指向はデータのなかから手 続きを指していますから、データに向かってメッセージを 投げるとデータが手続きを捜して自分で加工されにいくと いう感覚です。 やはり、本物のオプジェクト指向言語にはかなわないで すね : ー ) UNIX MAGAZINE 1990.9
連載 / 0 ADVISOR ⑩ うというものだ。実行中のプロセスがメモリにないページ を実際に使う必要が生しると、ハードウェアがページフォ ールトーーーすなわちそのページをメモリにもっていくよう に OS に要求する。そのページが使用可能になると、プロ セスの実行か羅続される。 1 つのプロセスのすべてのペー ジがメモリに同時に存在する必要はないので、プロセスに 対して実際の物理メモリよりも大きなアドレス空間を割り 当てることができる。そもそも、、仮想〃メモリという呼び 方は、実際にはそこにはないメモリが使えるというところ からきている。 もちろん、マシンがプロセスを 1 べージすっ運び込んで いるときにたまたまメモリを使い尽くしてしまうこともあ るだろうし、プロセス全体をいちどにスワップアウトした くはないと思うかもしれない。とくに大規模なプロセスが 含まれているときは、おそらくそのほとんどのページは、、汚 されてクいないーーっまり、最後にディスクに書き込まれ てから変更されていないはすだ。 MMU(Memory Man- agement Unit ) は各ページに対応する、、ダーティビット〃 をもっている。このビットは、対応するべージに書き込ま れるとセットされる。クリーンなページは、使ったメモリ が再利用されるまでディスクに書き込む必要はないという わけだ。 こうなると、そのページがディスクから読み込まれたと きにセットされる、、使用中ピッドなんていうものも使い たくなるにちがいない。これは、プロセスのワーキングセ ット、つまりある時点で使われているべージの集合を決定 するのにも利用できる。プロセスのワーキングセットがあ らかしめ分かっていれは、大量のページフォルトを避けら れるのだ。 しかし、 VMS(DEC 製の VAX 用 OS ) の開発者たちは こんなものを必要だとは感しなかったらしく、このビット ードウェアに組み込まれていない。代わりに、ダーテ イビットは VAX 上のソフトウェアでシミュレートされ た。プロセスのワーキングセットが分かっていれば、カー ネルがあるプロセスを追い出さなけれはならなくなったと きに正しい決定を下すことができる。とくに、実行可能状 態になっているプロセスのワーキングセットからべージを 削除するのを回避できるのだ。 繰り返すが、この解説では細かくはあっても重要な事項 のいくつかをあえて無視しているが、アルゴリズムは正し UNIX MAGAZINE 1990.9 いはすだ。 だからどうしたって ? それしゃあ、そんなことがこのコラムでなんの役に立つ のかだって ? 賢明な読者の方々ならもうお分かりだろう。 仮想メモリ・サプシステムがどのように働くかを知ってい れは、効率のよいプログラムを書くための知識が得られる のだ。もちろん、小さいプログラムではどんなへマをしよ うがあまり問題にならないが、大規模にメモリを使用する プログラムを書くときには、こうした細かい点に注意を払 えはきわめて性能のよいプログラムを作れる。いつものよ うに、この原理を反例を使って解説してみることにしよう。 この例は、私の空想上の作りごとである。 我々が、、データベース〃と呼ぶ類の多数のアプリケーシ ョンは、なんらかのかたちでキャッシュを実現している。 これらのアルゴリズムは、往々にして仮想メモリ・サプシ ステムで使われるアルゴリズムに似たものになる。プログ ラムの実行能を改善するために、頻繁に使うディスクプ ロックをメモリ上にコピーしてもっていたりするのだ。と くに遅いメディア、たとえば別のマシンへのネットワーク 接続とかキャパは高いが実行性能は比較的悪い新技術のデ イスク ( SCSI のことがいいたいのかな ? ) などを使用する 場合、これはたいへん重要になる。アプリケーションが、 、、参照の局所性〃ーーすなわちごく短時間の間隔で物理的に 近接しているデータ要素を参照するという特性をもつな ら、キャッシュはとくに重要になってくる。最初は参照の 局所性などおかしいと感しるかもしれないが、実際には頻 繁にお目にかかる。本を読んでいるときなど、別のページ に移る前にまわりの文章を読む ( 隣接する文章を読む ) し ゃないか。これは、、、ランダムアクセス〃をする百科辞典の ような本にもあてはまる。つまり、最初の検索はランダム アクセスだが、べージを繰る前にそのページの文章をいく つか読むからだ。同しことがディスクファイルやデータベ ースなどにもいえる。 同様に、 UNIX 型ファイルシステムにアクセスする場 合、ルートディレクトリ (/) や /bins/usr/bin などすべて のユーサーが使用するいくっかのディレクトリは頻繁にア クセスされる。だから、これらのディレクトリに対応する ページをメモリ上に保持しておくのがうまいやり方になる。 キャッシュを実現しようとすると、たいていは仮想メモ リが扱わなければならなかったのと同し旧い問題を抱える 101
ワークステーションのおと一 カタログ aya : あら ss ちゃん、あのときはどうも。 ss: いえいえ。でね、あのあと、もうちょっと調べてみ たのよ。 aya: ふんふん。 ss : そしたら foreach が・・ " ・・ aya : ほんまに ! そういえば、 C シルで @ てあるや ss: あの計算するやっ才第 aya: そうそう。あの式のなかでね、機種というか、 C シェルによっては数字が入った変数名を使うとへん になるみたいなの。 ss: うそやろ ! ? たとえば、日立の DK515C -78 / DK515-78 という ードディスクのカタログを見てみましよう ( 表 1 ) 。 その「おもなとくちょう」という欄には、 ・小形・軽量・大容量 5 インチフルハイトサイズで 780M 六イトの大容 ・高速転送 2.4M スイト / 秒 ( SCSI 仕様は最大 4M スイト / 秒 ) 高速データ転送。平均シークタイムも 16ms と高速。 ・低消費電力 ・ ESDI/SCSI 標準インターフェイス ・高信頼性 などと書いてあります。これを読むと、 1. 5 インチて、何の大きさ。 2. フルハイトというからには、もしかしたらハーフサ イズとかもあるのかしらん。 3. 4M イト / 秒の高速転送というのは速いの ? それ とも遅いの ? 4. シークタイムって、もしかしてあの UNIX の lseek と関係があるのかな。 5. ESDI と SCSI は、どこがどう違うのでしよう。 のような疑問が生します。 でも、いきなり SCSI がどうの、データ転送速度が どうのという解説をはしめても、いまひとつヒ。ンときま せんれそこで、カタログの面白そうなところを拾い読 みしてみましよう。 型名 DK515 というシリーズには、ホストとのインター フェイスの違いによって 2 つのモデルーー DK515C- 78 と DK515-78 とがあるようて一。 DK515C -78 は SCSI インターフェイス、 DK515 ー 78 は ESDI イン ターフェイスです。 この型名の英数字には、たぶん次のような意味があ ります。 こまでくると、もう何が何やら・・・・・・。みなさん、手 午の C シェルで次の式を実行してみてください。 csh% set x=2 csh% set xl = 5 csh% x = 2 csh% @ xl 2 @ : Syntax error . csh% となる力、もしれません。 @ の左辺に数字を含んだ変数が あるとおかしくなる C シェルがあるようです。不思議 ですれ それ力、らもうひとつ、 @ 式のなかの変数名の最大長 はいくらなのでしようか ? 疲れてしまったので、これ は読者の皆さんへの宿題としましよう。 ハードティスク 最近、読者の方から、 ・ SCSI のハードディスクって簡単に接続できるんで すか ? ードディスクを安く買えるところはありますか ? ノ、一ドディスク という質問をいたたきました。そこで、 とその接続について、すこし詳しく書いておくことにし ましよう。 ニ = ロ ノ、 87 UNIX MAGAZINE 1990.9
連載 / てくてく が実行されるようにします。画面例と説明文とのあいオ 18 が実行され、 \end{maildesc} でよ、 \begin{screen}\sf \begin{minipage}{7.5cm} しよう。つまり、 \begin{maildesc} でよ、 そうですねえ、この環境名を 'fnaildesc ”としま \hspace{5mm} \end{minipage} \end{screen} にある、 \end{minipage} \begin{minipage}{7cm} 確認して、 {\sf ma 土 1 } と人力します。 UNIX のプロンプトが出ているのを {\sf mail } というコマンドを使います。 メールを読むためには、 \middesc (turtle)\% mail \begin{maildesc} {\end{minipage}} \hspace{5mm}\begin{minipage}{7cm}}}% \def\middesc{\end{screen}\end{minipage} {\begin{minipage}{7cm}\begin{screen} \newenvironment{maildesc}% になります。 定義すると、入力ファイルは次のようにとっても簡単 このように maildesc 環境と \middesc コマンドを しましよう。 行できるようにしておきます。ここでは \middesc に という 4 つのコマンドは、なにか 1 つのコマンドで実 \end{maildesc} (turtle)% mail メールを読むためには、 mail というコマンドを 使います。 UNIX のフ。 ロンフ。トが出ているの を確認して、 mail と入 力します。 UNIX MAGAZINE 1990.9 \middesc コマンドは、 maildesc 環境以外では使 用できないように maildesc 環境の定義内て定義して います。ただし、 \newenvironment コマンドのなか では \newcommand コマンドを使用することができな いので、 \def コマンドを使って定義しています。 このように環境やコマンドを定義しておけば、入力 ファイルが簡単になって見 - 茆くなるし、フォントを 変更するのを忘れたりすることもありませんね。さら に、あとでフォントを変えたり、説明文と画面例の幅 を変更する必要ができたときにも便利です。 minipage 環境 では、今回のメインテーマである minipage 環境に ついて説明することにしましよう。とても便利な環境で すし、きっと使う機会が多くなると思いますから、しっ かり覚えておいてくださしⅵ minipage 環境の前に 唐突ですが、私は引っ越しをしました。私は約半年 のあいだ、往きは 1 時間半、帰りは 40 分という道のり をかすみちゃんという名前の愛車で通勤していました。 しかし、会社のある黒川まではあまりにも遠く、とう とう東京に住むことを断念したのです。引っ越してか らは通菫加寺間が 1 / 3 以下になりました。 引っ越しにはいろいろとお金がかかるもので、とく に収納スペースの違いからか、収納 . 用品をどうしても買 い足すことになります。このようなとき目につくのは、 サイズカ一されてし、て、大きめの箱の上に小さめの箱 がちゃんと 2 つ乗るようになっていたり、 2 つの箱を 縦に積み上げるともう 1 つの大きな箱とちょうど同じ 高さになるというシリーズものです。このような箱は、 押し入れにいつばいになるまで好きなように組み合わ せることができます。 なぜこんな話をしたかというと、 ' I びも同じように 箱の組合せでページを形成していくからてす。ただし、 箱の大きさは統一されていませんから、隙間を埋めるた めの材料なども必要になります。 ' I びでは、この箱を「ポックス」と呼びます。ポッ 137
FreeSoftwa 「 e の世界 80 From: フィールドを表示します。 分で出したものなら To: フィールドを、そうでなければ 調べる関数です。ですから、 From: フィールドをみて自 (mymbox) は、自分のメールアドレスと同しかどうかを 4 ー 5 行目 更新された時刻になります。 す。フィールドがない場合、 { date } の結果はファイルが Date: フィールドがあれば空白、なければ * を表示しま 3 行目 部分に 0 を埋めてくれます。 のように幅を指定すると、 printf と同しように足りない 、、月 / 日クの形で Date: フィールドを表示します。、、 % 02 ' ′ 2 行目 は空白を表示します。 偽になるので、このフィールドがあれは、、ノを、なけれ {replied} は、 Replied: フィールドがあれば真、なければ します。 メッセージならば、、十〃を、そうでなければ空白を表示 1 、そうでなければ 0 を返します。ですから、カレント・ (cur) は、そのメッセージがカレント・メッセージなら 前の 4 で指定しています。 は固定幅で数字を表示するための関数です。幅は関数の ( msg ) でそのメッセージ番号を取り出します。 putnumf 1 行目 では、さきほどのフォーマットを見ていきましよう。 true 、偽なら false を表示します。 く (cur)true% い alse % 〉〃と書けば ( cur ) 関数が真なら 数であれは 0 以外の数値なら真です。たとえば、、、 % 列を返す関数なら空文字列でなけれは真、数値を返す関 実行し、偽であれば % ーから % 〉までを実行します。文字 % くに続く命令の結果が真であればそこから % ーまでを 真ん中の % ーはなくてもかまいません。 れぞれが C シェルでいう if 、 else 、 endif に相当します。 、、 % 〉〃の 3 つが組で使用され、そ です。、、 % ぐ、に 普通のプログラミング言語の if 文にあたる 1 種類だけ ・制御構造 きる文字列は関数によって異ります。 ment dayo ) 〃のように指定します。引数の部分に指定で 引数は命令の後に 1 つ以上の空白を置き、、 % ( lit argu (friendly) は、アドレスをユーザーが読みやすい形に変 換する関数です。 6 行目 %{subject} は Subject: フィールドを表示し、その後に メッセージの本文があれは、、くぐという文字列に続いて 本文を表示します。長すぎる場合には scan コマンドが 適当に切ってくれるので気にする必要はありません。 どうですか、意外と簡単でしよう ? ( ) で囲んで関数を 書くところなどは、 Lisp のシンタックスに似ていますね。 制御構造がちょっと見にくいのが欠点ですが、仕組みさえ 分かってしまえば手に負えないということはなさそうです。 ほかにもたくさんの関数があります。ます一般的な関数 を表 1 に掲けておきます。メッセージに関するもの、演算、 表示、文字列操作など必要そうなものはひととおり揃って います。表 2 は日付を含むフィールドを操作するための関 数です。これらの関数には、引数に日付を表すフォーマッ トしか指定できません。これらの関数を使えば、メッセー ジのなかの文字列から処理しやすいかたちで数値データを 取り出すことができます。 表 3 ( 82 ページ ) はアドレスを操作するための関数です。 アドレスの形式を変換したり、アドレスのなかから文字列 を取り出したり、アドレスリストをメッセージのなかに埋 め込むなどの関数があります。 さて、これでどんな関数があるかも分かったので、さき はどのデフォルト・フォーマットをちょっとカスタマイズ してみることにします。このままでは Date : フィールドは 、、月 / 日〃の形式でしか表示されませんが、 24 時間以内に届 いたメッセージの場合には、、時 : 分〃で表示するようにし てみます。 Date : フィールドと現在時との差を得るために は (rclock) 関数が、 24 時間以内かどうかの判定には (gt) 関数が使えそうです。これらを使って 2 行目をこんなふう に変更してみました。 %(void(rclock{date}) ) % く ( 戚 8640 の \ %02(putnumf (mon{date}) )/%02(putnumf (mday{date}) ) \ 幻 \ 加 2 (hour{date}) : %02(min{date})\ (rclock{date}) で num レジスタには Date: フィール ドと現在時との差が秒単位で入ります。でもそのままだと その数字が表示されてしまうので、それを防ぐために ( v 。 id ) 関数の引数にしておきます。 ( gt ) 関数は num レジ UNIX MAGAZINE 1990.9