Làm thế nào để Linux phân biệt các luồng ngoài các tiến trình con?


21

Linux không thực sự phân biệt giữa các quy trình và luồng và thực hiện cả hai như một cấu trúc dữ liệu task_struct.

Vì vậy, Linux cung cấp cho một số chương trình để họ nói các luồng của một quá trình từ các tiến trình con của nó? Ví dụ: Có cách nào để xem chi tiết về tất cả các luồng mà một tiến trình có trong Linux không?

Cảm ơn.

Câu trả lời:


28

Từ task_structgóc độ, các luồng của một tiến trình có cùng một nhóm trưởng ( group_leadertrongtask_struct ), trong khi các tiến trình con có một nhóm trưởng luồng khác nhau (mỗi tiến trình con riêng lẻ).

Thông tin này được tiếp xúc với không gian sử dụng thông qua các /prochệ thống tập tin. Bạn có thể theo dõi cha mẹ và con cái bằng cách nhìn vào ppidtrường trong /proc/${pid}/stathoặc .../status(điều này mang lại cho cha mẹ pid); bạn có thể theo dõi các chủ đề bằng cách nhìn vào tgidtrường trong .../status(điều này cung cấp id nhóm chủ đề, cũng là pid của nhóm trưởng). Các luồng của một tiến trình được hiển thị trong /proc/${pid}/taskthư mục: mỗi luồng có thư mục con riêng. (Mỗi quá trình có ít nhất một luồng.)

Trong thực tế, các chương trình muốn theo dõi các luồng của riêng họ sẽ dựa vào các API được cung cấp bởi thư viện luồng mà họ đang sử dụng, thay vì sử dụng thông tin cụ thể của HĐH. Thông thường trên các hệ thống giống Unix có nghĩa là sử dụng pthreads.


Mỗi quy trình trong một đường ống vỏ (echo foo | cat) chia sẻ cùng một nhóm trưởng (trình bao), nhưng chúng không phải là các luồng trong cùng một quy trình.
psusi

2
Bạn đang nói về các nhóm quy trình; trong câu trả lời của tôi, trưởng nhóm là từ quan điểm hạt nhân. Trong kế toán của kernel, các quy trình riêng biệt là nhóm trưởng của riêng họ. Bạn có thể thấy điều này bằng cách chạy (sleep 120 | sleep 120) &và xem các Tgidgiá trị trong tệp sleepcủa mỗi tiến trình /proc/${pid}/status.
Stephen Kitt

Ôi lạ quá. Tôi không biết có một thứ như là "trưởng nhóm luồng" và tôi nghĩ rằng tất cả các luồng trong một quy trình đa luồng đều bằng nhau và không có "thủ lĩnh". Bất kỳ ai trong số họ cũng có thể thoát ra và miễn là còn lại, quá trình không chết.
psusi

5
  1. Điều này chạy toplệnh với một số tùy chọn bổ sung:

    top -H -b -n 1
    
    • Đối -Hsố hướng dẫn trên cùng để hiển thị từng luồng riêng lẻ. Thông thường hàng đầu tóm tắt tất cả các chủ đề theo quy trình cha mẹ của họ.
    • Đối -bsố làm cho chạy hàng đầu trong chế độ hàng loạt - thông tin được thu thập, hiển thị và sau đó được chuyển sang thiết bị xuất chuẩn trái ngược với chạy trong chế độ tương tác và làm mới dữ liệu được hiển thị.
    • Với -btùy chọn, người dùng phải cho biết đầu chạy bao nhiêu lần, điều này được thực hiện với -nđối số và đối số cuối cùng với số lần chạy.

    Vì vậy, hãy top -H -b -n 1hướng dẫn hệ thống để chạy trên đỉnh, hiển thị các luồng riêng lẻ, chạy trong chế độ hàng loạt và chỉ chạy một lần.

  2. Các pslệnh báo cáo một bản chụp của các quá trình đang chạy.

    ps -eLf
    

    Đối -eLfsố (cũng có thể được sử dụng -e -L -f) phá vỡ như sau:

    • enói psđể hiển thị tất cả các quy trình bất kể ai sở hữu chúng hoặc trạng thái hiện tại của chúng - hoạt động, ngủ, tạm dừng, chờ I / O, v.v.
    • Lnói psđể hiển thị chủ đề cá nhân
    • các fbảo psđể định dạng đầu ra như một danh sách đầy đủ các định dạng, và kết hợp với Llập luận các NLWP (số đề) và LWP (Chủ đề ID) cột được thêm vào đầu ra.

1

Hãy xem xét một quá trình với PID p1

Đối task_structtượng của một tiến trình con sẽ có PPID (cha mẹ là PID) là p1, và đó là PID và TGID được đặt thành p2.

Đối task_structtượng của một luồng của p1 sẽ có bộ PID là p3, nhưng TGID được đặt thành p1.


Vì vậy, bạn đang nói điều tương tự như Stephen Kitt , nhưng ít rõ ràng hơn nhiều. PS Tại sao phải đưa PPID vào cuộc thảo luận nếu bạn không nói PPID của một chủ đề là gì?
Scott

PID và TGID luôn giống nhau.
Tim
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.