マルチプロセス | ||||||
---|---|---|---|---|---|---|
TSS | ||||||
プロセスの概要 | ||||||
システムコール | ||||||
プロセスの生成 | ||||||
プロセス | プロセスの削除 | バックグラウンドジョブ | ||||
デーモン |
マルチプロセスとは、複数のプロセスを(ほぼ)同時に実行することです。 CPU がある瞬間に実行できる処理は1つであり、 実際は TSS と呼ばれる仕組みによってマルチプロセスは実現されます。
CPU を細かく分割した時間単位で、実行するプロセスを切り替えるシステムのことです。 この切り替えが非常に高速に行なわれるので、 人間には複数のプロセスが同時に動作しているかのように見えます。
デーモンプロセスは裏(バックグラウンド)で動作しながら、 システムのサービスを実現します。
また、あるプロセスが新たな別のプロセスを生成する場合があります。 この場合、生成した側を親プロセス、 生成された側を子プロセスと呼びます。 例えば、ユーザがシェルプロンプトからコマンドを入力した場合は、 親プロセスがシェルであり、 子プロセスがコマンドです。
ファイルやプリンタなどのシステム資源はカーネルが管理していますが、 これらを利用するプログラム(コマンドを含む)が実行されると、 そのプロセスはシステムコールを発行します。
システムコールはカーネルの資源管理機能を呼び出すためのものであり、 発行されるとカーネルが資源に対する処理を行ないます。
fork によって生成された新プロセスは、親プロセスと同一のコピーです。
ここから、子プロセスは
1) 自分が子供であることを「自覚し」独自の処理を実行するか、またはのいずれかになります。
2) 他のプログラムを読み込んで、そのプログラムに「変身(exec)」するか
UNIX 上ではたくさんのプログラムが同時に動いています。
それぞれのプログラムは一つだけで処理を行っているものもありますし、
複数のプログラムによって一つの処理が行われている場合もあります。
このプログラムが動作している最小の単位をプロセスと呼びます。
どんなプロセスが動いているかを確認するには ps コマンドを使います。
各プロセスには プロセス ID という識別番号が割り振られています。
また -e
オプションをつけるとシステム全体で動作しているプロセスを確認することができます。
さらに -f オプションをつけると CPU やメモリの占有率なども確認できます。
817ozzy-27 10:23am] ps -ef UID PID PPID C STIME TTY TIME CMD root 0 0 0 12月 10 ? 0:17 sched root 1 0 0 12月 10 ? 0:53 /etc/init -r root 2 0 0 12月 10 ? 0:11 pageout root 3 0 1 12月 10 ? 4482:14 fsflush root 591 1 0 12月 10 ? 0:00 /usr/lib/saf/sac -t 300 nobody 320 1 0 12月 10 ? 0:02 /etc/opt/licenses/lmgrd.ste -c /etc/opt/licenses/licenses_combined root 346 1 0 12月 10 ? 0:00 /usr/sbin/cssd root 55 1 0 12月 10 ? 0:00 /usr/lib/devfsadm/devfseventd root 59 1 0 12月 10 ? 0:00 /usr/lib/devfsadm/devfsadmd root 249 1 0 12月 10 ? 0:01 /usr/lib/autofs/automountd daemon 232 1 0 12月 10 ? 0:00 /usr/lib/nfs/statd root 230 1 0 12月 10 ? 0:02 /usr/sbin/inetd -s :
それぞれのプロセスは処理が終了すれば消えますが、 バグのあるプログラムの場合プロセスが終了しないことがあります。 このようなプログラムは直接削除する必要があります。
コマンドラインからプログラムを動作させて場合は [Ctrl]+[C] ([Ctrl]キーを押しながら[C] キーを押す) で終了させることができます。 しかしそれでも終了しないような場合には、 別のターミナル上からプロセスの ID を確認し killコマンドで終了させることができます。
817ozzy-33 10:33am] ps -ef|grep netstat pro817 8010 7831 0 10:33:17 pts/11 0:00 netstat -i 5 pro817 8012 7900 0 10:33:28 pts/16 0:00 grep netstat 817ozzy-34 10:33am] kill 8010 817ozzy-35 10:33am] ps -ef | grep netstat pro817 8014 7900 0 10:33:56 pts/16 0:00 grep netstat
消すことができるプロセスは kill コマンドを実行するユーザに権限のあるプロセスだけですが、 誤って別のプロセスを消さないように気をつけなければなりません。 これでも終了しない場合は -KILL オプションをつけて強制終了します。
817ozzy-36 10:33am] ps -ef | grep netstat pro817 8015 7831 0 10:36:18 pts/11 0:00 netstat -i 5 pro817 8017 7900 0 10:36:23 pts/16 0:00 grep netstat 817ozzy-37 10:36am] kill -KILL 8015 817ozzy-38 10:36am] ps -ef | grep netstat pro817 8019 7900 0 10:36:35 pts/16 0:00 grep netstat
通常ターミナル上でコマンドなどを実行すると、 その処理が終るまではプロンプトが表示されず、 別の処理が実行できません。
それに対してコマンドを実行するときにコマンドの最後に
& を付けると、処理が終らなくてもプロンプトが表示されます。
この場合処理はユーザの見えないところで実行されています。
このように実行される処理をバックグラウンドジョブといいます。
バックグラウンドジョブも ps コマンドで確認できます。
またバックグラウンドジョブは job コマンドで確認できます。
プロセスは処理を行う毎に生成され、 処理が終わると終了します。 それに対してシステム上に常駐して動き続けるプロセスがあります。 このようなプロセスをデーモンといいます。
デーモンは常時動いているプロセスですので、 たくさん動いているとシステムは直接操作を行わなくても、 負荷が大きく他の処理に時間がかかることになります。 システムを快適に動かすには、 そのシステムに必要なデーモンだけを動かして余分な仕事を減らす必要があります。
ここで主なデーモンを簡単に説明します。
動いているデーモンの数や種類はシステム構成によって違います。
一般にカーネルの動作を助けるデーモン名は先頭に k が付いています。
これらのデーモンは場合によってはセキュリティホールになるものもありますので、
サーバ用のデーモンなど必要ないものは起動しないようにしましょう。
プロセスに関連してよく使われる主なコマンドには、次のようなものがあります。
システムに存在するプロセスの PID や状況を出力します。
プロセスに対して中断や終了させるためのシグナルを送ります。 送り先のプロセスの指定には PID を用いるので、 まず ps コマンドで PID を調べ、 次に kill コマンドでシグナルを送るという組み合わせが使われます。
プライオリティを変更します。 root ユーザ(=システム管理者)はプライオリティを高くできますが、 一般ユーザは自分が実行したプログラムのプロセスを低くすることしかできません。 しかし、あるプロセスのプライオリティを下げることは、 他のプロセスの実行を早めることにつながる場合があります。