ホームページ  >  記事  >  システムチュートリアル  >  スレッドとプロセスの違い: プロセスはリソースを割り当てるための基本単位であり、スレッドは独立して実行される制御フローです。

スレッドとプロセスの違い: プロセスはリソースを割り当てるための基本単位であり、スレッドは独立して実行される制御フローです。

王林
王林オリジナル
2024-07-23 10:57:541059ブラウズ

スレッドとプロセスの違い: プロセスはリソースを割り当てるための基本単位であり、スレッドは独立して実行される制御フローです。

スレッド: プロセス内の単一シーケンスの制御フローです(まとめて軽量プロセスと呼ばれます)

スレッドは、オペレーティング システムが計算スケジューリングを実行できる最小単位であり、プロセス内での実際の操作単位です。複数のスレッドを同時に実行できます。プロセス内で使用されるスレッドは、オペレーティング システムのカーネルによってスケジュールされたカーネル スレッドです。

同じプロセスの複数のスレッドは、仮想アドレス空間、ファイル記述子、信号処理など、プロセス内のすべてのシステムリソースを共有します。

ただし、同じプロセス内の複数のスレッドには、独自の呼び出しスタック、独自のレジスタ環境、および独自のスレッド ローカル ストレージがあります。

スレッドとプロセスの違いは次のとおりです: 一般に、プロセスには複数のスレッドLinux プロセスとスレッド カーネル を含めることができ、オペレーティング システムでは、プロセスが基本とみなされます。リソースを割り当てる単位であり、スレッドは独立動作および独立スケジューリングの基本単位であるため、躊躇スレッドはプロセスよりも小さく、基本的にシステム リソースを必要としません。

プロセスは命令実行本体として少なくとも 1 つのスレッドを必要とし、プロセスはリソース (CPU、ビデオ メモリ、ファイル記述子など) を管理し、スレッドは実行のために CPU に割り当てられます。

スレッド モデルは、コア レベルのスレッドとユーザー レベルのスレッドの 2 つのスレッド モデルに分けられます。分類基準は主に、スレッド スケジューラがカーネル内にあるか、カーネル外にあるかによって決まります。後者はマルチの同時使用に適しています。 -プロセッサ リソース、前者はコンテキスト スイッチングのオーバーヘッドをより考慮します。

内核进程和内核线程_linux进程与线程 内核_linux内核线程和用户线程

Linux カーネルは軽量プロセスのサポートのみを提供し、より効率的なスレッド モデルの実装を制限しますLinux プロセスとスレッド カーネル、そして Linux が重点を置く

Linux は軽量プロセスをサポートしていますが、コアレベルのプロセスをサポートしているとは言えません。Linux のスレッドとプロセスは実際には同じスケジューリング レベルにあり、プロセス識別子空間を共有しているため、Linux センス POSIX ではこれらの制限を完全に実現することはできません。糸通し機構。

Linux カーネルは、本当の意味でスレッドをサポートしません。Linuxthreads は、通常のプロセスと同じカーネル スケジューリング ビューを持つ軽量プロセスを使用してスレッド サポートを実装します。この軽量プロセスは独立したプロセス ID を持ち、プロセス スケジューリング、信号処理、IO などの点で通常のプロセスと同じ機能を利用できます。

Linux 上のスレッドは軽量プロセスです。

各 linuxthread スレッドにはスレッド ID とプロセス ID の両方があり、プロセス ID はカーネルによって維持されるプロセス番号です

、スレッド ID は linuxthreads によって割り当てられ、維持されます

内核进程和内核线程_linux进程与线程 内核_linux内核线程和用户线程

__pthread_initial_thread のスレッド ID は PTHREAD_THREADS_MAX、__pthread_manager_thread のスレッド ID は 2*PTHREAD_THREADS_MAX+1linux フォーマット コマンド、最初のユーザー スレッドのスレッド ID は PTHREAD_THREADS_MAX+2、後続の n 番目のユーザー スレッドのスレッド ID は次の式に従います。 :

tid=n*PTHREAD_THREADS_MAX+n+1

Ces formulaires d'allocation garantissent que tous les threads du processus (y compris ceux qui sont déjà sortis) n'auront pas le même identifiant de thread, et le type d'identifiant de thread pthread_t est défini comme unsigned long int (unsignedlongint), ce qui garantit également un temps d'exécution raisonnable. Les ID de thread interne ne seront pas répétés.

La recherche de la structure des données du thread à partir de l'identifiant du thread est effectuée dans la fonction pthread_handle(). En fait, il s'agit simplement du numéro de thread modulo PTHREAD_THREADS_MAX, et le résultat est l'index du thread dans __pthread_handles.

5. Création de fils

Après que pthread_create() envoie une requête REQ_CREATE au thread de gestion, le thread de gestion appelle pthread_handle_create() pour créer un nouveau thread. Après avoir alloué la pile et défini l'attribut du thread, utilisez pthread_start_thread() comme entrée de fonction et appelez __clone() pour créer et démarrer un nouveau thread. pthread_start_thread() lit son propre numéro d'identification de processus et le stocke dans la structure de description du thread, et configure la planification en fonction de la méthode de planification qui y est enregistrée. Une fois que tout est prêt, appelez la vraie fonction d'exécution du thread et appelez pthread_exit() pour effacer la scène après le retour de cette fonction.

Trois façons de vérifier le nombre de threads sous Linux :

1.cat/proc/pid/status

2.pstree-ppid

3.top-H-ppid

4.psxH, affichez tous les fils de discussion existants

5.ps-mppid

linux进程与线程 内核_linux内核线程和用户线程_内核进程和内核线程

6.ps-eLf|grep

La deuxième colonne du résultat de la requête de commande est PID, la troisième colonne est PPID, la quatrième colonne est LWP et la sixième colonne est NLWP.

jstack30420|moins, puis recherchez nid=0x44bf, oh, je l'ai trouvé

Code Shell

"main"prio=10tid=0x11400nid=0x44bfrunnable[0x0000000040f5c000..0x0000000040f5ced0]

java.lang.Thread.State:RUNNABLE

at.SocketInputStream.socketRead0(NativeMethod)

at.SocketInputStream.read(SocketInputStream.java:129)

at.SocketInputStream.read(SocketInputStream.java:182)

atcom.caucho.server.resin.Resin.waitForExit(Resin.java:524)

atcom.caucho.server.resin.Resin.main(Resin.java:614)

La commande jstack est terminée, ne l'étudions pas pour l'instant

以上がスレッドとプロセスの違い: プロセスはリソースを割り当てるための基本単位であり、スレッドは独立して実行される制御フローです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。