マルチタスクについて

作成:

スレッドについて理解するに当たって、まずはマルチタスクとは何かというところを押さえておこうと思う。 ある程度プログラミングやコンピュータについて理解できている人であれば、 何を今更といった内容になってしまうかもしれないが、改めて説明しろと言われれば意外と難しかったりするのである。

まず、押さえておくべき原則として、コンピュータ(CPU)は一度に一つのタスク(仕事)しか実行することはできない。 いろいろと説明を省いているため、正確ではないものの大きくは間違っていないと思う。 タスクというのは何らかの入力を元に何らかの処理を行い、何らかの出力を行う一連のコンピュータに与えられる「仕事」を指している。 しかし、現実に世の中にあふれるコンピュータ応用製品、パソコンにせよ、タブレットにせよ、スマートフォンにせよ、現代では、そのような制約を感じさせるものはおそらくないであろう。

説明を省いているのだが、CPUと言っても最近はマルチコアだったり、 物理的にはひとつのコアでも論理的に複数のコアだったりしてややこしいのだが、 大雑把に言って、ここでいうCPUと言うのは論理含めた一つのCPUコアだと考えてもらいたい。 そんな感じで近年のCPUは複数のコアが搭載されており、複数の処理を同時に実行できるようになっている。 とはいえ、4コアのCPUを搭載したパソコンだったとしても、同時に実行できる処理が4つまでという制約はないはずである。 たとえユーザが操作しているソフトが一つだけだったとしても、実際にはそのソフト内で、ある操作をしている間に別の処理を行っているだろうし、 パソコン全体で見れば、ほかのアプリも動いているだろうし、OSそのものやそれに付随するサービスとなると、少なくとも数十個のタスクが同時に動作しているはずである。

では、どのような仕組みになっているかといえば、簡単に言うと、一度に一つしか実行できないのであれば、 時間を細かく区切って、複数のタスクを少し実行しては別のタスクを実行して・・・と、いうことを繰り返し行うのである。 そうすると全体的には並列して複数のタスクが実行されているように見える。ということである。 この仕組みはかつて高価なメインフレームを同時に複数のユーザが使えるようしたタイムシェアリングシステム(Time Sharing System, TSS)で使われた仕組みと同じ考え方である。

この程度のことはある程度パソコンなりに精通している人なら当然のごとくわかっているという人のほうが多いぐらいだとは思うが、 基本中の基本が抑えられていないと次に話が進められないためあえて説明した。

こんな具合に、ある処理をちょっと実行したら、別の処理を行う。ということが繰り返されているのだが、この範囲での用語をおさらいしておく。

コンテキスト
いろいろなところで使われ、様々な意味で使われる用語ではあるが、ここでは、タスクには文脈を指している。 具体的に言うとレジスタの値など、その処理を実行している状態である。 処理を中断する際はこのコンテキストを保存しておき、続きを実行するにはこれらを復元しなければならない。
コンテキストスイッチ
処理の文脈を切り替えること。上記コンテキストを保存し、別のタスクの保存されていたコンテキストを復元し、実行する処理を切り替える。
タイムスライス
いろんな処理を時分割で少しづつ実行するのだが、このタスクに割り当てられるCPU時間のこと
スケジューラ
どのタスクにどのような順番でどのぐらいのタイムスライスを割り当てるかを決定する仕組み

これまでの文脈にも出てきたが、ある一連の文脈を持った処理をタスクと表現したりするが、似たような意味を表す言葉に、プロセスとかスレッドというものがある。 いずれも、CPUが実行する一連の文脈を持った処理を表す意味で使われ、本当に厳密な定義となると結構曖昧なところのある言葉であるが、これらの違いをだいたい説明すると

プロセス
各プロセスはそれぞれ独立したメモリ空間を割り当てられる。 そのため、あるプロセスで参照しているメモリを他のプロセスから読むことは原則できない。 ポインタがメモリのアドレスを示しているということを聞いたことがある人は多いと思うが、 このアドレスはプロセスごとに割り当てられたメモリアドレス空間でのみ有効な仮想メモリアドレスと呼ばれるもので、 物理的なメモリアドレスとは別のものである。
スレッド
通常一つのプロセスは一つ以上のスレッドで構成される。 あるプロセスの中にあるスレッド間でメモリ空間は共有されており、 あるスレッドが参照しているメモリを別のスレッドからも参照できる。
タスク
CPUの処理単位などといった意味でタスクが利用される。 スレッドを指している場合が多いが、プロセスの場合もある。 また、あるスレッドが実行する、より小さい仕事をタスクと呼んだりもする。 また、一部のリアルタイムOSにおいてはプロセスやスレッドという区別がなく、タスクという言葉だけで表現する物がある。 この場合のタスクは、タスク間でメモリ空間が共有されているので、概念的にはスレッドに近い意味で使われる。 そういうわけで、タスクという言葉はかなり曖昧な言葉である。