6

PIDが一意にならない場合はありますか? プロセス (またはスレッド) を識別する最良の方法はありますか? 以前のバージョンの Linux には別のアプローチがあったと読みました

ありがとう

4

2 に答える 2

6

PID は約 32k の値を取ることがsysctl kernel.pid_maxできる (変更できる) ため、十分に迅速に再利用されます。pid + 開始時間の方がよい場合があります。systemd は、pid->attr マッピングのあいまいさを避けるために、cgroupfs の拡張属性に関するプロセスごとの情報を添付します (procfs も機能します)。

スレッドとプロセスは同じ名前空間を共有し ( で確認できます/proc/<pid>/task/<taskid>)、プロセスの初期スレッドを表す<pid>=を使用します。<taskid>Pid 名前空間は、表示される pid のリストを制限しますが、重複は発生しません。所有者が実行されている間、pid とタスク ID は一意のままです。

于 2012-10-17T21:22:04.873 に答える
4

システムコールについて話している場合はgetpid()、はい、PID はプロセスごとに一意です。ただし、古いバージョンの Linux カーネルでスレッドを使用している場合は除きます。次に、各スレッドが独自のプロセス ID を持つ場合があります。

この議論から引用するには:

カーネル 2.4.20 はNPTL (ネイティブ posix スレッド ライブラリ)を使用し、これは RH9 に同梱されているカーネルです。RH8 は NPTL を実装しないカーネル 2.4.18 を使用します (つまり、各スレッドは独自の PID を取得するため、/proc でそのステータスを適切に説明します)。NPTL は POSIX スレッドの「実際の」実装であり、スレッドが PID を含めてより多くのものを共有することを意味します。いくつかの理由でスレッドを実行するより効率的な方法ですが、この種のスレッドをデバッグするための簡単なトリックは知りません。スレッドがセマフォで待機している場合と比べてスリープしている場合、または多くのスレッドを含むプロセスでどのスレッドが停止したかなどをどのように知ることができますか?

NPTLのウィキペディア リンクから:

NPTL は、バージョン 3 以降の Red Hat Enterprise Linux の一部であり、バージョン 2.6 以降の Linux カーネルに含まれています。これは現在、GNU C ライブラリの完全に統合された部分です。2

内部では、2.6.X カーネルでさえ、スレッド用の仮想プロセスを備えています。スレッドのプロセス ID をps auxf次のように表示できます。

root      2501  0.0  0.3 244448 25576 ?    Ss   Jul03   0:11 /usr/sbin/httpd
apache    2716  0.0  0.5 384776 46696 ?    S    Oct14   0:17  \_ /usr/sbin/httpd
apache    2717  0.0  0.5 382208 44304 ?    S    Oct14   0:11  \_ /usr/sbin/httpd

次のプログラムは、Linux カーネル 2.6.18 でメインとスレッドの両方に同じ pid を出力します。から返される自己 ID はpthread_self()、スレッドを一意に識別します。

#include <pthread.h>
void foo() {
  printf("thread: pid = %d, self = %ld\n", getpid(), pthread_self());
}
main() {
  pthread_t thread;
  printf("main: pid = %d, self = %ld\n", getpid(), pthread_self());
  pthread_create(&thread, 0L, foo, 0L);
  pthread_join(thread, 0L);
}

出力は次のとおりです。

main: pid = 13246, self = 46912496175248
thread: pid = 13246, self = 1084229952
于 2012-10-17T21:22:50.310 に答える