環境に本稿でテストコードを操作:
Centos7 x86_64の
カーネル3.10.0-693.5.2.el7.x86_64
GCCバージョン4.8.5
CPU:2コア
マルチスレッドの概念
スレッドは、プロセスのタスクを処理する分岐、メインスレッドを含むプロセスを実行しています。
プロセス:リソース割り当て、(等メモリ管理、開いているファイルの管理)管理の基本単位。
スレッド:スケジューリング、実行の基本単位。
Linuxでは、また軽量プロセスのスレッドとして知られていますLWP。
あなたは、新しいプロセスを作成するたびに、それが新たな仮想アドレス空間が割り当てられます。
たびに、元の仮想アドレス空間に新しいスレッド、スレッドの共通を作成します。
Linuxカーネルの観点から、実際には、それはスレッドの概念ではありません。Linuxのプロセスとしてすべてのスレッドは、実装されたスレッドとtask_structに無差別団結を処理しています。
スレッド間のリソースの共有
- 仮想アドレス空間。
- ファイルディスクリプタテーブル。
スレッドが作成されると、それはそう、CLONE_VMマークを追加しましたスレッドのメモリ記述子が親プロセスのメモリ記述子に直接指します。
if (clone_flags & CLONE_VM) {
// current 是父进程而 tsk 在 fork() 执行期间是共享子进程
atomic_inc(¤t->mm->mm_users);
tsk->mm = current->mm;
}
スレッド間でリソースを共有しないでください
- スタック。
- コンテキスト情報(レジスタ情報)。
- errnoを(各スレッドはそれ自身の別個のエラー・コードを有しています)。
Linuxプロセスあるいはメインスレッドの場合、そのスタックはフォークが実際に父親のスタックのアドレス空間をコピーしたときに発生し、その後の書き込み時(牛)とダイナミックな成長をコピーしています。
しかし、サブスレッドを作成するために、メインスレッドのために、そのスタックは、もはやそのようなのではなく、事前に固定できなくなります。
疲れが異なる場所で発生し、フォークのプロセスである、なくなっていたら、スレッド・スタックは、動的に拡張することはできません。
メリットのスレッド
以下のためのプロセスと比較すると:
- 小さなコストの作成と破棄。
- オーバーヘッド切り替えスケジューリングが小さくなっています。
- スレッドには、少ないリソースを消費します。
マルチスレッドプログラムでは、マルチコアプロセッサを利用することができます。
栗:私の仮想マシンは2コアであるため、そのほとんどのCPUを200%を使用します
欠点スレッド
- スレッドの異常終了を低減するためのプログラムの堅牢性は異常に全体のプロセスを終了する原因となります。
- (スレッド安全性の問題の導入)より困難をデバッグ&&プログラミング。
使用糸
- 効率を高めるためにCPU集中プログラム。
- 経験を改善するためのIOの集中プログラム。
- IOは、ネットワークを介して行きました。
- 応答のUIインターフェイスで。
EOF