03.マルチタスクとは

●マルチタスクの話

 並列処理とは話が違うが、おつきあい頂きたい。マルチタスクの話である。

 Windowsが世に出た頃、「マルチタスク」というキーワードが横行した。MS-DOSでは、同時に1つのプログラムしか動かせないが、Windowsではこのマルチタスクによって複数のプログラムを同時に動かせる、というのがウリだった。
 ちなみに、本格的なマルチタスク(プリエンティブマルチタスク)になったのはWindowsNT、Windows95からである。

 プリエンティブマルチタスクによって、本当に並列処理をしているかのような説明も多かったようだが、実際は違う。

 マルチタスクとは「あるプログラムが処理している間に、別のプログラムを処理できる」という意味である。残念ながら同時に実行しているのではなく、同時に動いているように見せかけているだけである。そもそも(当時のPCには)CPUは1個しかないのだから、物理的に並列動作をすることは不可能である。

 ところで、CPUが1個しかないのに、複数のプログラムを同時に動作できるように見せかけるようにしている「意味」に当然、疑問が残るだろう。

 CPU1個で2つのプログラムを同時に実行したら、互いの処理が終わるまでの時間が2倍(またはそれ以上)かかってしまう。3プログラム同時なら3倍かかる。
 複数のプログラムを同時に扱えて便利かもしれないが、時間ばかりかかって迷惑でもある。


2006/12/30
●マルチタスクが生まれたわけ

 実は、マルチタスクという技術は、元々PC/ワークステーション向けではなく、もっと大型で高価なコンピュータ(メインフレーム等)用に考えられた技法である。

 大型コンピュータは、ディスクの読み書きなどの処理はCPUを経由せず、全部専用のハードウェアが行う。データを外部装置とやりとりしている間、その処理が終わるまでCPUは暇なのである。(ちなみに、PCに搭載されるDMAとは、CPUバスを乗っ取って、外部装置とメモリ間のI/Oを直接行う機構のこと。その間CPUはメモリにアクセスできないため、停止せざるを得ない。計算しながら外部入出力をするには、マルチチャンネルメモリを使う必要があるが、メモリがかなり高価なので、パソコンに使われる例はほとんどない。)

 ついでに言うと、外部装置とのデータのやりとりは、CPUがメモリとデータをやりとりする速度に比べて桁違いに(100倍から1000倍のオーダーで)遅い。データ更新に3分かかるような場合でも、CPUは1秒も動いていない場合がほとんどだ。処理時間の大半はCPUが遊んでいるのである。

 大型コンピュータは、1台ン十億円、リースしても月額ン千万円である。月額1000万円のリースなら、24時間稼働させたとしても1時間で13,900円(都合、30人分の給与相当)が飛ぶ。ビタ1秒たりともCPUを遊ばせておく訳にはいかない。

 そこで、データを外部装置とやりとりしているような、「CPUの暇な時間」を
利用して、別のプログラムを動かせるようにOSが工夫された。

 今実行しているプログラム(プログラムAとする)がディスクの読み書き命令を動作しようとした時、入出力装置に読み書きの指令を出すと一度制御がOSに戻る。そして、入出力処理が終わるまでの間、CPUに空き時ができるので、別のプログラム(プログラムBとする)を開始する。
 外部装置との読み書きが完了した時点で、またプログラムAに戻って処理を続け、また入出力があったらプログラムBを動かす…。

 このような仕掛けによって、プログラムAが動いているにもかかわらず、プログラムBも "同時に" 処理されるのである。これがマルチタスク機能の本来の役目である。

 マルチタスクは、一度に複数のプログラムを手がけて、CPUをコキ使う手法なのである。


2006/12/30
●タスクスケジューラ

 CPUの暇な時間を活用して、別のプログラムを同時に動かすのがマルチタスクの本来の目的である。与えられたプログラムをなるべく早く終わらせるようには制御しない。

 仮に、ここにデータ更新プログラム(プログラムA)と、科学技術計算プログラム(プログラムB)があったとしよう。単体で実行すると、プログラムAが3分、プログラムBも3分かかるとする。非マルチタスクOSでは、どうやっても6分かかってしまう。

 プログラムAは大半を入出力に費やすのでCPUはほとんど暇で、CPUそのものは10秒しか使わないとする。一方、プログラムBは、延々CPUを使ってばかりいて、ほとんど入出力を行わない。
 この2つのプログラムを、マルチタスクによってうまく同時に処理できれば、シングルCPUでも同時に実行を始めて3分10秒で両方ほぼ同時に終わる。
 この効率の良さマルチタスクの利点である一方、3分で終わると期待していた処理が並列動作の影響で3分10秒に伸びてしまうのが欠点でもある。

 マルチタスクOSは、なるべく同時に処理するよう、タスクスケジューリングをする。もし、プログラムBの優先度を上げてしまうと、プログラムAを実行する隙がなくなってしまい、後回しにせざるを得なくなってしまう。プログラムBは開始後3分で終わるが、プログラムAは3分後からのスタートになり、すべてが終わるのが6分後になってしまう。速度を優先するほど効率が落ちてしまうのだ。

 科学技術計算あたりは、最も高速に処理して欲しい分野の1つではあるが、CPU時間を使い切ってしまうプログラムを優先的に動かしてしまうと他のプログラムを動かせない。
 そこで、タイマーで強制的に中断してOSに戻し、CPU負荷の高いプログラムほど優先度を下げ、CPU負荷の小さいものを優先的に行って、より多くのプログラムを同時に手がけられるようにするのである。

 複数のタスクをどのような順で・どのような優先度を付けて処理すれば、最も効率良く処理できるかを判断し、タスクを管理するのがタスクスケジューラの役割である。

 要するに、タスクスケジューラが「最も効率的」と判断された順序と優先度でタスクが動くため、マルチタスクによって、CPU効率は上がるが期待通りの速さではプログラムは動いてくれないのである。


2006/12/30

[戻る]