모든 프로세스 또는 경량 프로세스의 경우 tgid와 pid는 동일한 개념입니다.
에서 /proc/${pid}/status
tgid와 pid는 다른 필드입니다. 프로세스 또는 경량 프로세스에 대해 tgid와 pid가 다른가요?
감사해요.
답변1
볼 때 /proc/${pid}/status
및 Tgid:
필드 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