CPUに割り当てる処理単位(タスク)の生成・状態・実行を管理するOSの機能。
タスクとは、OSがCPU(=計算を行う頭脳)に割り当てる処理の単位のことです。プロセス(=実行中のプログラム)とほぼ同じ意味で扱われます。タスク管理は、このタスクの割当てや状態を管理するOSの機能です。
身近な例で考えると、1人の料理人がいる厨房に似ています。CPUが料理人で、注文(タスク)はたくさんあるのに作れるのは一度に1つだけ。そこで「次にどの料理を作るか」「途中で別の注文に切り替えるか」を采配する人が必要です。その采配役がタスク管理です。
上の図解のように、複数のタスクが順番待ちをしていて、タスク管理がそれらをCPUへ次々に割り当てることで、見かけ上は多くの処理が同時に動いているように見せています。
タスク管理が担う主な機能には、次のようなものがあります。
・タスクの生成・消滅:処理が始まるときに作り、終わったら消す
・状態管理(状態遷移):実行可能・実行中・待機などの状態を管理する
・CPU割当ての制御(ディスパッチ):実行可能なタスクにCPUを割り当てる
・スケジューリング:どのタスクを次に実行するか順番を決める
・同期・排他制御:複数タスクが同じ資源を奪い合わないよう調整する
とくに重要なのが状態管理です。タスクは「CPUの順番を待っている(実行可能)」「いまCPUを使っている(実行中)」「入出力の完了を待っている(待機)」という3つの状態を行き来します。実行可能なタスクにCPUを割り当てて実行中へ移すことをディスパッチと呼びます。
タスク管理は、ジョブ管理の下位に位置する機能です。両者は次のように役割分担しています。
・ジョブ管理:利用者から受け付けた仕事(ジョブ)の実行順序を管理する
・タスク管理:そのジョブを実行段階でタスクに分け、CPUへ細かく割り当てる
つまり、ジョブ管理が受け付けた1つの仕事は、実際に動かす段階で複数のタスクに分けられ、それをタスク管理がCPUに割り当てて処理します。会社にたとえると、ジョブ管理が「どの案件を先に進めるか」を決める部長、タスク管理が「その案件をどの作業から手をつけるか」を采配する現場リーダー、というイメージです。
タスクはプログラムが起動するときに「生成」され、処理が終わると「消滅」します。たとえばブラウザのアイコンをダブルクリックすると、OSがそのタスクを新しく作り、ブラウザを閉じると消します。この生成から終了までのひとつながりが1つのタスクの一生です。
なぜ「終了したら消す」のか。それはタスクが動くにはメモリ(=データを一時的に置く場所)を使うからです。終わったタスクを残し続けるとメモリが埋まってしまい、新しいタスクを動かせなくなります。OSはタスクが終了したら、そのタスクが使っていたメモリを回収して空き領域に戻します。
生成〜終了の間で、タスクは次の状態を行き来します。
・生成:OSがタスクを作り、必要なメモリを確保する
・実行可能:CPUの順番待ち。すぐ動ける準備はできている
・実行中:いまCPUを使って処理している
・終了:処理が完了し、メモリが解放される
複数のタスクを交互に動かすには、「あるタスクを途中で止め、別のタスクに切り替える」操作が必要です。このときに行われるのがコンテキストスイッチ(=作業状態の切り替え)です。
なぜ途中で止めても続きから再開できるのか。それは、タスクが止まる瞬間に「コンテキスト(=そのタスクの作業状態。どこまで計算したか・変数の値など)」をメモリに保存しておくからです。後で再開するときにその保存データを読み込んで、止まった続きから動かします。
手順はシンプルです。
・① 保存:今動いているタスクAのコンテキストをメモリに書き出す
・② 渡す:CPUの使用権を次のタスクBに渡す
・③ 復元:タスクBの前回保存したコンテキストを読み込んで続きから実行する
身近な例えで言うと、本を読んでいて途中でしおりを挟んで閉じ、別の本を開いて読むのと同じです。「しおりを挟む」がコンテキストの保存、「次の本の前回のしおりのページを開く」がコンテキストの復元です。このしおりの仕組みがあるから、1つのCPUで多くのタスクを交互に動かせます。
Q1. タスク管理が扱う「タスク」とは何か。
Q2. 実行可能状態のタスクにCPUを割り当てて実行中に移す処理を何というか。
Q3. ジョブ管理とタスク管理の関係として正しいものはどれか。