Chương trình pstree và htop hiển thị các chủ đề với PIDS độc đáo. Sao có thể như thế được?


7

Tôi đã chạy chương trình pstree -p 31872 in ra kết quả sau:

 ruby(31872)─┬─{ruby}(31906)         
             └─{ruby}(32372)

Trang người đàn ông cho pstree nói:

Các luồng con của một tiến trình được tìm thấy theo tiến trình cha và được hiển thị với tên tiến trình trong dấu ngoặc nhọn, vd

       icecast2---13*[{icecast2}]

(Ở trên được hiển thị khác nhau do tùy chọn -p bị thiếu, vô hiệu hóa việc nén.)

Chạy pstree 31872 mà không -p cho:

ruby───2*[{ruby}] 

Khi tôi cố gắng quan sát những PIDS đó bằng ps , không có kết quả nào được tìm thấy. Tuy nhiên, các pids, tồn tại trong / Proc.

Câu hỏi của tôi là, tại sao chủ đề sẽ có pids khác nhau? Tôi hy vọng chúng sẽ giống như (31872) như quy trình. Hành vi tương tự được quan sát khi chạy htop.

Câu trả lời:


8

Sai lầm là giả định những con số đó là PIDS, trong khi thực tế chúng là TIDS (ID luồng). Xem chức năng Linux gettid (2). Đọc lên trên bản sao (2) cung cấp rất nhiều chi tiết bổ sung (và thú vị).


1

Chủ đề thường là các quá trình khác nhau. Ít nhất là trong Linux, một "luồng" thường là một bản sao của quá trình xảy ra để chia sẻ một số bộ nhớ với tiến trình cha.

Tuy nhiên, trong một số ngôn ngữ, các luồng vẫn là một phần của quy trình chính vì chúng là các luồng "Xanh", được mô phỏng theo ngôn ngữ VM. Java và python nổi tiếng vì điều này.


1
Chủ đề thuộc về các quy trình và chia sẻ không gian bộ nhớ của quy trình. Chúng chắc chắn không phải là một quá trình riêng biệt với quá trình tạo ra chúng. Khi bạn nói "một luồng thường là một bản sao của một tiến trình", bạn có thể nghĩ đến lệnh gọi hệ thống ngã ba, tạo ra một tiến trình con, không phải là một luồng.
stantona

1
Không. Trong Linux, nếu bạn muốn tạo một cái gì đó có thể được lên lịch riêng biệt với luồng chính, bạn có thể khai báo một luồng mới hoặc ngã ba. Trong cả hai trường hợp, điều đầu tiên xảy ra là một bản sao, sao chép quá trình mà không tạo vùng nhớ mới cho nó. Nếu đó là giả mạo, điều tiếp theo xảy ra là phân bổ không gian bộ nhớ quy trình riêng biệt. Xem bản sao chức năng linux (2)
Hack Saw

Tôi nghĩ rằng bạn loại công phu về những gì tôi nói, không ??
stantona

1
Ngắn gọn hơn, sự khác biệt duy nhất giữa các luồng và tiến trình thực, trong linux, là một luồng chia sẻ bộ nhớ với một tiến trình khác, và một tiến trình thì không. Theo như thư mục Proc, và các máy móc đằng sau nó, và quan trọng hơn là trình lập lịch biểu, đó chỉ là một quá trình khác.
Hack Saw
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.