連載 / プログラマー入門ー⑩ 図 2 time コマンドの実彳」 ( その 2 ) % time grep FR' /etc/sendmail . cf >/dev/null 0 .74 real 0 . 19 user 0.28 sys お願いする処理です。また、ライプラリ関数のなかにも、 fread() や fwrite() のように、内部でシステムコールを 呼び出しているものがあります。 システムコールにどのようなものがあるのかが知りたけ れば、 $ man 2 intro を実行して、オンライン・マニュアルのセクション 2 を 見てください。また、 trace コマンド 3 を使えば、実行中 のプログラムか呼び出したシステムコールか表示されるの で、よいヒントになるでしよう。 ユーザー時間とシステム時間 前の節で長々とカーネルの話をしましたが、 とユーザー時間とシステム時間の出番です。 システム時間とは、カーネルのなか ( カーネル空間 ) で 消費される時間、言い換えるとカーネルが実行する処理や そのオーバーヘッドにかかる時間のことです。ューサー時 間とは、カーネル以外の部分 ( ューザー空間 ) で実行する 処理に消費される時間のことです。 ューサー日判日とシステム時間をくらべれば、人間か書い たプログラムの実行そのものに時間がかかっているのか、 カーネル部分でがかかっているのかカ吩かります。も し、はとんどの時間がカーネルで消費されているのなら、 いくらプログラマーカ張ってもどうしようもないってこ とです。 たとえは、図 1 の grep の夫行・時憫の例では、ユーサー 時墹が 0.23 秒に対してシステム時間が 3.70 秒でした。っ まり、この処理にかかったほとんどの時間はカーネル空間 の処理で消費されたことが分かります。これでは、プログ ラムを工夫してユーサー時間を半分に縮めても、本とし て 5 % も矢宿できません。 もう 1 つ、同様の例を試してみましよう。今度も同し grep コマンドの実行時間を time コマンドで測定します 3 SystemV では truss コマンド。 UNIX MAGAZINE 1995 ユ 2 図 3 システムコールが多いプログラムはシステム時間の比率が % time . /neko ・・ nek 。プログラムの実行結果の表示 11 .92 real 0 .20 user 11.58 sys が、結果を端末に出力する代わりに /dev/null デバイス に出力します ( 図 2 ) 。 /dev/null は入力を何も処理せす、 ただちに捨ててしまう未なデバイスファイルです。 端末に表示していたときには 3.70 秒かかっていたシス テム時間が、図 2 の例では 0.28 秒に減りました。端末へ の表示はひどく日判りがかかる処理だということが、 2 不鶤頁 の grep の実彳寺間を上交すれは読み取れますれ ユーザー時間とシステム時間を消費する例 これからは難しい説明を読み飛ばした人に、具体例を示 です。 端的だけど難しい言い方をす川ま、 すコーナーです。 ・ユーサー日判Ⅲまューサー空間の処理で消費される時間 ・システム日判りはカーネル空間の処理で消費される時間 は、ひたすら、、 1 十 1 " を計算します。 main() 関数のなか 今度はリスト 2 を見てください。このプログラム dog ムの夫行時間のはとんどがカーネルで消費されています。 時間が 11.58 秒かかっています。つまり、このプログラ した結果です。ューサー時間が 0.20 秒に対してシステム 図 3 は、この neko の実行時間を time コマンドで則定 の比率か高いことは、容易に想像できますね。 わちシステムコールです。このプログラムのシステム時間 します。処理のはとんどの部分がファイルの入出力、すな ファイル /etc/sendmail. cf を読み込んで驃準出力に出力 ますリスト 1 を見てください。このプログラム nek 。は、 です。 にかかる日判 ・ユーサー時間はシステムコール以、タ ) プログラムの処理 ・システム日判はシステムコールの処理にかかる日判 もっと大肥で不正確な言い方をすれは、 しかし、これではなんのことだか分からないでしよう。 79
プログラマー入門ー⑩ 連載 全体の実行時間の言わ則 など、言算機の構成カ墹題で遅い場合もあります。 ・ネットワークが昆雑している ディスクが遅い ・メモリが足りない しようもありませんが、 とはありませんか ? もともと遅いソフトウェアならどう せつかく買ったソフトウェアがどうも遅いと感しるこ 使う側にとっても重要です。 実行時間の測定は、プログラムを作る側だけではなく、 ムの実行時憫を知っておいても、損はありません。 く " ューサーは少ないでしようが、自分の作ったプログラ 計算機の場合には、時間がかかるからといって、、どっ ければ、、、どっく " 人が多いからです。 なせ、壊れやすいのかというと、 3 秒間も何も起こらな 「 3 秒以内に反芯しない自動販売機は壊れやすい」 「 XX 秒かかります」 に真剣になってもらうためには、 では、適当にあしらわれてしまいかねません。サポート係 「なんとなく遅いんてす」 みるのもよいでしよう。ただし、 もし、異様に遅いと感したらサポート窓口に電話をして 今回の記事では、プログラム本の実行時間を測定する とお墨付きをもらえるかもしれません 1 。 「しつはもともと遅いんです」 ません。あるいは、 要なメモリの量や計算機の能力を教えてもらえるかもしれ と、具一勺な数才 : でパンチを喰らわせるのカ立 - 一番です。必 去を 2 不頁紹介しましよう。この去では、 76 1 嬉しくもなんともないお墨付きですが。 測定できる点カ甘寺徴です。 を知ることはできませんが、開発者だけでなくューサーも ・何か原因で遅いのか ・フログラムのどの部分が遅いのか date ではさむ 一番お手軽で、よく使われているのは date コマンドを 利用するガ去です。 date コマンドは日時を設定したり表示したりするコマ ンドですが、引数をなえすに date コマンドを実行すると、 次のように現在の日時を表示します。 % date Fri Oct 6 22 : 11 : 50 JST 1995 この例では、日本の現在時刻 ( と日付・ ) カ瑛語で表示さ れていますが、 OS の不鶤頁や設疋、ユーサーの工竟設疋に よっては、グリニッジオ剽やアメリカ西海岸の時刻な ど、世界各地の都市の時刻が表示されたり、日本語で表示 されることもあります。 日本でアメリカ西海岸の時刻か表示されても困るのです こでの目的はプログラムの実行にかかった時間を 知ることなので、どの都市の時刻が表示されてもかまいま せん。下記のコマンドを実行した結果表示される 2 つの時 刻の差を求めてください。それが、プログラムの実行にか かった実際の時間です。なお、 program は実行時間を測 りたいプログラムです。 % date ; 7 ・ 097 れ m ; date Fri Oct 6 22 : 11 : 50 JST 1995 ・ pmgrarn の実行結果の表示 Fri Oct 6 23 : 00 : 10 JST 1995 この去は、長時間かかる処理をバッチで実行するとき にもよく使われます。たとえば、仕事で使っているディス ク内容のバックアップを定期的にテープにとるときに、だ いたいどのくらい時間がかかるのか知っておけは、次回の バックアッフ時の目安になります。 「このディレクトリの下は 2 日罸かかるから、 4 時までに 取りかかれば 7 時のコンサートに間にあうな。よしよし」 ご覧のとおり、 date の表示は 1 秒単位です。このた め、 1 ~ 2 秒くらいの短い処理や、ミリセカンド単位まで 計測したいときには向いていません。 date で測った時間は、人間が実際にどれだけ待たされ たかを表しています。たまたま言算機がにしいと実行時間 2 アメリカ西海岸でプレインストールされた引算機を、そのまま使っている ューサーがいた時期があり、日本のあちらこちらでアメリカ西海岸ー駭リ か表示されていました UNIX MAGAZINE 1995.12
連載 / プログラマー入門ー⑩ リスト 1 システム時間を消費するプログラム、 neko. c #include く stdio . h> main (argc , argv) int argc ; char **argv ; exit(O) ; fclose(fp) ; fputs (buf , stdout) ; while (fgets(buf , 1024 , fp ) ! = NULL) { exit(l); if ((fp=fopen("/etc/sendmail . cf","r")) char buf [ 1024 ] ; FILE *fp; リスト 2 main() int for ユーサー時間を消費するプログラム、 dog ・ c 1 , sum ; sum i く 1 + 1 ; 1000000 ; 十十 ) 図 4 システムコールが少ないプログラムはユーサー時間の比率 % time . /dog 4 .29 real 3 . 92 user 0 .22 SYS にはシステムコールがないので、 比率か高くなるはすです。 こちらはユーサー時間の 図 4 は、 dog の実行・日判を time コマンドで員掟した結 果です。ューサー日りが 3.92 秒かかっているのに対して システム時間は 0.22 秒なので、予想どおり、このプログ ラムの実行時間のほとんどはユーサー空間における処理が 80 れたのかが分かります。 time の結果を見れば、 消費しています。 入出力がはとんどなく、ひたすら考え、引算し続けるプ ー空間でどのくらい、カーネル空間でどのくらいおこなわ そのプログラムの処理がユーザ = NULL ) { ログラムほどューサー時間の比率が高くなるはすですが、 もしそのようなプログラムでシステム時間の比率か高けれ ば、それは言 t 算機の設定のどこかに問題がある可能匪があ ります。たとえば、 ・メモリか不足していて、カーネルの処理のオーバーヘッ ドカ吠きい ・ネットワークのトラブルのため、通信処理のオーバー ヘッドが大きい そのほか、なんらかの不都合が生してカーネル内での処 理が異様に遅くなっていると考えられます。逆に、シス テムコールをたくさん呼び出しているのに、ユーザー時間 の比率が高けれは、それは・ ~ ・・プログラムのどこかに下 手なコードがあって時間がかかっていると考えるべきで しよう。 消えた時間 これまで、プログラムの実行にかかる時憫は、ユーザー 日日とシステム時間の 2 不鶤頁に分割されるような説明をし てきました。ところが、 time の出力結果をしつくり見る と、それだけでは説明がつかない現象カ起こっています。 樽いつばいに入れてあったはずのワインがいつのまに か目減りしているように、 time コマンドの表示を見ると、 プログラムの処理に費やされたユーサー時間とシステム時 UNIX MAGAZINE 1995.12
連載 / プログラマー入門ー⑩ リスト 3 中身のない main ル ーチン、 ると、 main() empty. c リスト 4 2 秒間 sleep するプログラム、 mysleep ・ c 図 5 sleep すると寒寺間が増える s1eep(2) ; main() 間の和が、実際にかかった時間を表す実日判りよりも目減り しているのです。たとえは、 neko にかかった時間を調べ UNIX MAGAZINE 1995.12 ムで説明しましよう。リスト 3 は中身のない空の main() 分かりやすい例として、 sleep() 関数を使ったプログラ ・関数 sleep() を実行したとき ・ネットワークの通信待ち ・ユーザーの入力待ち ・ I/O 待ち sleep はいろいろな原因て起こります。 実時間 = ューサー日判十システム時間十 sleep 日判 なります。 間、すなわち sleep 時間なのです。式て表すと次の関係に じつはこの消えた時間は、処理をおこなっていない時 にしてはすこし大きすぎるようです。 インではないのて天イ勀畤っていったはすはないし、誤差 ったい消えた日りはどこへいってしまったのでしよう ? ワ こちらも 0.15 秒がどこかへ消えてしまっています。い 4.29 ー ( 3.92 十 0.22 ) = 0.15 なので、 ・システム日寺間 = 0.22 秒 ・ユーサー時間 = 3.92 秒 ・実日り = 4.29 秒 また、 dog にかかった日判りを調べると、 実時間から 0.14 秒間がどこかに消えてしまっています。 11.92 ー ( 0.20 十 11.58 ) = 0.14 なので、 ・システム日制 = 11.58 秒 ・ユーサー時間 = 0.20 秒 ・実日罸 = 11.92 秒 % time . /empty 0 .36 real % time . /mysleep 2 .37 real ルーチンだけのプログラム 0 .00 0 . 00 user 0.22 sys 0.22 sys empty 、リスト 4 は 2 秒間 sleep するだけのプログラム mysleep です。 これら 2 つのプログラムの実行日判りを測定すると、図 5 のようになります。どちらもユーサー時間は 0.00 秒でシ ステム時間は 0.22 秒ですが、実時間は、 sleep() を実行 した mysleep のほうが、ちょうど眠っていた 2 秒間だ け余分にかかっています。 子プロセスが消費する時間 そろそろ time コマンドの出力の意味か理解できたころ なので、 1 つ試験をしましよう。 問題プログラムのなかから子プロセスを起動したとき、 子プロセスで消費された日判りが time コマンドでどのよ うに扱われるかを調べるガ去を述べよ。 「調べ方 ? そんなの簡単しゃん。マニュアルを読むか知っ ている人に教えてもらう」 うんうん、それも 1 つの有力な調べ方ですね。でも、頼 る人がいなかったりマニュアルに書かれていない場合で も、ちょっとした実験で調べることができます。 まず、リスト 5 に示したプログラムを用意します。これ は、コマンド・オプションて指定されたプログラムを子プ ロセスとして起動けるプログラムです。 子プロセスを扱うようなプログラムに不農れな読者のた めに、プログラムの動きをすこし説明しておきましよう。 7 行目までは普通の C の ma ⅲルーチンです。 9 行目 の fork() は子プロセスを起動ける関数です。 fork() は、 1 つだったプログラムの流れをその場で、 ・親プロセスか実行するコードの流れ 81
連載プログラマー入門ーの まざまな処理をおこなってくれるかのようにみえます。 ところで、実間、ユーサー日判広システム時間ってな んでしよう ? もっと正確にいえば、カーネルは、計算機の電源を入 実時間は、プログラムの実行にかかった実際の時間で れて OS を起動したときから、 shutdown コマンドや す。さきはど date で則った時間とだいたい同し時間にな telinit コマンドで OS を落とすまで、すっとメモリに常 りますが、 time コマンドのほうが date コマンドよりも 駐します。 高い精度で測定できます。 もちろん、カーネルはただしっと眠っているわけではあ りません。マルチプロセスのシステムでは、複数のプロセ ・ 0.01 秒の精度 スを時分割で実行しますが、走っているプロセスを切り替 ・ date コマンドを起動するオーバーヘッドカ躾行時間に える処理、すなわち、 含まれない ・プロセス・スイッチ ューザー時間とシステム日りについては、紙面を割いて すこし詳しく説明しましよう。ただ、これらは OS の仕 はカーネルのイ士事です。 組みに深くかかわっているので、まるつきりの初じ、者には また、プログラムの実行中に 少々難しいかもしれません。初じ、者はユーザー時間とシス ・ファイルの読み書きや画面への表示 テム時間の説明を読み飛ばしてもかまいません。 ・ネットワーク経由の通信 デバイスの操作 ユーサー時間とシステム時間 ・メモリ領域を呆する処理の一部 「 time コマンドは使っているけど、実日判り以外は分から などをおこなう部分 ( コード ) があれば、プログラムが、 ないのて気にしていない」 「こんな処理をしてね」 とか、 と、お願いして制御を渡します。お願いされたカーネルは、 処理を終えたらもとのプログラムに制御を戻します。 「あら、ファイルを読み書きするプログラムなら書いた : あるけれど、一ネ ~ 0 = 願 0 、ななたわ カーネルにお願いするといっても、なにも、 RequestKerneI ( ファイルに書いてね ) なんて、関数があるわけではありません。 C 言語に用意さ れている普通のシステムコールやライプラリ関数を呼び出 したときに、必要なら自重加勺にカーネルに、、お願い " する イ督はみになっています。 したがって、カーネルにお願いする処理をプログラム中 に書いたとしても、プログラマーははとんど意識すること はありません。おかげで、カーネルにお願いする処理と、 そうでない処理の区別がついていない人もいるでしよう。 基本的に、 UNIX のシステムコールはカーネルにお願 いする処理です。たとえば、ファイルの読み書きをおこ なう read() や write() システムコールは、カーネルに 「 man で調べたけど、ユーサー時間やシステム時間の説 明の意味が分からなかった」 という人は、この節を読むのにびったりです。 最初におおまかな概念を説明しますが、 こて理解でき なかったからといって諦めてはいけません。次に具ー列で もう 1 度説明するので、正確な意味が分からなくても、お およその感じは擱めるでしよう。 カーネルってなんだろう ? ご存じのとおり、 UNIX のどこかには OS の本体であ るカーネルというプログラムか動いています。でも、 ps で プロセスを表示してもカーネルらしきものは見当たりませ ん。カーネルっていったいどこにいて、何をしているので 「カーネルはいつもみんなの心のなかにいて、助けてくれ るんだよ」 まるで青春ドラマの台詞のようですが、動いているプロ グラムにとってカーネルは、プログラムのなかにいて、さ 78 UNIX MAGAZINE 1995.12
連載 / プログラマー入門ー⑩ 図 6 刻の実行結果 % time ・ /empty 0 .22 ・・Ⅱ ek 。プログラムの実行結果の表示 % t ime . /nekO 0 .00 user 0 . 36 real 表 1 プログラムごとの実彳間 ( 1 ) 号寒寺間ユーサー時間 11.92 real 0 . 20 user % time . /dog 4.29 real 3 .92 user % time . /forkwait empty 0 .75 real 0 .00 user % time . /forkwait nek0 11.58 0 . 22 0.58 SYS SYS SYS SYS SYS SYS 実験 1 実験 2 実験 3 実験 4 実験 5 実験 6 0.36 11.92 4.29 0.75 12.35 4.66 0.00 0.20 3.92 0.00 0.20 3.92 システム時間 0.22 11.58 0.22 0.58 11.97 0.58 ・・Ⅱ ek 。プログラムの実行結果の表示 12.35 real 0 .20 user % time . /forkwait dog 4 .66 real 3 .92 user 実験 11.97 0 .58 そこで、次の 6 不頁のプログラムの夫行時間を time コ マンドで測定します。 1 : empty 単独の夫行Ⅲ判 2 : neko 単独の夫彳芋間 3 : dog 単独の実彳丁時間 4 :empty を forkwait の子プロセスとして実行し たときの実彳判り 5 : neko を forkwait の子プロセスとして実行した ときの実彳学間 刻 6 :dog を forkwait の子プロセスとして実行したと 実験結果 きの実行日判り 結果の分析 たのカ俵 1 です。 実験結果は図 6 のとおりです。また、この結果をまとめ UNIX MAGAZINE 1995.12 た forkwait のユーサー時間とシステム嗤に関して、 もし仮説 1 が成り立つのなら、 time コマンドで表示し 結果の分析です。 ているのかもしれません。そこで、次にすべきことは実験 ません。そもそも、最初に立てた 5 つのイ廨見がすべて誤っ すれしかし、こオ・けごけではまだイ応見 1 カしいとはいえ か成立しないことが分かるので、残ったのはイ応見 1 だけで 図 6 の実験結果をひとめ見ただけでも、イ応見 2 ~ イ廨見 5 社 . 工 = 社十社 . c s. 工 = s.p 十 s. c 時間です。この 2 つの式の左右両辺の差をとると、 行した forkwait のユーサー時間と neko 単体のユーザー となります。ただし、眦と眦 c れはそれぞ neko を実 乢工れ = 社十社 . ロ ~ です。子プロセスとして neko を実行した場合には、 forkwait のユーザー時間と empty 単体のユーザー時間 ただし、 u.fe と u.ce はそれぞ empty を実行した u.fe = 社十社 . ce 子プロセスとして empty を実行した場合には、 時間についてだけ注目すると、 ん。そこで、すこしやり方を変えてみましよう。ユーザー いますが、親プロセス単体のユーザー日判Ⅲま測定できませ ところが、子プロセス単体のユーザー時間は測定できて システム時間、子プロセス単体のシステム時間です。 それぞれ、 forkwait のシステム時間、親プロセス単体の 間、子プロセス単体のユーサー時間で、 s. 人 s ・ 2 、 s. c は forkwait のユーサー時間、親プロセス単体のユーザー時 となるはずです。ただし、社工社・仏 u.c はそれぞれ、 れ . 工 e ー - . 工れ = 社 . ce ー社 . C れ ( 1 ) が成り立つはすです。同本 ) ことがシステム日りについて もいえ、さらに、子プロセスとして実行するプログラムの 組合迂を変えても、同しことがいえるはすです。 そこで、 neko と empty 、 dog と empty について実 行嗤の差を求めた結果カ俵 2 です。多少バラっきがあり ますが、どうやら式が成り立っているようです。 実験の結果が式を満たしていても、仮説 1 が正しいと 決められません。たしかに、仮説 1 が正しいなら式は成 り立ちます。しかし、式が成り立つならイ応見 1 が正しい、 とはかぎらないからです。 83
連載 / プログラマー入門ー⑩ リスト 5 子プロセスを起動して終了を待つプログラム、 fork- 15 : } 1 : 2 : 3 : 4 : 5 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : 、 vait. C #include く stdio . h> main (argc , argv) int argc ; char** , int wstat ; if (fork() ! = 0 ) { wait (&wstat) ; } else { execl(argv[l] ,argv [ 1 ] , 0 ) ; exit(O); 子プロセスか実行するコードの流れ 道具カ甘前ったところで、さっそく実験に取りかかります 実験 . 子プロセスの実行時間の測定 プロセスが、別のプログラムに、、化けて " しまうのです。 いわば、さっきまて親プロセスと同じプログラムだった子 たあとはもうこのプログラムには制御カ唳ってきません。 されたプログラムを実行する関数で、 execl() を呼び出し 目の処理か実行されます。 12 行目の execl() は引数で指定 fork() したあと、子プロセス側では、リスト 5 の 12 行 で親プロセスを終了します。 子プロセスか終了するまで彳寺ってから、 14 行目の exit() 目と 14 行目の処理が実行されます。 10 行目の wait() で fork() したあと、親プロセス側では、リスト 5 の 10 行 ID を、子プロセス側には 0 を返します。 の 2 つに分割し、親プロセス側には子プロセスのプロセス 82 の手順を踏みましよう。 5. 実験結果を分析する 4. 実験する 3. イ廨見を実証するための実験プランを立てる 2. 仮説を立てる 1. 目的を決める が、一ヨ勺な実験の手法にのっとって、 目的 子プロセスの処理時間が time コマンドの結果にどう反 可能生もあります。 以下の 5 通りのイ見を立てましたが、これら以外である 仮説 映されるかを調べます。 UNIX MAGAZINE 1995.12 るはすです。 実時間、ユーサー時間、システム時のすべてか 1 司しにな 仮説 5 が成り立つなら、どのプログラムを実行しても、 カ蒴えるはすです。 ューサー日判システム日罸制はすべて同しで、実日判だけ 仮説 4 か成り立つなら、どのプログラムを実行しても、 なくシステム日判りか増えるはすです。 仮説 3 か成り立つなら、実行するプログラムにかかわり なくューサー時か増えるはすです。 仮説 2 カ城り立つなら、実行するプログラムにかかわり 大皜に増えるはすです。 システム日判肋ゞ、 dog を実行したときにはユーサー時間が もしイ見 1 が成り立つなら、 neko を実行したときには を子プロセスとして実行します。 ・リスト 2 の dog: ユーサー時間の比率か高いプログラム ム ・リスト 1 の neko: システム時間の上ヒ率か咼いプログラ プログラム ・リスト 3 の empty: main() のなかてイ可も実行しない 場した 3 不頁のプログラム、 この実験には、リスト 5 の forkwait 以外に、すでに登 実験プラン 5. 無視する ( 実日判りにカウントされない ) カウントされる 4. 子プロセスにかかった時間すべてが sleep 時間として カウントされる 3. 子プロセスにかかった日すべてがシステム時間として カウントされる 2. 子プロセスにかかった日判すべてがユーザー時間として ま親プロセスの各日判にカウントされる 1. 子プロセスのユーサー時、システム時間などがそのま
リスト 6 起動した子プロセスの終了を待たないプログラム、 連載 / プログラマー入門 - ⑩ 表 2 プログラムの頁と実イ寺間の系の表 実験 2 ー実験 1 実験 5 ー実験 4 実験 3 ー実験 1 実験 6 ー実験 4 15 : } 比較した時間 neko と empty の差 ューザー嗤間 システム日 dog と empty の差 ューサー嗤 システム時り 式のお 0.58 ー 0.59 = 0.00 3.92 ー 0.00 = 3.92 11.97 ー 0.58 = 11.39 0.20 ー 0.00 = 0.20 式の右辺 11.58 ー 0.22 = 11.36 0.20 ー 0.00 = 0.20 0.22 ー 0.22 = 0.00 3.92 ー 0.00 = 3.92 ューサー時間システム時間 表 3 プログラムごとの実イ間 ( 2 ) 子プロセスとして実行したプログラム empty nekO dog 寒寺間 0.74 0.72 0.75 0.00 0.00 0.00 1 : 2 : 3 : 4 : 5 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : forkno 、 vait. c #include く stdio . h> main (argc , argv) int argc ; char** argv ; exit(O) ; execl(argv[l] ,argv[l] , 0 ) ; } else { exit(O) ; if (fork() ! = 0 ) { int wstat ; 0.33 0.32 0.32 考えてみれば当り前ですよ親プロセスが子プロセス プログラムを高速化するのに必要となる情報の集め方を予 く、プログラムの一部分だけの実行時間を調べる方法や、 についてお話ししました。次回は、プログラム全体ではな 今回は、プログラム全体の実イ - 丁時間の調べ方やその意床 次はもうすこし細かく う、何を十ヾることになっても安じ、ですね。 法をとれは、みなさんも自分で調べることかできます。も ときどきで違うのです。しかし、前の節と同しような方 このように、 time コマンドと子プロセスの関係はその ですれ スがあとで終了するプロセスの夫行時間を知るはすはない よりもさきに終ることもあるのに、さきに終了したプロセ 定しています。 実験 . 子プロセスの終了を待たないプログラム の実行時間 最後に、子プロセスの実イ寺間が、かならすしももとの プログラムの time コマンドの表示に反映されるわけでは ないことを、具イ列で示しましよう。 リスト 5 のプログラムをすこし変更して、親フ。ロセスが 子プロセスの終了を待たないフログラム forknowait を作 りましよう ( リスト 6 ) 。このプログラムは、もとのプログ ラムから wait() システムコールを取り除いたものです。 forknowait に、またまた 3 不亟頁のプログラムを実行さ せた場合の実行時間を time コマンドで測るとどうなるで しよう。実彳列は省略しますが、結果は表 3 のようになり ます。この結果からすると、明らかに子プロセスの実行時 間を無視しています。 84 ( あらい・みちこ ASTEC) UNIX MAGAZINE 1995.12
連載 / プログラマー入門ー⑩ 図 1 time コマンドの実彳デ列 ( その 1 ) % time grep ' AR' /etc/sendmail. cf " grep コマンドの実行結果の表示 3.70 sys time かなりバラつきかて、ます。 が長くなりますし、うまくタイミングカ哈うと短くなり、 0 .23 user 5 .50 real UNIX MAGAZINE 1995.12 に並べますが、内容的には同しです。 time コマンドは表小がすこし異なり、 3 不頁の時間を縦 図 1 は BSD の time コマンドの例で、 SystemV の 驚かないでください。 差が出ます。 time コマンドの表小がころころ変わっても きの計算機やプロセスの状況によって実彳間にはかなり 同しプログラムを同し言 t 算機で実行しても、そのときど ザー日判りは 0.23 秒、システム時墹は 3.70 秒です。 を表しています。図 1 の例では、実嗤は 5.50 秒、ユー ・システム日翻 ( 秒 ) ・ユーザー日翻日 ( 秒 ) ・実日判り ( 秒 ) そっけない表示ですが、左から順に 3 不鶤頁の日判り、 を表示した例です。数字が 3 個並んでいるだけでじつに 図 1 を見てください。これは grep コマンドの夫行時間 ログラムの実行中に、、消費した時間 " を表示するコマンド 、、時刻 " ではなく、、経過時間 " 、もっと正確にいえば、プ くれるコマンドを想像しているなら、大間違い。 time は マンドのように、現在時刻をミリセカンドまで表示して これはある意味では正しいのですが、 DOS の time コ と考える人もいるでしよう。 ンドだな」 「はは一ん、 date より正確な時間を表示してくれるコマ date で今度は time とくれは、 い場合には、 time コマンドか彳殳立ちます。さきほどが date で測るよりももうすこしちゃんとした言れ則をした BERKELEY SOFTWARE DESIGN, INC. BSD/OS e 2.0.7 77 資料請求 No. 00D lnternet: bsdi-info@foretune.co.jp 電話 03-5481-8794 FAX 03-5481-8432 第二集花園ピル 8 階 〒 154 東京都世田谷区駒沢 2-11-3 株式会社フォア・チューンル。、係 求 ( 無料 ) もお気軽にお申しつけください。 で確認の上ご注文ください。また、資料請 ご注文の際は、価格、在庫の有無をお電話 年内出荷を目標に開発を進めています。 BSDI では、次のバージョンである 2.1 を お SD, / 0S27 について 行うものです。 201 アップグレード FD でインストールを Version 2.0.1 は 2.0 の CDROM をベースに ( 53C810 / 53C815 ) ・ NCR の PCI SCSI Chip への対応 ・ 2.0 出荷以降確認された問題の修正 阨 20.7 出荷開始 きます。 日本語キットは、 201 でもそのまま利用で 心当たりのある方はお間い合わせください。 りできていない可能性がありますので、お ユーザ登録が済んでいない場合、まだお送 りしております。 で、 6 月以前に 2.0 を購入された方へもお送 日本語キットは料金に含まれておりますの ット CDROM を 6 月より添付しております。 当社では、〃 / 0 、 20 に対応した日本語キ お SD, / 0 、 S20 日本語キット せください。 は、電話、又は電子メールにてお間い合わ 価格が改訂される予定です。詳細について 価格について
ワークステーションに、 5 つのエネルギーをあしなう。 ・、ログラム・セット 工イトン ADD-ON ユー ADON は、 5 つの高性能ユーティリティーがひとつになった、お買い得なプログラム・セットで魂 ピジネス・ワークステーションをもっと快適に、使いやすく。 旧 M RS/6000* 、 HP * * 9000 シリーズ 700 で稼働しま魂 ・ 1 04 セットて ¥ 148 , 000 5 本 活躍する 5 つのユーティリティー、ワークステーションの機能と性能がアップしま魂 6 高速ソート・プログラム AIX ' 標準 sort コマンドの機能・性能拡張版。大規模ファイル ( IOOMB 以上 ) ンソール・ロギング機能 パワーステーションが存在するクライアント / サーパー環境や、 を数の異なるタイプのキーでソート ( 並べ替え ) できるようにします。 ソートの中間ファイルを異なる物理ポリュームに分散させることによって、 処理速度の大幅な向上を実現しました。また、バイナリー・データを扱うことも可能です。 ■大規模ファイルの高速ソート■柔軟なキー指定■使用方法はカンタン ジョブ制御プログラム ンフレームと同様の次のジョブ制御を可能にします。 ー前ジョブの実行結果によ丿、次ジョブの実行を制御する。 ■指定の日時にジョブを実行する。 ■指定時間を越えて実行してしジョブをキャンセルする。 ■ジョブが異常終了した場合には、システム・コンソールに通知する。 ■ジョブの実行結果をログに記録する。 ■ウォーム・スタート / コールド・スタートカセきる ■ンヨプ・クラスをサポートする。 0 0 穩働環境・旧 M RS / 6 网、 A Ⅸ 3.2.5 ■ HP9 网シリーズ 78 、 HP-UX9.05 プログラム番号•ADON ⅸ A ⅨⅨ 84 ー 1 UADON HP-IJX:IJØI-I(XX) * IBM 、 RS / 6000 、 AIX は IBM Co 甲 . ( 米国 ) の商標です。 * *HP は Hewlett-Packard Co. の商標です。 お問い合わせは日本アイ・ビー・エムシステムズ・エンジニアリング株式会社 ( 043 ト 297 ー 5870 まで 日本アイ・ビー・エムシステムズ・エンジニアリング株式会社 〒 261 千葉県美浜区中瀬 1 ー 1 TEL. ( 043 ) 297 ー 6777 FAX. ( 図 3 ) 297 ー 4753 資料請求 No. 054 大規データベース・サーバーが稼働している環境で威力を発揮します。 ・コンソール・メッセージのディスクへの記録 ■他のワークステーションへのコンソール・メッセージの転送 ・過去のコンソール・メッセージの再表示 FTP プログラミング・キット プログラムから FTPを利用するための API と、 FTP のシェル・スクリプト を書くためのコマンド群を用意しました。 決まった時間に自動的にファイルを転送することも簡単に実現できます。 なしに変更する場合があります。また、消費税抜きのものです。 ・このカタログに表記されている使用料金は、 1 的 5 年 1 1 月のもので事前の予告 ■」 EF コード→ S 引 S コード ・ S 」旧コード→」 EF コード ・引 PS ー E コード→ S 引 S コード ・ S 」旧コード→引 PS ー E コード 他社の漢字コードを、 SJIS コードに変換します。 コード変換プログラム