Tài liệu này có thể khá khó hiểu, vì vậy đây là mô hình Linux " thực ":
- bên trong nhân Linux, một cái gì đó có thể chạy (& được lên lịch) được gọi là "quy trình",
- mỗi quy trình có ID quy trình duy nhất của hệ thống (PID) và ID nhóm chủ đề (TGID),
- một quy trình "bình thường" có PID = TGID và không có quy trình nào khác chia sẻ giá trị TGID này,
- một quá trình "luồng" là một quá trình mà giá trị TGID được chia sẻ bởi các quá trình khác,
- một số quy trình chia sẻ cùng một TGID cũng chia sẻ, ít nhất, cùng một bộ xử lý không gian bộ nhớ và tín hiệu (đôi khi nhiều hơn),
- nếu một quá trình "luồng" có PID = TGID, thì nó có thể được gọi là "luồng chính",
- việc gọi
getpid()
từ bất kỳ quá trình nào sẽ trả về PID của nó (= "luồng chính"),
- gọi
gettid()
từ bất kỳ quá trình nào sẽ trả về PID của nó (!),
- bất kỳ loại quy trình có thể được tạo ra với
clone(2)
cuộc gọi hệ thống,
- tên số của thư mục bạn có thể liệt kê với
ls /proc
tên /proc/NUMBER
là TGID,
- tên số của các thư mục
/proc/TGID/task
như /proc/TGID/task/NUMBER
là PID,
- mặc dù bạn không thấy mọi PID hiện có
ls /proc
, bạn vẫn có thể làm được cd /proc/any_PID
.
Kết luận : từ quan điểm hạt nhân, chỉ có các quy trình tồn tại, mỗi quy trình có một mã độc nhất của riêng chúng và một luồng được gọi là một loại quy trình khác nhau.
Lưu ý: việc triển khai khái niệm "luồng" trong Linux đã dẫn đến sự nhầm lẫn về từ vựng và nếu getpid()
nói dối với bạn không làm như bạn nghĩ, đó là do hành vi của nó tuân theo khả năng tương thích POSIX (các luồng được cho là chia sẻ một PID chung) .