linuxを達成するために、古いものと新しいスレッド

カーネルの間に2.0から2.4までのLinuxカーネルを使用してプログラミングすることはLinuxThreadでマルチスレッドが、マルチスレッド・プログラムを作成するために、このメソッドを使用すると、新しいスレッドの実装を開始するために2.6カーネルからの多くの機能で、POSIX標準と互換性がありませんNPTL(ネイティブPOSIXスレッドライブラリ)。NPTLは、POSIX標準の機能と互換性LinuxThreadの大半を解決するために知られているというように、より良いパフォーマンス、拡張性と保守性などを提供しています。

一、LinuxThread

LinuxThreadを実装する前に、カーネルは、スレッドの任意のサポートを提供していませんが、LinuxThreadだけPOSIXで定義されたユーザーインターフェイスを模倣しようとするいくつかの呼び出しを作成するために、既存のシステムを使用できるようにも、LinuxThreadを達成するために当面は変更を加えませんでしたPOSIX規格にスレッドの動作によって実証システムコールインターフェースのpthreadの外部に導出されたAPIのセマンティックスは、GETPIDにおける同じプロセスの異なるスレッドで最も簡単な呼び出し()矛盾した結果として、矛盾しています

スレッド作成:LinuxThread 1つの* 1つのモデルを使用して、各ユーザが有するカーネルモードスレッド管理エンティティの対応を有し、管理エンティティに対応する、このカーネルはまた、LWP(軽量プロセス)として知られるプロセスです。私はおよそここでお話しましょう、システムがクローン()を呼び出し、よく知られたフォーク()関数は、新しいプロセスを作成するために、親プロセスのコピーを実装するためにクローンを()を呼び出すことです。システムコールのクローン()フラグ引数がある、旗の多くは、フラグがコピー中に同じメモリ空間を使用するかどうかCLONE_VMの定義であるクローンコピーする必要があるかを指定、ということがあります。フォーク()呼び出しクローン(セットではありませんCLONE_VM時間)ので、カーネルプロセスは、2つの異なるメモリ空間をもたらしているようです。CLONE_VMが設定されたときに、クローン中のpthread_create()の呼び出しは()ので、カーネルのルックスは、同じメモリ空間を持つ2つを生じさせたことをプロセスだから、新しいプロセスを生成するために、新しいスレッドユーザーモード、カーネルモードの対応を作成します。

相互に排他的な同期:カーネルがスレッドの任意のサポートを提供していません、もちろん、専用のスレッド同期プリミティブのために利用可能なシステムが存在しませんが、要件の多くでは、標準のPOSIXスレッドには、それを行うにはどのように相互に排他的な同期インタフェース、ですか?LinuxThread使用アナログ信号は、ミューテックスのように、私は一般的なプロセスは以下の通りである推測、相互に排他的な同期化するために:すべてのカーネル特定信号アウトプロセスマスク、及びに殺す新しいミューテックスを()信号を送信するために、等スレッドの実行がロックされたときに任意の信号を送信した場合、使用にsigwait()は、参照するのを待つていない場合、ロックの等価が返されます。ロック解除時に、もはや(殺す)は、この信号をアサートします。いくつかの信号が同期ミューテックス、それをシミュレートするために使用さそうLinuxThread?一部のドキュメントには、対応するマニュアルスレッドライブラリの具体的な進展を見ることができ、いくつかは、いくつかのリアルタイム信号を言う、SIGUSR1とSIGUSR2を言います。あなたのマルチスレッドプログラムはまた、これらの信号を使用している場合、それは混沌のスレッドAPIの仕事につながるので、あなたが使用するために使用されるいくつかの信号の内部スレッドライブラリのかを知る必要があります。

    線分析から引き出すことができる、LinuxThreaミューテックス同期は、非効率的なので、完全なアナログ信号であり、信号処理の元のプロセスに影響を与える可能性がある、実際に深く欠陥があります。

信号処理:信号処理LinuxThreadの動作はPOSIX標準はオッズで完全であると言うことができます。信号配信プロセスがカーネルで発生し、対応するコア内の各スレッドが別のプロセスであるため、何のカーネルのサポートはありませんので、あなたがプロセスに送信そうするとき、(LinuxThreadスレッドの作成を理解していない参照)信号の後、唯一のプロセスのプロセスIDが反応している必要があり、それらは異なるプロセスIDが応答できない持っているので、LinuxThreadは、POSIXと一致していないので、このプロセスに属するスレッドが動作を定義します。

スレッド管理:ここにあなたが最初のスレッドを作成するときの特性LinuxThreadを言わなければならない、それが自動的にスレッド管理を作成し、このプロセスは、ユーザーに対して透過的です。だから、あなたがスレッドpsの結果を作成するときには、まだ、LinuxThreadスレッドライブラリを使用している場合は、次の3つの代わりに、2と同じプロセスになります。このスレッドの主な役割は、あなたがゾンビプロセスを表示しますスレッドを終了するときに、このスレッドの管理を殺すそうならば、管理及び終了管理スレッドを作成することです。スレッドの作成と管理の終了がプログラムの頻繁なスレッドの作成と終了に、このスレッドを通過するため、また、このスレッドは、パフォーマンスのボトルネックになる可能性があります。

 

二、NPTL

多くの欠陥を実現するためにカーネルスレッドでサポートされていないLinuxThreadので、そのPOSIXスレッド標準スレッドライブラリに完全準拠を達成するためには、書き換えられたスレッドライブラリは避けられません

スレッドを作成します:NPTLも1 * 1のモデルを使用していないが、今回は、対応するコア管理体制はもはやLWPです。プロセスを管理するには、グループ・プロセスの概念を持っている、そしてそれは、スレッドのスレッドグループの概念を管理するためのカーネルは非常に自然です。以下に示すようにのみ元のプロセス管理構造のLinuxカーネルは、TGIPフィールドを追加します。スレッドがPID TGIDに等しい場合、このスレッドは、スレッドグループのリーダーであり、そのPIDは、このスレッドグループのプロセスIDです。あなたはGETPIDリターンを使用するときにPIDスレッドの先頭へスレッドグループTGID視野点のすべてのスレッドは、TGIDフィールドであり、スレッドはPID番号フィールドが返されます。だから、次のNPTLスレッドは、それを作成する方法についてのスレッドですか?また、クローンの使用()システムのスケジューリングが、クローン()の呼び出しの新しいフラグのパラメータはフラグが新しいスレッドを作成するために設定されている行動は、初期時にカーネル内部管理構造を作成するときに、フラグCLONE_THREADを追加しますTGID点PID発信者、(プロセスID前)新しいスレッドの数を埋めるために、元のPID位置。カーネルでPOSIX標準誤差と不適合としてLinuxThreadから除去される生成LWPです。

同期と相互排他:同期と相互排他ので新しいミューテックスカーネル同期プリミティブのfutex(高速usesapaceロックシステムコール)を添加すること、LinuxThreadから糸をアナログ信号を使用することの欠点を見ることができ 、 高速ユーザ空間を意味しますシステムロック。プロセス内のすべてのスレッドが同じメモリ空間を使用しているため、ロックがユーザ空間に保存することができそう。このような操作が大幅にアクセス速度を加速し、それぞれの時間を切り換えて、カーネルモードにこれをロックする必要はありません。提供NPTLスレッド同期相互排他機構はとても効率の点で、のfutexに基づいているか、騒音が大きくLinuxThreadウェイよりプログラムに外部の影響が改善されています。具体的な記述のfutexはfutexにする男があります。

信号処理はこの時点でスレッドが同じプロセスの一部であるため、同じプロセスは、信号は、POSIX標準の完全な統一して処理します。あなたはSIGSTPプロセスにシグナルを送信すると、このプロセスのすべてのスレッドが停止されます。同じメモリ空間内のすべてのスレッドは、信号SOのハンドラは同じですが、異なるスレッドが異なるマスクを持つことができるように、異なるスレッドは異なる管理構造を持っているので。また、LinuxThreadの設立の背後にこのセクション。

管理スレッド:カーネルの年末までスレッドの作成と管理が消滅したLinuxThreadスレッド管理メカニズムからリードする問題を担当しています。もちろん、システムスケジューリングは依然として全体としてスケジューリング処理を形成する代わりに、複数のスレッドの別のスレッドです。これは、POSIX標準またはわずかに異なるであるが、この欠点は無害と思われます

公開された504元の記事 ウォンの賞賛610 ビュー114万+

おすすめ

転載: blog.csdn.net/asdfsadfasdfsa/article/details/103648624