Linuxカーネルで私が知る限り、
構造体_task_struct
_はスレッド、つまり軽量プロセスを表しますが、プロセスは表しません。
プロセスは構造によって表されるのではなく、同じスレッドグループIDを共有するスレッドのグループによって表されます。
それで、オペレーティングシステムの概念からの次は正しいですか?
Linuxには、
clone()
システムコールを使用してスレッドを作成する機能もあります。ただし、Linuxはプロセスとスレッドを区別しません。実際、Linuxは、プログラム内の制御の流れを指すときに、プロセスやスレッドではなく、タスクという用語を使用します。
どういう意味ですか?
ありがとう。
Linuxには、clone()システムコールを使用してスレッドを作成する機能もあります。ただし、Linuxはプロセスとスレッドを区別しません。実際、Linuxは、プログラム内の制御の流れを指すときに、プロセスやスレッドではなく、タスクという用語を使用します。
実際の実装と表示される表面を区別する必要があります。
ユーザー(システムソフトウェア開発者)の観点からは、大きな違いがあります。スレッドは多くの共通リソースを共有します(たとえば、メモリマッピング-スタックは別として-ファイル記述子)。
内部的に(警告:不正確な手振りの引数)Linuxカーネル1) 手元にあるもの、つまりプロセスとスレッドに同じ構造を使用しています。単一のプロセスのスレッドの場合、一部のものを複製するのではなく、その単一のインスタンスを参照します(メモリマップの説明)。
したがって、スレッドまたはプロセスを直接表すレベルでは、基本構造に大きな違いはありません。悪魔は、情報の処理方法にあります。
読むことに興味があるかもしれません スレッドはLinux上でプロセスとして実装されていますか?
1) 最近の「Linux」は主にOS全体を表していますが、実際にはカーネル自体にすぎないことを忘れないでください。
Linuxスレッドは別のプロセスとして実装されますが、他のスレッドと同じアドレス空間を共有します。デフォルトでは、これらはps
コマンドで非表示になっていますが、-L
フラグで確認できます。
例えば:
% ps -fp 2642
UID PID PPID C STIME TTY TIME CMD
polkitd 2642 1 0 Dec09 ? 00:00:48 /usr/lib/polkit-1/polkitd --no-d
% ps -fLp 2642
UID PID PPID LWP C NLWP STIME TTY TIME CMD
polkitd 2642 1 2642 0 7 Dec09 ? 00:00:18 /usr/lib/polkit-1/pol
polkitd 2642 1 2680 0 7 Dec09 ? 00:00:00 /usr/lib/polkit-1/pol
polkitd 2642 1 2683 0 7 Dec09 ? 00:00:30 /usr/lib/polkit-1/pol
polkitd 2642 1 2685 0 7 Dec09 ? 00:00:00 /usr/lib/polkit-1/pol
polkitd 2642 1 2687 0 7 Dec09 ? 00:00:00 /usr/lib/polkit-1/pol
polkitd 2642 1 2688 0 7 Dec09 ? 00:00:00 /usr/lib/polkit-1/pol
polkitd 2642 1 2692 0 7 Dec09 ? 00:00:00 /usr/lib/polkit-1/pol
polkitd
は実際には7つのスレッドで構成されていることがわかります。これらはすべて同じプロセスIDを持ちますが、スレッドID(LWP)は異なりますが、カーネル内の異なるプロセスであるため、ps
リストには異なるプロセスとして表示されます。
これは影響を与える可能性があります。 ulimit
制約について。 RedHatおよび派生物に関する一般的な問題は、デフォルトのPAM構成がプロセスを制限することです。
% cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
重いJava Webアプリでは、プロセスの数がこれを超え、アプリケーションの失敗を引き起こす可能性があります。