1.マルチタスクとは
複数のタスクを同時並列進行(処理)するマイコン(コンピュータ)システムの事を言います。「タスク」とはマイコンシステムが処理するプログラムの処理単位の事です。
例えばパソコンは複数のアプリケーションを起動しながら作業ができます。表計算アプリを起動し表計算処理を行いながら、メール送受信を行いメールが届いたらメールを確認しています。
しかし、コンピュータ(パソコン)は複数のプログラムコードを同時に処理することが出来ず、ひとつのタクスを順番に処理を行っています。 実際はOSが1つのタクスを細かく分割し、素早く切り替えながら高速に実行することで、あたかも複数のタクスが同時に実行しているようにい見えているのです。
UNIX系OS、Windows、Mac OS,などマルチタクス可能なOSをマルチタスクOSと言います。また、MS-DOSなどマルチタクス機能がないOSをシングルタスクOSと言います。
コンピュータはプロセッサ(CPU)、記憶装置・ディスプレイやキーボードなどのヒューマンマシンインターフェース・ネットワークインターフェースなどのインターフェイスなどから構成されています。 一般的には、CPUの演算処理時間に比べて、ディスプレイやネットワークの処理時間は数十から数百倍遅いです。シングルタスク環境では、逐次処理が行われるため、入力待ちや通信待ちなど、マイコンシステムの処理を実行できずに、待ち時間が発生します。 マルチタスク処理の導入によって、これらの待ち時間の間にマイコンシステムを動作させ、別の計算を行い、全体としての処理時間の短縮を実現することが可能になりました。
さらに、並行プログラミング*1の手法が利用でき、機能をタスクとして分割することで、ソフトウェアの再利用性を上げる事ができます。
一つのCPUしかないマイコンシステムでは、ある瞬間にはひとつの処理しか実行できません。しかし、CPUの処理時間を数十ミリ秒といった非常に短い時間で区切り、各タスクを切替て一つのCPUで順番に使い回すことによって、使う側から見ると、複数のアプリケーション(タスク・プロセス)が同時に実行されているように見えます。
タスクの切り替えのオーバーヘッドや、キャッシュやトランスレーション・ルックアサイド・バッファのミス率の上昇などのコストがかかりますが、入出力待ちなどであるタスクの実行が止まっても他のタスクが実行されるため、全体としてスループットの上昇が期待できます。
*1並行プログラミング
複数の計算あるいはアルゴリズムを、同じ期間に同時に実行させながら相互に同調(コンカレント)させて、次の期間の開始までに互いに完遂させる計算方法の事です。
2.マルチタスクの種類について
マルチタクスOSで実行しているアプリケーションを切り替える方法に「ノンプリエンプティブ方式」と「プリエイティブ方式」がありますのでそれについて説明します。
2-1 ノンプリエンプティブ マルチタスク方式
一つのマイコンシステム(CPU)で並行して複数の処理を進め、OSがCPUを管理しない方式。タスク制御をアプリケーション側に依存しています。1つのアプリケーションが実行している間は他のアプリケーションの実行が制限されます。 昔の性能の低いコンピュータで実用的に使用されていましたが、そのアプリケーションの処理を終了しなければ他のタスクを実行出来ません。 その為、そのアプリの処理中にエラー等が発生するとシステム全体が停止する事も有りました。
各タスク自身が、短い時間間隔でOSに処理を返す方式によって実現されているものを、ノンプリエンプティブ マルチタスク(協調的マルチタスク)といいます。 例えばイベント待ちの行列を参照する際などにタスクが自分でOSに制御を渡す。OSがCPUの資源を管理する必要がないので処理は少なくて済みます。
しかし、長時間CPUを占有し続けるタスクが存在すると、実質的にシングルタスクと同じになってしまうという欠点が有ります(例えば、特定のタスクが無限ループに陥るなどOSに処理を返えせなくなると、他のタスクを道連れにしてシステムがハングアップすることになってしまいます。 初期のMac OSやWindows 3.xなどはこの方式の様です)。
2-2 プリエンプティブ マルチタスク方式
OSがCPUやシステム資源を管理し、CPU使用時間や優先度などによりタスクを実行状態や実行可能状態に切り替える方式。OS側の処理が複雑になりますが、前記の様にアプリケーションがエラーで停止しても他のアプリに影響を与えずに処理を行います。
タスクの切り替えにはハードウェアタイマ割り込みが用いられることが多く、この場合割り込みによって一定時間内(タイムスライス)に強制的にオペレーティングシステム (OS) に制御を移す方式になります。OSが TSS*2の場合、一定の方式に従い次のタイムスライスを実行中のタスク・プロセス・スレッド(マルチスレッドOSの場合)に割り当てます。また、OSはシステムコール処理のタイミングにおいて、より優先度の高いタスク・プロセス・スレッドに CPU サイクルを割り当てる。これらのことをプリエンプション (横取り) という。
この方式を特に指す場合はプリエンプティブなマルチタスクと言います。 Unix系(Linuxなど)のシステムや、パーソナルコンピューター用商用OSでは、OS/2、Windows9x系、NT系Windows、macOSなどが有ります。企業向けシステムのメインフレーム用OS(タイムシェアリングシステム)などもほぼ全てこの方式の様です。一定時間内にOSに制御が戻るため、システム全体の堅牢性が高く。
一方、OSがCPU時間を管理する必要があり、また、一定時間毎にタスク切り替え処理が発生するため、処理にはコストがかかりますが、現在のCPUの能力向上と共にそのコストは問題にならなくなっており、現在は、メリットの多いこちらの方式が主流の様です。
タスクを切り替える間隔をクオンタム*3と呼びます。この時間が長ければ長い程、システムの負荷が低い。しかし、一定期間内で同時に処理できる数はクオンタムに反比例します。この為、サーバ向けのOSではクオンタム*3は短くして応答を良くする様に調整されています。
なお、OSによっては入出力割り込みやシステムコールの呼び出しによってプリエンプション*4を発生させるものもある。マルチタスクを最初に実現したオペレーティングシステムであるMVSは、入出力割り込みを基本としている。
*2 TSS:【Time Sharing System】 タイムシェアリングシステム
TSSとは、コンピュータの処理時間を決まった短い時間に分割し、それぞれ異なるプログラムに順番に割り当てることで、並行して効率的にコンピュータを利用できるようにするシステム。
*3 クオンタム
タスクを切り替える間隔の事を言います。
この時間が長ければ長い程、システムの負荷が低いですが。一定期間内で同時に処理できる数はクオンタムに反比例します。 この為にサーバ向けのOSではクオンタムは短くして応答を良くする様にしています。
*4 プリエンプション
プリエンプションとは、コンピュータ上で実行中のプログラム(タスク)を強制的に一時中断し、他のプログラムの実行に切り替えることで、オペレーティングシステム(OS)のタスクスケジューラが実行中のアプリケーションに対して行う操作の一つです。
OSがCPUの割り込み機構などを利用して実施する操作のこと、現在実行されているタスクの実行状態を保存して強制的に停止し、同様に中断されていた他のタスクの実行を再開させます。