Web教材一覧ハードウェアとソフトウェアOS

タスク管理

OSの機能の一つであるタスク管理について学習します。多様な概念、用語が出てきますが、体系的に理解することが必要です。

キーワード

タスク管理、実行状態、待機状態、実行可能状態、ディスパッチャ、ラウンドロビン方式、割込み、内部割込み、スーパーバイザコール、外部割込み、タイマ割込み、CPUモード、ユーザモード、カーネルモード、スーパーバイザモード、イベントドリブン方式、タイムスライス(時分割)方式、プリエンプティブ方式、ノンプリエンプション方式、ポーリング制御


タスク管理

タスクとは

ジョブとタスク

ジョブとは、利用者あるいはプログラムの視点でのコンピュータに行わせる仕事の単位です。
 給与処理のバッチ処理を例にしましょう。勤怠ファイルの作成(残業時間や特別作業時間など)、給与マスタファイルとの突合せによる給与計算、給与明細の印刷などのプログラムを、一連の処理として、コンピュータに処理させます。これがジョブです。そして、個々のプログラム処理をジョブステップといいます。しかし、ここではジョブステップのことをジョブということにします。

タスクとはコンピュータ、特にOSの視点での仕事の単位です。
 給与明細印刷のジョブでは、明細ファイルの読込(入力)、給与の計算(CPU)、プリンタ印刷(出力)が交互に行われます。このようにジョブは入出力処理やCPU処理などに細分されます。その細分した単位をタスクといいます。

タスク、プロセス、スレッド

マルチタスク

一度に一つのタスクしか行えないOSをシングルタスクといいます。この環境では、入出力-CPU-入出力-CPU…のような流れになります。それに対して、同時に複数のタスクを行えるOSをマルチタスクといいます。現在、通常のOSはマルチタスクになっています。

給与処理とともに売上処理のジョブもあるとします。そのジョブも入出力処理やCPU処理のタスクがあります。
 マルチタスクならば、給与処理で入出力のタスクが行われているときは、CPUを使っていないので、その間は売上処理のCPU処理をさせることができます。また、売上処理が入出力処理をしている間はCPUを給与処理に渡すことができます。このように複数のジョブを並行処理することにより、全体の処理効率を向上できます。

マルチタスクはパソコンでの対話方式処理でも有効です。例えば、音楽のダウンロードをしている間に表計算ソフトを使うというようなことができるのは、マルチタスクの環境になっているからです。
 そもそも現在のパソコンは、多くの常駐ソフトウェアがあります。利用者が一つの作業しかしていなくてもマルチタスクとして動作しているのです。

マルチスレッド

マルチスレッドもマルチタスクと同様に、CPU処理と入出力処理を並行して処理効率の向上を図るものですが、マルチタスクは複数のタスク(アプリケーション)間での並行処理を対象にしたのに対して、スレッドでは同一のタスク内での複数スレッド間での並行処理も可能にしています。

マルチタスクは、一つのアプリケーションが複数のCPUを同時に利用できるので、複数のCPU、CPUがマルチコアのときに特に効果的です。

(注)マルチタスクに似た用語・機能

マルチタスクが一般化する以前から、マルチタスクの一部の機能を実現した技法がありました。

タスク管理とは

タスク管理とは、マルチタスク環境、マルチスレッド環境において、多くのタスクを管理して、適切なスケジュールを作成し実行することです。また、それを効果的に実現する技法です。

タスクコントロールブロック
OSは、タスクが発生するたびに、タスクコントロールブロック(TCB)を生成します。
TCBには、各タスクの状態、必要とする資源、優先度などの情報が登録されます。
割込みが発生したときは、実行再開時に必要な情報-プログラムカウンタ、開いているファイルなど-が書き込まれます。
タスクスケジューリング
TCBを調べて、優先順位により実行するタスクを決定することです。
ディスパッチ
あるタスクの実行中に,TCBにより実行可能状態にあるタスクの中から,次に実行するべきタスクを選んで実行状態にします。そしてCPUの時間を割り当てて実行させます。それとともに、TCBの内容を更新します。そのソフトウェアをディスパッチャといいます。
割込み
タスクの実行中に、優先順位の高いタスクの到着、入出力処理の発生、CPU使用時間の超過など、他のタスクに実行権を渡す必要が生じます。それを割込みといいます。
プリエンプティブ
プリエンプティブとは、割込みにより、実行中のタスクをいったん中止して待機状態に戻すことです。これに続いてディスパッチが行われ、他のタスクが実行されます。

タスクスケジューリング

タスクの状態

タスクの状態には次の3つの状態があります。(状態遷移図については、「オートマトンと状態遷移図」参照)

実行状態(Run)
CPUが割り当てられ実行している状態
待機状態(Wait)
ファイルから読み込んだデータを処理するタスクのように、入出力が完了するのを待っている状態
実行可能状態(Ready)
CPUが割り当てられれば実行できるのだが、他のタスクがCPUを使っているので、自分に割り当てられるまで待っている状態

各状態からの遷移は、次のように行われます。

●タスク実行中での高優先度タスクによる割込みの例
 タスクAの実行中に、Aよりも優先度の高いタスクBが到着すると、Aの実行を中断してBを実行するという割込みが発生します。このとき、Bは実行可能状態になり、Aが終了する(Aが消滅する)と直ちに実行状態に戻ります。
 このときBを待機状態にしたのでは、Aの終了後、待機状態にある他のタスクCが実行されてBの実行が遅れることもありますし、Bの実行が中断したときの情報を失ない、正しい実行ができなくなることもあります。

タスクの選択方式

ディスパッチャが実行可能状態のタスクのなかから実行するタスクを選択する優先順位には、多様な基準があります。通常は、これらを組み合わせたり重みづけをしたりして、実行すべきタスクを決定します。

到着順方式
実行可能状態になった順に実行権を与える方式です。通常は到着順と一致します。実行時間(CPU処理時間)の長いタスクの後に到着したタスクは長く待たされます。
処理時間順方式
新しいタスクが実行可能状態になるたびに,各タスクの残りの実行時間を評価し,その時間が短いものから順に実行する方式です。「すぐ片付くことからやってしまおう」という発想で、対話型処理の平均応答時間を最小にするのに有効です。
優先度順方式
PCBに設定している実行優先順位に従って選択する方式です。優先順位の高いタスクはすぐに実行されますが、優先順位の低いタスクは、いつになっても実行されないという問題が発生するので、長く待たせれているタスクの優先度を上げるような工夫が必要になります。
実行中のタスクとの関係もあります。あるタスクが実行可能状態になったときに,そのタスクの優先度と,実行中のタスクの優先度とを比較して,実行可能状態になったタスクのほうが高ければ、それを実行状態にします(実行中のタスクは待機状態になります)。
ラウンドロビン方式
実行状態としたタスクが割り当てられたCPU時間(タイムクウォンタム)内に待ち状態に選移しないとき、そのタスクはタイマ割込み(後述)などにより、実行可能状態に遷移します。このとき、待ち行列の最後尾に回す方式です。
各タスクに、均等にCPU時間を割り当てることができます。最後尾に回すので他のタスクへの迷惑は減少します。反面、待ち行列が長いとき、処理時間の長いタスクは完了までにますます長時間かかることになります。
タイムクウォンタムを非常に長くすると到着順方式になります。

割込み

実行中のタスクを中断して他のタスクに実行権を渡すことを割込みといいます。入出力処理が完了したとか、プログラムが異常な状態になったなど、何らかの出来事(イベント)により、トリガー(引き金の意味)が発生したことにより、割込みが発生します。

割込みの種類

内部割込み
実行中のタスク(プログラム)が原因で発生する割込み
プログラム割込み
演算命令での0除算、オーバーフローなど(プログラムエラーに起因することが多い)
仮想記憶方式での存在しないページへのアクセス(ページング)
スーパーバイザコール
システムコール、特権モード呼出し割込み、カーネル呼出し割込みともいいます。
通常のプログラムからはアクセスできない保護されたメモリ領域にアクセスすることや、保護されたレジスタを操作すること、CPUの動作モードを変更することなどを、OSの制御プログラムの特権機能が必要になったときに発生します。
外部割込み
実行中のプログラム以外の原因で発生する割込み
機械割込み
ハードウェアの障害、電源異常、パリティエラーなどによる割込み
コンソール割込み
オペレータの操作による割込み
入出力割込み
入出力処理の発生や終了による割込み
タイマ割込み
実行中のタスクがCPUを長時間占有すると、他のタスクに大きな影響を及ぼします。それを回避するために、インターバルタイマにより、一定時間を経過すると割込みを行い、他のタスクに実行権を渡して、自分は実行可能状態に遷移します(ラウンドロビンにすることが多い)。
実行中のアプリケーションから定期的に信号を送らせ、それは途絶えていればハングアップ状態と判断、割込みを掛ける仕組みをウォッチドッグタイマといいます。

CPUモード

プロセッサモード、特権レベルともいいます。コンピュータのCPUの動作モードであり、CPUが実行できる操作を制限するものです。

ユーザモード
アプリケーションが割込みを受けずに、定常的に動作しているモードです。OSは、あるアプリケーションが他のアプリケーションに影響を与えないようにするため、アプリケーションに与えたメモリ区間を超えたメモリアクセスや機器占有の調整などを行っています。ユーザモードでは、そのような制限の下で動作しています。
スーパーバイザモード
カーネルモード、特権モードともいいます。ユーザモードで動作しているときに割込みが起こると、ユーザモードに与えられていた制限を超えた処理が必要になります。その処理はOS(カーネル)が行います。
すなわち、割込みとは、ユーザモードをスーパーバイザモードに切り替えることだといえます。

割込み時の処理手順

割込みの原因により違いがありますが、基本的には次の手順で割込み処理をします。

  1. タスクを実行していたユーザモードから割込み処理を行う特権モード(スーパーバイザモード)に切り替わる。
  2. タスクコントロールブロック(TCB)に、実行再開時に必要となる情報を書き込む。  プログラムカウンタの値、開いているファイル、アドレス空間の情報など
  3. 割込み処理の開始アドレスをプログラムカウンタにセットする。
  4. 割込み処理の実行
  5. 割込み処理が終了したら、TCBに退避していたプログラムカウンタなどを戻し、特権モードからユーザモードへ切り替える(ここで再開するタスクが1で中断したタスクとは限らない)。

イベントドリブン方式等

イベントドリブン方式
入出力の終了やキーボードからの入力,マウスのクリックなどの事象(イベント)をきっかけにした割込みが発生,次に実行するものを決めていく方式です。タスクが割込みを繰返しながらタスクの切替えを行い,実行していく方式です。グラフィカルユーザインターフェースを持ったシステムには必須の方式です
タイムスライス(時分割)方式
TSS(Time Sharing System)ともいいます。CPUの一定時間(タイムウォンタム)ごとにタスクを切り替える方式です。タイムクウォンタムを短くするほどタスクの切替え回数は増加しオーバーヘッドがかかりますが、多くのタスクを公平に処理できます。
「タイマ割込み」というイベント発生によるのでイベントドリブン方式の一つだといえますが、1台のサーバを多数のユーザが共同利用することに注目しています。

プリエンプティブ等

プリエンプティブ方式
マルチタスクOSで特定のタスクにCPUを長時間占有させず、複数のタスクに公平に実行時間を割り振ることができる処理方式です。現在のパソコンのOSは、ほとんどがプリエンプティブ方式になっており、本節の説明は、ほぼこの方式を前提にしています。
プリエンプション方式とノンプリエンプション方式
プリエンプション方式は、実行中のタスクが割込みにより中断されて、優先度の高いタスクに切り替わり、優先度の高いタスクの処理が終了すると、中断されたタスクの処理を再開する方式です。その割込みで重要なのがタイマ割込みです。
それに対して、ノンプリエンプション方式は、タイマ割込みを行わない方式です。この方式では、実行状態としたタスクが自ら待ち状態に遷移するか終了するまで,他のタスクを実行状態とすることができません。実行中のタスクが終了後、新しいタスクの処理が開始されます。実行中のタスクの処理時間短縮には有効ですが、いったんCPUを長く使うタスクが実行状態に入ると、他のタスクはなかなか実行されない欠点があります。

ポーリング制御

状態遷移を行うのに、割込み以外にポーリング制御があります。イベントドリブンではなく「イベントが発生しているかを定期的にチェックする」方式です。マイクロプロセッサなどが、一定間隔でプログラムや周辺機器の状況を随時監視(ポーリング)して、何らかの処理を行なう状態になったと判断したらその処理に実行権を渡します。

そのため、イベントが発生しても、即座には対処しない。ポーリングがかかるまで待たされます。しかし、一斉にイベントが発生した場合、元の処理が長時間時実行されないような事態が防げます。
 特殊な例では、「ボタンの短押しや長押しの判定」などには、ポーリング制御が便利です。