Các luồng nhân Linux có thực sự là các tiến trình kernel không?


19

Tôi đã đọc ở nhiều nơi rằng Linux tạo ra một luồng nhân cho mỗi luồng người dùng trong máy ảo Java. (Tôi thấy thuật ngữ "kernel kernel" được sử dụng theo hai cách khác nhau:

  1. một luồng được tạo để làm việc hệ điều hành lõi và
  2. một luồng mà HĐH nhận thức được và lên lịch để thực hiện công việc của người dùng.

Tôi đang nói về loại thứ hai.)

Là một chuỗi kernel giống như một tiến trình kernel, vì các tiến trình Linux hỗ trợ các không gian bộ nhớ được chia sẻ giữa cha mẹ và con, hay nó thực sự là một thực thể khác nhau?

Câu trả lời:


23

Hoàn toàn không có sự khác biệt giữa một luồng và một quá trình trên Linux. Nếu bạn nhìn vào bản sao (2), bạn sẽ thấy một tập hợp các cờ xác định những gì được chia sẻ và những gì không được chia sẻ, giữa các luồng.

Các quy trình cổ điển chỉ là các chủ đề không chia sẻ gì; bạn có thể chia sẻ những thành phần nào bạn muốn trong Linux.

Đây không phải là trường hợp triển khai hệ điều hành khác, nơi có sự khác biệt đáng kể hơn nhiều.


22

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 /proctên /proc/NUMBERlà TGID,
  • tên số của các thư mục /proc/TGID/tasknhư /proc/TGID/task/NUMBERlà 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) .


1
Gợi ý: sử dụng từ "nhiệm vụ" có thể giúp đề cập đến một cái gì đó có thể chạy được mà không bị nhầm lẫn quá trình / luồng quá nhiều.
Toto

17

Chủ đề là các quy trình trong Linux. Chúng được tạo bằng lệnh clonegọi hệ thống, trả về ID tiến trình có thể được gửi tín hiệu qua killcuộc gọi hệ thống, giống như một quy trình. Quá trình chủ đề được hiển thị trong psđầu ra. Cuộc clonegọi được truyền cờ xác định bao nhiêu môi trường của quy trình cha được chia sẻ với quy trình xử lý.


1
Người đàn ông pthreads(7)nói rằng đối với việc triển khai NPTL (Thư viện chủ đề POSIX gốc) hiện tại, "tất cả các luồng trong một quy trình được đặt trong cùng một nhóm luồng; tất cả các thành viên của nhóm luồng đều chia sẻ cùng một PID." Trong triển khai LinuxThreads lỗi thời, mỗi "luồng" có PID riêng.
Totor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.