OSタスク管理OSの機能の一つであるタスク管理について学習します。多様な概念、用語が出てきますが、体系的に理解することが必要です。ディスパッチャ、ラウンドロビン方式、割込み、内部割込み、スーパーバイザコール、外部割込み、タイマ割込み、プリエンプション、ポーリング制御タスク管理タスクとはジョブとタスクジョブとは、利用者あるいはプログラムの視点でのコンピュータに行わせる仕事の単位です。給与処理のバッチ処理を例にしましょう。印刷などのプログラムを、一連の処理として、コンピュータに処理させます。個々のプログラム処理をジョブステップといいます。ここではジョブステップのことをジョブということにします。タスクとはコンピュータ、特にOSの視点での仕事の単位です。給与明細印刷のジョブでは、明細ファイルの読込(入力)、給与の計算(CPU)、プリンタ印刷(出力)が交互に行われます。このようにジョブは入出力処理やCPU処理などに細分されます。その細分した単位をタスクといいます。タスク、プロセス、スレッドタスクとプロセスこれらの関係はあいまいです。乱暴ですが、ほぼ同じものを、汎用コンピュータではタスク、サーバやパソコンではプロセスといっているようでもあります。Windowsを例にすれば、起動されているプログラムをアプリケーションといっています。プロセスとはWindowsが処理する実行単位としているようです。タスク=プロセス、アプリケーション=ジョブ(ジョブステップ)のようです。Windowsは、これらを管理する機能をタスクマネージャーといっています。するとアプリケーションとプロセスの総称をタスクとしているようです。プロセスとスレッドスレッドはプロセスをさらに細分したものですが、細分化する観点が異なります。プロセスはOS上のプログラムの実行単位で固有のメモリ空間を持っています。スレッド間は他のプロセスのメモリを参照できず独立しています。それに対して、スレッドはCPU利用の単位です。メモリなどの資源を共有して動作します。同一のメモリ空間を複数のスレッドで参照できるのです。独立性は劣りますが、スレッド切り替えがオ^バーヘッドが短時間になります。そのため、スレッドとは並行処理を重視してプロセスを細分化したものだと理解しておけばよいでしょう。マルチタスク一度に一つのタスクしか行えないOSをシングルタスクといいます。この環境では、入出力-CPU-入出力-CPU...のような流れになります。それに対して、同時に複数のタスクを行えるOSをマルチタスクといいます。現在、通常のOSはマルチタスクになっています。給与処理とともに売上処理のジョブもあるとします。そのジョブも入出力処理やCPU処理のタスクがあります。マルチタスクならば、給与処理で入出力のタスクが行われているときは、CPUを使っていないので、その間は売上処理のCPU処理をさせることができます。売上処理が入出力処理をしている間はCPUを給与処理に渡すことができます。このように複数のジョブを並行処理することにより、全体の処理効率を向上できます。マルチタスクはパソコンでの対話方式処理でも有効です。音楽のダウンロードをしている間に表計算ソフトを使うというようなことができるのは、マルチタスクの環境になっているからです。そもそも現在のパソコンは、多くの常駐ソフトウェアがあります。利用者が一つの作業しかしていなくてもマルチタスクとして動作しているのです。マルチスレッドマルチスレッドもマルチタスクと同様に、CPU処理と入出力処理を並行して処理効率の向上を図るものですが、マルチタスクは複数のタスク(アプリケーション)間での並行処理を対象にしたのに対して、スレッドでは同一のタスク内での複数スレッド間での並行処理も可能にしています。マルチタスクは、一つのアプリケーションが複数のCPUを同時に利用できるので、複数のCPU、CPUがマルチコアのときに特に効果的です。(注)マルチタスクに似た用語・機能マルチタスクが一般化する以前から、マルチタスクの一部の機能を実現した技法がありました。マルチユーザWebサーバのように,同時に複数の人(ユーザ)からの仕事を処理できる機能です。OSが複数のユーザーを識別して、データの処理を管理する機能です。System)1台の汎用コンピュータを多数の利用者が時分割で共有(タイムシェア)するシステムです。マルチタスクのタイマ割込みだけを用いたマルチユーザだといえます。マルチプログラミング実行中プロセスの切り替えは、マルチタスクでは後述のように多様な割込みで行われます。それに対してマルチプログラミングでは入出力割り込みが発生した時のみ行われます。CPUを長時間独占することが起こります。タスク管理とはタスク管理とは、マルチタスク環境、マルチスレッド環境において、多くのタスクを管理して、適切なスケジュールを作成し実行することです。それを効果的に実現する技法です。タスクコントロールブロックOSは、タスクが発生するたびに、タスクコントロールブロック(TCB)を生成します。TCBには、各タスクの状態、必要とする資源、優先度などの情報が登録されます。割込みが発生したときは、実行再開時に必要な情報-プログラムカウンタ、開いているファイルなど-が書き込まれます。タスクスケジューリングTCBを調べて、優先順位により実行するタスクを決定することです。ディスパッチあるタスクの実行中に,TCBにより実行可能状態にあるタスクの中から,次に実行するべきタスクを選んで実行状態にします。CPUの時間を割り当てて実行させます。それとともに、TCBの内容を更新します。そのソフトウェアをディスパッチャといいます。割込みタスクの実行中に、優先順位の高いタスクの到着、入出力処理の発生、CPU使用時間の超過など、他のタスクに実行権を渡す必要が生じます。それを割込みといいます。プリエンプティブプリエンプティブとは、割込みにより、実行中のタスクをいったん中止して待機状態に戻すことです。これに続いてディスパッチが行われ、他のタスクが実行されます。タスクスケジューリングタスクの状態タスクの状態には次の3つの状態があります。各状態からの遷移は、次のように行われます。されたタスクは、実行可能状態になり、実行状態になるのを待ちます。ディスパッチャは、優先順位(後述)に従って、実行可能状態にあるタスクのなかから、実行すべきタスクを選択し、実行状態にします。タスクが割込み(後述)により、他のタスクに実行権が渡されると、実行可能状態になります。えば、CPUを使っているタスクが、次のデータをファイルから読み込む状態になったときは、そのデータが読み込まれるまで、待っている必要があります。入出力待ちが生じると、そのタスクは待機状態になり、他のタスクが実行されます。ちで待機状態にあったタスクは、その入出力処理が終了すると、実行可能状態になります。6:実行状態→タスクの消滅タスクの実行が終了すると、その情報がタスク管理に伝えられ、このタスクが占有した資源が解放されます。TCBの情報が削除され、タスク管理の対象から外れます。それをタスクの消滅といいます。●タスク実行中での高優先度タスクによる割込みの例タスクAの実行中に、Aよりも優先度の高いタスクBが到着すると、Aの実行を中断してBを実行するという割込みが発生します。このとき、Bは実行可能状態になり、Aが終了する(Aが消滅する)と直ちに実行状態に戻ります。このときBを待機状態にしたのでは、Aの終了後、待機状態にある他のタスクCが実行されてBの実行が遅れることもありますし、Bの実行が中断したときの情報を失ない、正しい実行ができなくなることもあります。タスクの選択方式ディスパッチャが実行可能状態のタスクのなかから実行するタスクを選択する優先順位には、多様な基準があります。なった順に実行権を与える方式です。通常は到着順と一致します。しいタスクが実行可能状態になるたびに,各タスクの残りの実行時間を評価し,その時間が短いものから順に実行する方式です。「すぐ片付くことからやってしまおう」という発想で、対話型処理の平均応答時間を最小にするのに有効です。優先度順方式PCBに設定している実行優先順位に従って選択する方式です。優先順位の高いタスクはすぐに実行されますが、優先順位の低いタスクは、いつになっても実行されないという問題が発生するので、長く待たせれているタスクの優先度を上げるような工夫が必要になります。実行中のタスクとの関係もあります。あるタスクが実行可能状態になったときに,そのタスクの優先度と,実行中のタスクの優先度とを比較して,実行可能状態になったタスクのほうが高ければ、それを実行状態にします(実行中のタスクは待機状態になります)。実行状態としたタスクが割り当てられたCPU時間(タイムクウォンタム)内に待ち状態に選移しないとき、そのタスクはタイマ割込み(後述)などにより、実行可能状態に遷移します。このとき、待ち行列の最後尾に回す方式です。各タスクに、均等にCPU時間を割り当てることができます。最後尾に回すので他のタスクへの迷惑は減少します。反面、待ち行列が長いとき、処理時間の長いタスクは完了までにますます長時間かかることになります。タイムクウォンタムを非常に長くすると到着順方式になります。割込み実行中のタスクを中断して他のタスクに実行権を渡すことを割込みといいます。入出力処理が完了したとか、プログラムが異常な状態になったなど、何らかの出来事(イベント)により、トリガー(引き金の意味)が発生したことにより、割込みが発生します。内部割込み実行中のタスク(プログラム)が原因で発生する割込みプログラム割込み演算命令での0除算、オーバーフローなど(プログラムエラーに起因することが多い)仮想記憶方式での存在しないページへのアクセス(ページング)スーパーバイザコールシステムコール、特権モード呼出し割込み、カーネル呼出し割込みともいいます。通常のプログラムからはアクセスできない保護されたメモリ領域にアクセスすることや、保護されたレジスタを操作すること、CPUの動作モードを変更することなどを、OSの制御プログラムの特権機能が必要になったときに発生します。外部割込み実行中のプログラム以外の原因で発生する割込み機械割込みハードウェアの障害、電源異常、パリティエラーなどによる割込みコンソール割込みオペレータの操作による割込み入出力割込み入出力処理の発生や終了による割込みタイマ割込み実行中のタスクがCPUを長時間占有すると、他のタスクに大きな影響を及ぼします。それを回避するために、インターバルタイマにより、一定時間を経過すると割込みを行い、他のタスクに実行権を渡して、自分は実行可能状態に遷移します(ラウンドロビンにすることが多い)。実行中のアプリケーションから定期的に信号を送らせ、それは途絶えていればハングアップ状態と判断、割込みを掛ける仕組みをウォッチドッグタイマといいます。割込みの原因により違いがありますが、基本的には次の手順で割込み処理をします。タスクを実行していたユーザモードから割込み処理を行う特権モード(スーパーバイザモード)に切り替わる。タスクコントロールブロック(TCB)に、実行再開時に必要となる情報を書き込む。プログラムカウンタの値、開いているファイル、アドレス空間の情報など割込み処理の開始アドレスをプログラムカウンタにセットする。割込み処理が終了したら、TCBに退避していたプログラムカウンタなどを戻し、特権モードからユーザモードへ切り替える(ここで再開するタスクが1で中断したタスクとは限らない)。入出力の終了やキーボードからの入力,マウスのクリックなどの事象(イベント)をきっかけにした割込みが発生,次に実行するものを決めていく方式です。タスクが割込みを繰返しながらタスクの切替えを行い,実行していく方式です。System)ともいいます。CPUの一定時間(タイムウォンタム)ごとにタスクを切り替える方式です。タイムクウォンタムを短くするほどタスクの切替え回数は増加しオーバーヘッドがかかりますが、多くのタスクを公平に処理できます。「タイマ割込み」というイベント発生によるのでイベントドリブン方式の一つだといえますが、1台のサーバを多数のユーザが共同利用することに注目しています。プリエンプティブ等プリエンプティブ方式マルチタスクOSで特定のタスクにCPUを長時間占有させず、複数のタスクに公平に実行時間を割り振ることができる処理方式です。現在のパソコンのOSは、ほとんどがプリエンプティブ方式になっており、本節の説明は、ほぼこの方式を前提にしています。プリエンプション方式とノンプリエンプション方式プリエンプション方式は、実行中のタスクが割込みにより中断されて、優先度の高いタスクに切り替わり、優先度の高いタスクの処理が終了すると、中断されたタスクの処理を再開する方式です。その割込みで重要なのがタイマ割込みです。それに対して、ノンプリエンプション方式は、タイマ割込みを行わない方式です。この方式では、実行状態としたタスクが自ら待ち状態に遷移するか終了するまで,他のタスクを実行状態とすることができません。実行中のタスクが終了後、新しいタスクの処理が開始されます。実行中のタスクの処理時間短縮には有効ですが、いったんCPUを長く使うタスクが実行状態に入ると、他のタスクはなかなか実行されない欠点があります。状態遷移を行うのに、割込み以外にポーリング制御があります。イベントドリブンではなく「イベントが発生しているかを定期的にチェックする」方式です。マイクロプロセッサなどが、一定間隔でプログラムや周辺機器の状況を随時監視(ポーリング)して、何らかの処理を行なう状態になったと判断したらその処理に実行権を渡します。そのため、イベントが発生しても、即座には対処しない。ポーリングがかかるまで待たされます。一斉にイベントが発生した場合、元の処理が長時間時実行されないような事態が防げます。特殊な例では、「ボタンの短押しや長押しの判定」などには、ポーリング制御が便利です。