2013/08/19

プロセス スレッド タスク ジョブなど

・プロセスはプログラムの実行単位である.プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される.



・スレッドは CPU 利用の単位である。スレッドはそれぞれが専用のスタックと CPU レジスタのコピーを保持するが、ファイルやヒー


・プメモリは同一プロセス内の全てのスレッドで共有する。



・スレッドのさらにサブセットがファイバである。スレッドとの違いは切り替え動作にありファイバのほうが軽いというメリットがある



・これはわかりやすい
プロセスはプログラム実行のための固有のメモリ空間を持っており、最も独立性の高い実行単位である反面、起動や切り替えに時間がかかるという特性を持っている。これに対してスレッドはプロセスのサブセットとして動作し、実行に必要なメモリ空間を複数のスレッドで共有。このため起動や切り替えのオーバーヘッドが小さく、“Lightweight Process(軽量プロセス)”とも呼ばれています。ファイバとはスレッドをさらに軽量化したもの。スレッドとの違いは切り替え時の動作にあります。スレッドの切り替えにはユーザーモードからカーネルモードへの移行が必要なのに対し、ファイバではユーザーモードのまま他のファイバへ処理を切り替えることができる。このためスレッドよりもオーバーヘッドが小さく、マルチプロセッサ環境ではプロセッサ毎に同期化スケジュールが作成されるため、プロセッサ間の同期処理で発生するスピンロックも回避できる。
==>it seems that create a thread is  very cheaper................




・だから、わからない。。。もやもや
タスクという言葉は曖昧である。(1) プロセスと同じ意味で使われる場合、(2) スレッドのことを指す場合、あるいは (3) プロセスよりも大きな集合として使われる場合もある。

        ファイバ ∈ スレッド ∈ プロセス (= タスク)
        ファイバ ∈ スレッド (= タスク) ∈ プロセス
        ファイバ ∈ スレッド ∈ プロセス ∈ タスク

Linux のカーネル開発者は「スレッド」や「プロセス」というかわりに、「タスク」という言葉をよく使う点に注意。しかし、対外的なドキュメントには、プロセスという言葉を使う。
       
環境により違う。。ちなみに Windows では個々のアプリケーションはプロセスとして動作するが、それを確認するツールの名前はタスクマネージャーと呼ばれており非常に紛らわしい(まぎらわしい)。Linux の世界でもタスクという言葉は曖昧なようだ

組み込み系ではシステム全体が1つのプロセスであり、それに含まれるスレッドに相当するものがタスクと考えるとしっくりくる

「ジョブ」とは、プロセスと似た概念で、現在実行中のプログラムのことを指す。ジョブとプロセスの違いは、
% ls | more
のようなパイプを使った場合に現れる。ls と more はそれぞれ別のプロセスだが、ls | more はひとつのジョブである。上記の場合、ls を実行したまま more を止める、というような操作は (操作している人にとっては) あまり意味がない。操作している人の立場から見て、複数のプロセスをグループ化したものがジョブである。

スレッドとファイバーの決定的な相違は、スレッドの実行はオペレーティングシステムのスケジューラーに制御されますが、ファイバーの実行はアプリケーションが自ら制御できる点です。オペレーティングシステムは、ファイバーの実行に CPU 時間の割り当て(つまり限定)を行ないません。

見よう見真似で動くプログラムは書けたりするのですが、OS や CPU のレベルですっきりと理解するのはなかなか難しいです。特に処理系による違いまで出てくると…。
ハイパースレッディング、マルチコア、マルチCPUにより擬似的ではなく複数のスレッドが本当に同時に実行されるようになると、そのポテンシャルを出し切るためにはより深い理解が必要になってくると思う