2011年12月15日
某氏が悩んでいたようなのでこっちである程度わかっていることを書き連ねてみたり....
最終的にCPUが処理を行う単位は「タイムスライス」という時間です。
(あくまでもOS側から見た「処理単位」の話、CPU側はマシン語で実行できる単位で処理が行われます)
そのタイムスライスを複数まとめたものを「クォンタム」といい、これが「タスク」を処理する最小単位となります。
(クォンタムのタイムスライスの数はOS毎に異なります)
OSはこのクォンタム毎にタスクを切り替えて見かけ上、複数のタスクを処理しているように見せます。
「スレッド」というのは通常のプログラム上ではタスクと同じになります。
タスク上では複数のスレッドを発生することはできますが、上記処理を行う関係上、複数のスレッドを発生させても実行時間は変わりません。
複数のスレッドを発生させて実行時間を短縮できる可能性があるケースはCPUが「複数」存在するケースとなります。
タイムスライスを実行できる「環境」がCPUに依存しているわけなので同時に複数のタイムスライスを実行するためには複数のCPUが存在する必要があります。
これがマルチスレッドで処理を行う本質です。
で、それを期待してマルチスレッドで処理時間を短縮するプログラムを作るわけですが、これがちょっと面倒です。
基本的にスレッドとスレッドでは同期を取るような仕組みは備わっていません。
もともと異なるタスクを複数のCPUで処理するように作られているためにそれぞれが独立して動作するようになっているためです。
従ってスレッド間の通信を行う必要があります。
例えばAという計算処理とBという計算処理をそれぞれスレッドを立てて実行し、その計算結果を合算するというようなプログラムの場合、AとBの実行速度が異なる場合には合算処理を行うプログラムはどの状態をもってそれぞれの処理が終了しているかを認識できないといけません。
C言語のプログラムを知っている人はちょっと考えると分かると思いますが、グローバル変数は設けないことになっているはずです。(プログラム規約上)
するとローカル変数かポインタで....となるはずですが、どっちも相互に受け渡しをするには結構面倒な作業になることは想像できると思います。
あとはスレッドの構成をちゃんと管理しておかないと最初に終了したスレッドと最後に終了したスレッドの差をできるだけ小さく作らないと無駄な待ち時間が発生してしまいます。
こんなとこかなぁ...........本来の業務はハード屋なんですけどね(笑)
詳細は聞かないでね、概念的に知っているだけなので(笑)
Posted at 2011/12/15 21:36:22 | |
トラックバック(0) | 日記