เธรดทั้งสี่จะมี PID เหมือนกัน แต่เมื่อดูจากด้านบนเท่านั้น สิ่งที่คุณ (ในฐานะผู้ใช้) เรียก PID ไม่ใช่สิ่งที่เคอร์เนล (มองจากด้านล่าง) เรียกว่า PID
ในเคอร์เนลแต่ละเธรดจะมี ID ของตัวเองเรียกว่า PID (แม้ว่ามันจะสมเหตุสมผลกว่าที่จะเรียกสิ่งนี้ว่า TID หรือเธรด ID) และยังมี TGID (ID กลุ่มเธรด) ซึ่งเป็น PID ของเธรด ที่เริ่มกระบวนการทั้งหมด
ในทางที่ง่ายเมื่อสร้างกระบวนการใหม่จะปรากฏเป็นเธรดโดยที่ทั้ง 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 เป็นเธรดที่เริ่มต้น
(ก) สั่นกลัวด้วยทักษะกราฟิกที่น่าประทับใจของฉัน :-)
getpid()
ส่งคืน tgid:asmlinkage long sys_getpid(void) { return current->tgid;}
ตามที่แสดงในwww.makelinux.com/