4 개의 스레드는 동일한 PID를 갖지만 위에서 볼 때만 가능 합니다. 무엇 당신 (사용자로)는 PID를 호출하면 커널 (아래에서 찾고)는 PID를 호출하는 것이 아니다.
에서 커널, 각 스레드는 스레드의 PID입니다 (이것은 아마도 이것을 TID, 또는 스레드 ID를 호출하는 더 나을하지만) 그들은 또한 TGID (thread 그룹 ID)를 가지고 PID라는 그 자신의 ID를 가지고 그것은 전체 과정을 시작했습니다.
간단히 말해서 새 프로세스 가 생성되면 PID와 TGID가 같은 (새) 번호 인 스레드로 나타납니다.
스레드가 다른 스레드 를 시작하면 시작된 스레드는 자체 PID를 얻지 만 (스케줄러가 독립적으로 스케줄 할 수 있음) 원래 스레드에서 TGID를 상속합니다.
이런 식으로 커널은 자신이 속한 프로세스에 관계없이 스레드를 즐겁게 예약 할 수 있으며 프로세스 (스레드 그룹 ID)가보고됩니다.
다음 스레드 계층 구조가 도움이 될 수 있습니다 (a) .
USER VIEW
<-- PID 43 --> <----------------- PID 42 ----------------->
+---------+
| process |
_| pid=42 |_
_/ | tgid=42 | \_ (new thread) _
_ (fork) _/ +---------+ \
/ +---------+
+---------+ | process |
| process | | pid=44 |
| pid=43 | | tgid=42 |
| tgid=43 | +---------+
+---------+
<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
KERNEL VIEW
새 프로세스 (왼쪽)를 시작하면 새 PID 와 새 TGID (둘 다 동일한 값으로 설정 됨)가 제공되는 반면 새 스레드 (오른쪽) 를 시작하면 동일한 값 을 유지하면서 새 PID가 제공됨 을 알 수 있습니다. TGID를 시작한 스레드입니다.
(a) 내 인상적인 그래픽 기술 에 경외심 에 떨기 :-)
getpid()
tgid :를 반환합니다 .asmlinkage long sys_getpid(void) { return current->tgid;}