프로세스 또는 경량 프로세스에 대해 tgid와 pid가 다른가요?

프로세스 또는 경량 프로세스에 대해 tgid와 pid가 다른가요?

모든 프로세스 또는 경량 프로세스의 경우 tgid와 pid는 동일한 개념입니다.

에서 /proc/${pid}/statustgid와 pid는 다른 필드입니다. 프로세스 또는 경량 프로세스에 대해 tgid와 pid가 다른가요?

감사해요.

답변1

볼 때 /proc/${pid}/statusTgid:필드 Pid:는 프로세스 또는 프로세스의 기본 스레드에 대해 동일하기 때문에 항상 일치합니다.

두 개의 개별 필드가 있는 이유는 동일한 코드를 사용하여 필드를 생성하기 때문입니다 /proc/${pid}/task/${tid}/status. 여기서 Tgid:및 는 Pid:서로 다를 수 있습니다. (보다 구체적으로, 위에서 사용된 파일 이름 템플릿 내에서 Tgid:일치 하고 일치합니다 .)${pid}Pid:${tid}


이름 지정은 약간 혼란스럽습니다. 주로 스레드 지원이 나중에 Linux 커널에 추가되었고 스케줄러 코드가 당시 프로세스를 예약하는 데 사용된 논리를 재사용하도록 수정되었으므로 이제 스레드를 예약할 수 있기 때문입니다. 이로 인해 개별 스레드를 식별하기 위해 "pid" 개념을 재사용하게 되었습니다. 따라서 실제로 커널의 관점에서 볼 때 "pid"는 여전히 스레드에 사용되고 "tgid"는 프로세스에 도입되었습니다. 그러나 사용자 공간에서는 여전히 PID가 프로세스를 식별하기를 원하므로 사용자 공간 유틸리티(예: ps등)는 커널의 "tgid"를 PID에 매핑하고 커널의 "pid"를 "tid"(스레드 ID)에 매핑합니다. .

답변2

프로세스 리더에서 생성된 스레드의 경우 TGid와 Pid가 다릅니다.

예를 들어 내 프로세스를 살펴보세요 polkitd.

% ps -Lp 2642                          
  PID   LWP TTY          TIME CMD
 2642  2642 ?        00:00:18 polkitd
 2642  2680 ?        00:00:00 gmain
 2642  2683 ?        00:00:30 gdbus
 2642  2685 ?        00:00:00 polkitd
 2642  2687 ?        00:00:00 JS GC Helper
 2642  2688 ?        00:00:00 JS Sour~ Thread
 2642  2692 ?        00:00:00 polkitd

흐름을 보면 2680:

% egrep ^'(Tgid|Pid):' /proc/2680/status
Tgid:   2642
Pid:    2680

관련 정보