Bốn luồng sẽ có cùng PID nhưng chỉ khi nhìn từ trên xuống. Cái mà bạn (với tư cách là người dùng) gọi là PID không phải là cái mà hạt nhân (nhìn từ bên dưới) gọi là PID.
Trong hạt nhân, mỗi luồng có ID riêng của nó, được gọi là PID (mặc dù có thể có ý nghĩa hơn nếu gọi đây là TID hoặc ID luồng) và chúng cũng có TGID (ID nhóm luồng) là PID của luồng. đã bắt đầu toàn bộ quá trình.
Nói một cách đơn giản, khi một quy trình mới được tạo, nó sẽ xuất hiện dưới dạng một chuỗi trong đó cả PID và TGID đều là cùng một số (mới).
Khi một luồng bắt đầu một luồng khác , luồng bắt đầu đó sẽ nhận PID của riêng nó (vì vậy bộ lập lịch có thể lên lịch cho nó một cách độc lập) nhưng nó kế thừa TGID từ luồng gốc.
Bằng cách đó, hạt nhân có thể lên lịch vui vẻ cho các luồng độc lập với tiến trình mà chúng thuộc về, trong khi các quy trình (ID nhóm luồng) được báo cáo cho bạn.
Hệ thống phân cấp các luồng sau đây có thể giúp (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
Bạn có thể thấy rằng việc bắt đầu một quy trình mới (ở bên trái) cung cấp cho bạn PID mới và TGID mới (cả hai đều được đặt thành cùng một giá trị), trong khi bắt đầu một chuỗi mới (ở bên phải) cung cấp cho bạn một PID mới trong khi vẫn duy trì TGID là chủ đề bắt đầu nó.
(a) Run lên vì kinh ngạc trước kỹ năng đồ họa ấn tượng của tôi :-)
getpid()
trả về tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
như được hiển thị trong www.makelinux.com/