実行可能状態のタスクを選んでCPUに割り当てるOSのプログラム。
ディスパッチャとは、実行できる準備のできたタスクを選んで、実際にCPU(=中央処理装置。計算を行う部品)へ割り当て、実行状態に移すOSのプログラムのことです。タスクをCPUへ送り出すこの操作を「ディスパッチ」と呼びます。OS(=コンピュータ全体を管理する基本ソフト)の一部です。
身近な例で考えると、銀行の窓口で「次の方どうぞ」と呼ぶ係員に似ています。番号札を持って待っている人(=実行可能なタスク)を、空いた窓口(=CPU)へ実際に案内する役目です。誰が動けるかを並べておき、空いた瞬間に送り込みます。
上のツールで▶ボタンを押すと、実行可能キューに並んだタスクを、ディスパッチャが先頭から順にCPUへ割り当てていく流れを確認できます。
ディスパッチャが担当する仕事は、大きく次の3つです。
・CPUを渡す:選ばれたタスクを実行可能状態から実行状態へ移し、CPUの使用権を与える
・コンテキストの保存・復元:レジスタ(=CPU内の小さな作業メモリ)など、タスクの作業状態(コンテキスト)をしまったり取り出したりする
・実行中タスクの切替:今動いているタスクを止め、別のタスクへCPUを渡し替える
ここで大事なのがコンテキストスイッチ(=あるタスクの作業状態を保存し、別のタスクの作業状態を復元して切り替えること)です。タスクを途中で止めても、保存しておいた状態を後で戻せば、続きから何事もなかったように再開できます。
ノートに途中まで書いた計算を一旦しまって、別のノートを開いて作業し、また元のノートを開いて続きを書く——その「ノートをしまう・開く」作業がコンテキストの保存・復元にあたります。上のツールのSTEP5で、AをしまってBを取り出す切替の様子を確認できます。
よく混同されるのがスケジューラとの違いです。両者は別々の役割を持っています。スケジューラが「次にどのタスクを実行するか決める(方針)」、ディスパッチャが「決まったタスクに実際にCPUを割り当てる(実行)」のが基本です。
| 項目 | スケジューラ | ディスパッチャ |
|---|---|---|
| 役割 | 次に動かすタスクを決める | 決まったタスクにCPUを割り当てる |
| 性質 | 方針・選び方を担う | 実際の受け渡しを担う |
| 例えると | 順番を決める管理者 | 窓口へ案内する係員 |
料理屋で例えると、どの注文を先に作るか決めるのがスケジューラ、決まった注文をコンロ(CPU)に乗せて調理を始めるのがディスパッチャです。「決める係」と「渡す係」に分かれていると考えると、両者の違いがすっきり整理できます。
なぜディスパッチャが必要なのか。それは、CPUは1つなのに、動かしたいタスクは同時にたくさんあるからです。タスクが自分でCPUを奪いに行く仕組みにすると、タスク同士が衝突して混乱します。そこで「CPUを渡す専門の窓口係=ディスパッチャ」を置き、1つのCPUをタスクへ順番に貸し出すことで秩序を保ちます。
ディスパッチャがいない世界を想像してみましょう。たとえば、銀行の窓口が1つしかないのに、お客さんが勝手に窓口に割り込もうとする状態です。案内係(=ディスパッチャ)がいるから、列の先頭の人だけが窓口へ進め、残りは席で待てます。
ディスパッチャはOSのカーネル(=OSの中核部分)に組み込まれており、利用者やアプリからは見えません。上のツールを再生すると、ディスパッチャが実行可能キューから先頭のタスクを取り出してCPUに渡す流れを確認できます。
ディスパッチャは「呼ばれたとき」だけ動きます。ではいつ呼ばれるのか。主に次の3つのタイミングです。
・時間切れ(タイムアウト):OSはタスクごとに「CPUを使える時間の上限(タイムスライス)」を決めています。時間が来たら強制的に次のタスクへ切り替えます。これにより1つのタスクがCPUを独占できない
・入出力待ち(I/O待ち):ファイルの読み込みやキーボードの入力など、「データが来るまで待つ」処理が発生すると、そのタスクはCPUを手放して待機状態へ移ります。ディスパッチャが別のタスクにCPUを渡す
・タスクの終了:タスクが処理をすべて終えると、CPUが空くのでディスパッチャが次のタスクを割り当てる
これらのタイミングで自動的にCPUが次のタスクへ渡されるので、複数のアプリを同時に動かしているように見えます。実際には1つのCPUをすごく速い速度で使い回しているだけで、私たちの目には「同時に動いている」ように映ります。