web-dev-qa-db-ja.com

pid_max、ulimit -u、thread_maxの違いを理解する

Linuxプロセスを理解しようとしています。用語について混乱がありますpid_maxulimit -uおよびthread_max。これらの用語の違いは何ですか?誰かが私に違いを明確にできますか?

11
Ramesh

プロセスとスレッドの違いを理解しましょう。 this リンクに従って、

典型的な違いは、(同じプロセスの)スレッドが共有メモリ空間で実行されるのに対し、プロセスは個別のメモリ空間で実行されることです。

これで、次のように決定できるpid_maxパラメータがあります。

cat /proc/sys/kernel/pid_max

したがって、上記のコマンドは32,768を返します。これは、32,768プロセスを同時に実行できることを意味します別のメモリ空間で実行できる私のシステムで。

これで、次のように決定できるthreads-maxパラメータがあります。

cat /proc/sys/kernel/threads-max

上記のコマンドは、出力を126406として返します。つまり、126406共有メモリ空間のスレッド。

次に、3番目のパラメータulimit -uを使用して、ユーザーが特定の時間に実行できるプロセスの総数を示します。上記のコマンドは、出力を63203として返します。これは、ユーザーが63203プロセスを実行できる時点でユーザーが作成したすべてのプロセスについて意味します。

架空のケース

したがって、2人のユーザーが同時に実行している2つのプロセスがあり、各プロセスがメモリを大量に消費していると仮定すると、両方のプロセスが63203ユーザー制限を効果的に使用しますプロセス。したがって、その場合、2人のユーザーは126406threads-maxサイズ全体を効果的に使い果たします。

ここで、ユーザーが任意の時点で実行できるプロセスの数を決定する必要があります。これは、/etc/security/limits.confファイルから判別できます。したがって、このファイルには基本的に2つの設定があります ここ で説明されています。

ソフト制限は、警告およびハード制限実際の上限です。たとえば、以下は、学生グループの誰もが50を超えるプロセスを持つことを防ぎ、30プロセスで警告が出されます。

@student        hard    nproc           50
@student        soft    nproc           30

ハード制限はカーネルによって維持され、ソフト制限はシェルによって強制されます。

15
Ramesh

申し訳ありませんが、受け入れられた答えはいくつかの面で悪い情報です。

/ proc/sys/kernel/pid_maxは、いつでも実行できるプロセスの最大数とは関係ありません。実際には、カーネルが割り当てることができる最大のプロセスIDENTIFIERです。

Linuxカーネルでは、プロセスとスレッドは同じものです。それらはカーネルによって同じ方法で処理されます。どちらもtask_structデータ構造のスロットを占有します。スレッドは、一般的な用語では、Linuxでは別のプロセスとリソースを共有するプロセスです(スレッドグループIDも共有します)。 Linuxカーネルのスレッドは、スケジューラに関する限り、主に概念的な構成要素です。

カーネルはスレッドとプロセスをほとんど区別していないことを理解したので、/ proc/sys/kernel/threads-maxが実際にはデータ構造task_structに含まれる要素の最大数であることはより理解できるはずです。これは、プロセスのリスト、またはタスクと呼ぶことができるタスクのリストを含むデータ構造です。

ulimitは、名前が示すように、ユーザーごとの制限です。 -uフラグは、「単一ユーザーが使用できるプロセスの最大数」として定義されています。 task_structの要素には、タスクを作成したユーザーのuidが含まれています。 uidごとのカウントは維持され、タスクがtask_structに追加/削除されるたびにインクリメント/デクリメントされます。したがって、ulimit -uは、特定の時点でtask_struct内で特定の1人のユーザーが許可する要素(プロセス)の最大数を示します。

これで問題が解決することを願っています。

12
David LaPorte