さーて、適当なことをほざいて逃げるPCコーナーです。
PentiumD/XEの登場、そしてOpteronのDualCore/Athlon64 x2の登場によりデュアルコアは一気に浸透する勢いを見せています。
前からやってたりした人は良く知ってると思いますが、いまだに「デュアルCPUで爆速だぜ!」とか思ってるあんぽんたんが居てはなんか悲しいので、ここらでいっちょ適当に解説してみましょう。
暇じゃないときは飛ばしとけ。
WindowsはマルチタスクのOSです。マルチタスクって何だよ。ってハナシですよね。この辺をしっかり理解しておかないとハマります。
あなたのパソコンは、音楽を再生しながら、Webサーフィンとか出来ますよね。これが「マルチタスク」です。このとき、CPUはどんな風に動いているんでしょう。
—————>時間経過
|A|B|A|B|A|B|A|B|A| ←CPUのやってる仕事。
Aをブラウザの処理、Bを音楽再生処理とします。
マルチタスクのOSとは上記のようにCPUの処理能力を非常に短い時間で細切れにし、その細切れの一つ一つに異なる処理を次々と渡していくわけです。
非常に短時間でそれぞれの処理を行うため、実際の見かけ上、二つの処理が平行して動作しているように見える仕組みです。
分かりやすく言うと、10円玉二枚をすばやくこすり合わせると三枚に見えてしまうのと、やってることはまったく同じです。
#すごく大雑把に言っています。中身は実際はさらに細分化されていくので、ここまで単純ではありません。
これが、マルチタスクと呼ばれる処理です。なので、Aの処理がやたら多いときなどは、
AAAAAAABAAAAAABAAAAAAB
みたいに割り振られてしまって、Bの処理がちっともすすまず、「重い」とか停止しちゃったように見えてしまうわけですね。また、多数のアプリを起動してしまった場合も同様に、
ABCDEFGHIABCDEFGHIABCDEFGHI
なんてなってしまって、同一時間内でのBの処理回数が著しく少なくなってしまいます。
Bを音楽再生、としているので、このとき発生するのが、いわゆる音とびです。
また、処理内容によっては、割り込みを不許可(CPUをほぼ独占する)形での処理を行うものもあります。
これらが処理を開始してしまうと、その処理が一段落するまで、他のアプリケーションはCPUを利用できません。
こういった複数の要因によって、PC利用上のいわゆる「重い」状態が発生してしまうわけです。
ここまでOK? 次いくよ?
次に、スレッドとプロセスのお話。
プロセスっていうのは、こまかいこというとまるっきり違うんだけど、ソフトのことだと思っちゃってくれ。
メインメモリ上にある、異なるアドレス空間を持つプログラムゆーたってわかんないしょや。
メモリを共有する高速スイッチ可能な極めて小さな処理単位で、プロセスはスレッドの入れ物に過ぎない、ゆーても通じないでしょうし。
なるべく分かりやすく書いてみますが、それゆえに嘘も入り混じります。単純に表面的な概念だけ通じればいいので、別に極めて正確であったり、情報としての価値が低くてもいいのだw
だいたいがすでに嘘ばっかり書いてますからね? あまり真に受けて吹聴すると「ウソつき♪」になりますのでご注意をww
アプリケーションはいくつもの処理を行います。たとえばネットゲームなら
・ネット回線でデータを送受信する
・ゲーム画面を描く
・キー入力を受けつける
・サーバからのデータ内容にあわせてクライアント側の状態を書き換える
etc,etc.
これらの処理は、それぞれである程度完結する処理です。プログラムで言えば、サブルーチンのように、ある程度ひとまとまりになった処理です。
プロセスは、これらの「ある程度ひとまとまりになった処理」をひとつの単位としてCPUに仕事として渡すことができます。これが、スレッドと呼ばれる単位です。
#すでに大嘘だが、まあ嘘も方便…。
先ほどのCPUの処理時間を小分けに使っている、AやBというものこそ、スレッドやプロセスをあらわしているものになります。
しかし、このスレッド処理はプログラム側で意識して作成してやらないと、基本的には生成されません。
CPU時間に割り当てられるのはプロセスの処理が細切れにされるだけです。
スレッドはプロセスとは異なり、非常に大きな利点を持ちます。
それは、スイッチングが非常に高速に行える、ということです。
上記の例で行きますが、
ABABABAB
とCPUに処理される場合、A/Bがプロセスとして稼動していた場合のA->Bの切り替え時間と、スレッドとして稼動しているA->Bの時間はケタ違いに違います。
高速な処理を要求するアプリでは、基本的にスレッド処理を行い、適切なサイズのスレッドを生成して処理してやることが、キモになってくるわけです。
また、ソフトウェアの一部分だけが機能しなくなった場合、プロセス実行の場合、ソフトウェア自体がハングアップします。
しかし、処理の多くをスレッドに分割していた場合、異常の発生したスレッドのみを停止させ、スレッドを再起動することでソフトウェア自体が止まってしまうことを避けることが出来ます。
こちらは、特にサーバアプリケーションでよく利用される方法ですね。
つまり、スレッドは、使おうとしなければ、使われないのです。そして、コレこそがマルチプロセッサのシステムでのカンチガイを生む事があるのです。
続きはまた今度。