--2019-08-16 20時51分20秒[理論上の記事スレッド]

オリジナル:http://blog.gqylpy.com/gqy/231

"


まず、バックグラウンドスレッドの概念の導入

1.プロセス

ブログは前工程で一緒に、オペレーティング・システムの概念を入れている、プログラムを個別に実行することができない、唯一のプログラムがメモリにロードされ、システムはそれを実行するためのリソースを割り当て、このプログラムの実行は、それがプロセスと呼ばれます。違いは、手順およびプロセスである:このプログラムは、それが実行中のプロセスを説明する静的テキスト命令のセットである。プロセスは、実装活動のプログラムであり、動的な概念です。マルチチャンネルプログラミングでは、複数のプログラムがメモリにロードできるように、スケジューリングにおけるオペレーティングシステムは、並行して実施することができます。これは、大幅にCPUの使用率を向上させること、この設計です。プロセスは、各ユーザーが排他的CPUを感じるように見えるので、このプロセスはCPUに複数のプログラムを達成することであると提起しました。

スレッドがある理由の過程で2

プロセスは、私たちは私たちのそれぞれが独自のCPUや他のリソースを持っていることを感じさせ、それはマルチチャンネルプログラミングを提供し、多くの利点があり、コンピュータの利用率を向上させることができます。プロセスはとても良い、なぜそれのスレッドがあるので、多くの人々は、理解していませんか?実際には、よく見ると、プロセスには多くの欠陥は、主に次の2点で、そこにある明らかにする。

  • プロセスは、あなたが同時に2つのタスクを処理する場合、プロセスは何もできない、同時に一つのタスクを処理することができます。

  • あなたは、このようなI / Oを待機しているとして、実装プロセスの進展をブロックしている場合は、全体のプロセスは、プロセスを例いくつかの仕事に依存していない場合でも、中断されます、それは実行されません。

3.の出現スレッド

1960年代には、OSの基本的な単位は、リソースを持っているし、独立して、プロセスの実行され、その後、コンピュータ技術の発展に伴い、プロセスは、多くの欠点がありました。プロセスは、リソースの所有者は、作成、破棄されるので、まず、プロセスの切り替えの大きな時間のコストがあり、それが導入する必要がある軽量のプロセスを、第二は、SMP(対称型マルチプロセッサ)によるものであることは表示され実行されている複数のユニットを満たすために、そしてよりプロセス並列オーバーヘッドが大きすぎます。

このため、1980年代には基本的な単位は、独立して動作することができる登場 - スレッド(スレッド)。

注:プロセスは、リソース割り当ての最小単位であり、スレッドは、CPUスケジューリングの最小単位であり、各プロセスは、少なくとも一つのスレッドを有しています。


プロセスとスレッド間の第二、違い

ここに画像を挿入説明

1.アドレス空間とその他のリソース:データを共有するために、同じプロセスのスレッド間で、互いに独立してプロセス間では、プロセス内の他のスレッドは、このプロセスには見えません。

2.通信:プロセス間通信は、いくつかの手段を必要とするが、スレッド間で直接(同期と相互排他補助データの一貫性を確保することを意味し処理する必要が)通信する(例えば、グローバル変数など)のプロセスデータセグメントを読み書きできます。

3.スケジューリングとスイッチ:はるかに高速プロセス間よりも、スレッド間の切り替えスイッチ。

マルチスレッドオペレーティングシステム4.は、プロセスが実行可能なエンティティではありません。


糸の第三に、特性

マルチスレッド・オペレーティング・システムでは、通常、同じプロセス内の複数のスレッドを含む、CPU使用率の基本単位として、各スレッドは、コストが最小のオーバーヘッドエンティティであり、スレッドは、次の属性を有します。

1.ライトエンティティ

スレッドのエンティティはちょうど不可欠少しは独立してそのリソースを確保するために、本質的にシステムリソースを持っていません。エンティティは、スレッドプログラム、データを含む、TCB(制御ブロック制御ブロックスレッドのスレッド)、スレッドは動的特性TCBによって記述される動的な概念です。

  • TCBは、以下の情報が含まれています

実行すべき一連の命令を示すプログラムカウンタ、ローカル変数とリターン・アドレスをそのようなレジスタのセットとスタックとして状態パラメータの小さな数を維持

1.スレッド状態

2.スレッドがCPUのから追い出され、オンサイトのリソースを節約し、時間

3.実行スタックのシリーズ

ローカル変数のメモリ領域4.メインスレッド

5.アクセスここで、メインメモリおよび他のリソースの処理

2.基本的なスケジューリングの単位と独立のディスパッチ

マルチスレッドOSにおいて、スレッドは、スレッドは、「光」であるため、このようにしても、基本的な単位は、独立して動作可能なスケジューリングと基本ユニットの発送とは独立しているので、迅速にスレッドを切り替えて(同一工程で)非常に少ないオーバーヘッド。

3.共有プロセスリソース

同じプロセス内のすべてのスレッドは、我々は、各スレッドがどこプロセスメモリのリソースにアクセスできることを意味し、プロセスIDのすべてのスレッドで同じ性能を持つすべての最初の、プロセスのすべてのリソースを共有することができ、加えて、あなたはまた、プロセスにアクセスすることができますその上で開いているファイル、タイマー、セマフォのメカニズムと。プロセス内のスレッドと共有メモリとファイルなぜなら、そうカーネル・スレッドを起動することなく互いに通信します。

4. 同時実行

プロセス内の複数のスレッド間で同時に実行、さらにはすべてのスレッドが一つのプロセスで同時に実行することができる可能にすることができ、同様に、プロセス内の異なるスレッドが同時に実行することができ、プロセッサの完全な利用および周辺機器を並行して作業する機能。


第四に、メモリのスレッド

ここに画像を挿入説明

1.複数のスレッドはスレッドのリソースの同じアドレス空間を共有し、時には軽量プロセススレッドと呼ばれる、コンピュータ上の複数のプロセスのシミュレーションです。

異なるプロセス間2. iQIYIとテンセントビデオがリソースをつかむだろう場合、例えば、競争CPUの間の関係をお互いをつかむ、敵対的です。同じプロセスは、同じプロセス内のすべてのスレッドがパートナーシップで、スレッドが別のスレッドのメモリアドレスにアクセスすることができ、プログラムの同じプログラマによって作成され、誰もがダウン死んでスレッドのバックルを持っていない場合は、共有されていますメモリの別のスレッドが、それはプログラマの品質について考えなければならないでしょう。

、各スレッドは独自のスタックを持っている3.同様のプロセス; ライブラリはスレッド割り込みクロックを使用することはできませんスレッド、プロセスは異なるが、CPUを放棄することを余儀なくされていますが、スレッドが別のスレッドを実行させ、CPUを放棄実行しているthread_yield呼び出すことができます。

4.スレッドが通常有益であるが、それはまた、プログラミングの難しさの多くをもたらし、問題はスレッドです:親プロセスは子スレッドを開くスレッドの同じ数を必要とする、複数のスレッドがあり、同じプロセスで、場合別のスレッドがその中にファイルの内容を書くために準備している間、スレッドは、ファイルをクローズ?このように、マルチスレッドコードでは、我々は、プログラムロジック、データ保護プログラムの設計に多くの思考を必要としています。


第五に、ユーザレベルスレッドとカーネルレベルスレッド

ユーザーレベルのスレッドまたは軽量のスレッドのスレッド(ユーザーレベルのスレッド)、カーネルレベルのスレッド(カーネルレベルスレッド)、カーネルがサポートしているとしても知られている:実装スレッドは、2つのカテゴリに分類されています。マルチスレッド・オペレーティング・システムでは、様々なシステムの実装は、いくつかのシステムは、カーネルレベルのスレッドに実装され、いくつかのシステムでは、ユーザーレベルのスレッドを達成するために、同じではありません。

1ユーザレベルスレッド

自身がカーネルを切り替えるユーザプログラムによって制御されるスイッチコアは、カーネルが介入、少ない消費とカーネルモードの外にする必要はありませんが、マルチコアCPUを有効に利用することはできません。

ここに画像を挿入説明

ユーザ空間シミュレーションオペレーティングシステムのスケジューリングプロセスでは、プロセス内のスレッドを呼び出すために、各プロセスは、スケジューリングスレッドのランタイムシステムを持っています。このとき、プロセスがCPUを取得するときに、実行するために再スケジュールするスレッドのプロセスの中で、同時に複数のスレッドを実行します。

2.カーネルレベルのスレッド

ユーザーモードから変換スレッドの切り替えは、モードをカーネルにカーネルによって制御されるスイッチ。完了した後、カーネルモードから切り替え、ユーザモードに戻り、良好な使用、すなわちCPUを複数使用して、SMPができます。Windowsオペレーティングシステムのスレッドがケースになります。

ここに画像を挿入説明

ユーザーレベルのカーネルレベルのスレッドと3の比較

1.カーネルはOSのカーネルスレッドが認知されているサポートし、ユーザレベルスレッドはOSカーネルを認識していません。

有する、カーネルスレッドのサポート、離脱を作成し、OSカーネルスケジューリング支援を受けている; 2.ユーザレベルスレッドを作成し、スケジューリング失効は、OSカーネルのサポートは(Javaなどの)言語でこのレベルで処理される必要がありません撤回するプロセスを作成し、スケジューリングは一般的に同じです。

3.ユーザレベルスレッドの実行システムは、それぞれの呼出指示処理になり中断、およびカーネルスレッドは、システムコール命令の実装をサポートする、唯一のスレッドにつながる中断されました

4.ユーザレベルシステム内のスレッド、CPUやスケジューリング・ユニット、制御のユーザプログラム・スレッドの回転で実行中のプロセスの複数のスレッドのプロセスにのみ、システムカーネルサポートスレッドで、CPUスケジューリングを担当するOSのスレッドスケジューラによってスレッド、スレッド単位でのスケジューリングの場所。

ユーザレベルスレッドのエンティティプログラムは、ユーザーモードのプログラムで実行され、プログラムの実体はどのような状態でプログラムを実行するためにカーネルスレッドによってサポートされています。

  • カーネルレベルのスレッドの利点と欠点

長所:複数のプロセッサが存在する場合、プロセスの複数のスレッドが同時に実行することができます。

短所:カーネルによってスケジュール。

  • ユーザレベルスレッドの長所と短所

利点:

1.スケジュールがカーネルスレッドを必要としない直接関与し、シンプルなコントロール

2.内のスレッドをサポートしていないオペレーティングシステムに実装することができます

3. 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多

4. 允许每个进程定制自己的调度算法,线程管理比较灵活

5. 线程能够利用的表空间和堆栈空间比内核级线程多

6. 同一进程中只能同时有一个线程在运行,如果一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题

缺点:

1. 资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用

4. 混合实现

用户级与内核级的多路复用,内核统一调度内核线程,每个内核线程对应n个用户线程。

ここに画像を挿入説明

  • Linux操作系统的NPTL

历史:

在内核2.6以前的调度实体都是进程,内核并没有真正支持线程。它是通过系统调用clone()来实现的,这个调用创建了一份调用进程的拷贝,跟fork()不同的是,这份进程拷贝完全共享了被调用进程的地址空间。LinuxThread就是通过这个系统调用来提供线程在内核级的支持的(许多以前的线程实现都完全是在用户态,内核根本不知道线程的存在)。非常不幸的是,这种方法有相当多的地方没有遵循POSIX标准,特别是在信号处理,调度,进程间通信原语等方面。

很显然,为了改进LinuxThread必须得到内核的支持,并且需要重写线程库。为了实现这个需求,开始有两个相互竞争的项目:IBM启动的NGTP(Next Generation POSIX Threads)项目,以及Redhat公司的NPTL。在2003年的年中,IBM放弃了NGTP,也就是大约那时,Redhat发布了最初的NPTL。

NPTL最开始在redhat linux 9里发布,现在从RHEL3起内核2.6起都支持NPTL,并且完全成了GNU C库的一部分。

设计:

NPTL使用了跟LinuxThread相同的办法,在内核里面线程仍然被当作是一个进程,并且仍然使用了clone()系统调用(在NPTL库里调用)。但是,NPTL需要内核级的特殊支持来实现,比如需要挂起然后再唤醒线程的线程同步原语futex.

NPTLスレッドライブラリには、この方法は、Linuxの最大の可能な簡素化され、それはあなたが呼び出すときに、あるに応じてスケジューリングエンティティを作成したカーネルでは、pthread_createの()を使用してスレッドを作成し、新しいプロセスであり、1 * 1でありますスレッドを実現しています。

M×n個のモデル、このモデルは、典型的には1 * 1 NPTLモデル除くコアスレッドスケジューリングエンティティよりユーザの数です。それはカーネルモードには、システムコールを避けるため、内部スレッドライブラリのコンテキストで、通常は非常に高速に切り替えるので、この実装では、スレッドライブラリ自体は、スケジューリングに対応することが可能でなければなりません。しかし、このモデルはスレッド実装の複雑さを増大させ、かつ、そのような優先順位の逆転などの問題が発生する可能性があり、加えて、どのようにユーザーモードカーネルモードのスケジューリングが連携して実施スケジュールするためには、人々が満足させることは非常に困難です。

終了

"

オリジナル:http://blog.gqylpy.com/gqy/231

おすすめ

転載: www.cnblogs.com/bbb001/p/11366288.html