Comments
Description
Transcript
(2016 年 11 月 18 日)
計算機科学概論 プロセスとデバイスファイル (2016 年 11 月 18 日) 山本 光晴 1 プロセス UNIX では「実行状態にあるプログラム」のことをプロセスと呼ぶ。 • プロセスは複数実行することができる。 (実際は動いているプロセスが非常に短い時間ごとに切り替わってい る。) • 同じプログラムでも複数の人が実行していれば (あるいは同じ人が複数起動させたら) プロセスは複数。 • プロセスにはプログラムの実行に必要な様々な資源(CPU 時間、メモリ、. . . ) が割り当てられる。 1.1 プロセスの一覧 % ps PID TTY 370 ttys000 TIME CMD 00:00.33 -tcsh • PID(プロセス ID) . . . プロセスに付けられている固有な番号。 上の例でもわかるように、シェルも一つのプロセスとして動いている。shでもcshやtcshでも自分のプロセス ID を$$で参照できる。「% ps」の結果と「% echo $$」の結果を比較してみよ。 • TTY . . . 制御端末。 もう一つ端末ウィンドウを開いて、それぞれのウィンドウで「% ps」と「% who am i」を実行し、結果を比 較してみよ。 • TIME . . . そのプロセスを実行するのに CPU がどのくらいの時間をこれまで使用したか。 実時間とは違う。数秒待ってからもう一度「% ps」を実行し、tcshのTIME欄がどのようになっているか確認 せよ。 オプション無しの場合にはpsコマンドを実行したのと同じユーザのプロセスで、かつ何らかの制御端末を持つもの のみが表示される。他のユーザのプロセスを表示するには「a」オプションを、制御端末を持たないプロセスを表示 するには「x」オプションをそれぞれ付ける。 1.2 プロセスの親子関係 % ps l UID 5007 PID 370 PPID CPU PRI NI 367 0 31 0 VSZ 22732 RSS WCHAN 940 - STAT TT S s000 TIME COMMAND 0:00.34 -tcsh ここで、PPIDはこのプロセスの親のプロセス ID である。shを起動してみて、その親プロセスがどれであるかを 「% ps p プロセス ID」を用いて確認せよ。tcshの親プロセスはどれか? また、リモートログインした場合はcshや tcshの親プロセスはどうなるか? 1.3 プロセスの操作 killコマンドによって、プロセスに様々なシグナル(合図や通知のようなもの) を送ることができる。 % sleep 100 & [1] 1859 % jobs [1] + Running sleep 100 % kill -TERM 1859 % (ここでコマンドを入力せず、 Return キーのみを押してみる。) [1] Terminated sleep 100 % jobs 上の「-TERM」を「-INT」や「-KILL」に変更して実験してみよ。なお、killの後のシグナル指定を省略すると、 「-TERM」を指定したとみなされる。 上のシグナルではどれを指定してもプロセスが終了してしまうが、通常の終了に用いるのはTERMであり、INTはキー ボードからの割り込み (^C)、KILLは強制終了という違いがある。プログラムによっては、終了時に何らかの処理 (一 時ファイルの消去など) を行うものもあり、そのようなプロセスをKILLで強制終了させてしまうと、一時ファイルな 10 どが消されずに残ってしまう場合がある。プロセスを終了させたい場合はまずTERMを試してみてから、どうしても終 了しない場合にKILLを使用するようにするべきである。 シグナルの指定には名前の他に番号を用いることもできる。名前と番号の対応や、その他のシグナルの種類につい ては「% man signal」を参照のこと。killの引数に指定するときはSIG以下を指定する。 2 デバイスファイル /devディレクトリ以下にあるファイルはデバイスファイルと呼ばれ、様々な入出力装置に割り当てられている。通 常のファイルに対して入出力が行えるのと同様に、デバイスファイルに対しても入出力を行うことができ、それらの 入出力はデバイスドライバの処理により実際の (あるいは仮想的な) 装置に対する入出力になる。 2.1 端末 これまで標準入出力のところで、普通にコマンドを実行すると標準入力がキーボードに、標準出力が画面に結びつ けられると説明してきた。しかし、例えば端末ウィンドウを複数開いた状態では、この説明は必ずしも実態を反映し ているとは言えない。正しくはそれぞれの端末ウィンドウで動いているシェルに端末(正確には制御端末) が結びつけ られていて、シェルから起動されたプロセスはその端末に標準入出力を結びつけるのである。 各プロセスに結びつけられている制御端末は、/dev/ttyで参照できる。通常のファイルと同様に/dev/ttyから入 力を取ったり、/dev/ttyに対して出力を行ったりすることができ、それはあたかも端末に対する入出力 (これまでの 言葉で言えばキーボードからの入力や画面への出力) であるかのように振舞う。 % cp /dev/tty foo A quick brown fox jumped over the lazy dog. ^D % cat foo % cp foo /dev/tty /dev/ttyが示す端末は実体としてはプロセスごとに異なる可能性がある。 (これは通常のファイルでは考えられな いことである。) 端末を実体として参照するには、「/dev/ 端末名」という形式で指定する。端末名はpsやwhoで表 示されるものである (例:ttys000)。 自分が現在使用している端末名は「% who am i」で調べられる。 • 端末ウィンドウを 2 個作成し、それぞれの端末名を調べよ。一方の端末から、「% echo hello > /dev/ 他 方の端末名」とするとどうなるか。 • 授業中の指示に従ってmientにリモートログインせよ。さらに隣の人のリモートログイン先の端末名を教えて もらい、その端末に対して出力を行うと何が起こるか試してみよ。この結果はどのような機構によってもたら されたものか。 (ヒント: 「% ls -lL /dev/ 端末名」を実行してみよ。) 2.2 /dev/null, /dev/zero /dev/nullや/dev/zeroに対する出力は捨てられる (すなわち、どこにも保存されない)。これらは出力が必要ない 場合に用いられる。/dev/nullを読んだ場合は空のファイルであるかのように、/dev/zeroを読んだ場合は中身が全 て 0 で無限の長さのファイルであるかのように振舞う。 % % % % ( echo foo; echo bar > /dev/tty; echo baz ) > /dev/null cat /dev/null cp /dev/null emptyfile od -vb /dev/zero | head • 「% cp /dev/zero foo」を実行するのは危険である。それはなぜか。 2.3 その他 テープやハードディスク、フロッピーディスクなどの物理的装置に対応するデバイスファイルも存在する。マウン ト状況を表示する/sbin/mountやdfの出力にもデバイスファイルが登場する。システムによっては標準入出力や標 準エラー出力に対応する/dev/stdin, /dev/stdout, /dev/stderrがあるものもある。 11