2012-06-19 16 views
8

Đây là trên hệ điều hành Linux. Ứng dụng được viết bằng C++ với thư viện ACE.cách phát hiện xem một chuỗi hoặc quá trình có bị bỏ đói do lập lịch OS hay không

Tôi nghi ngờ rằng một trong các luồng trong quy trình bị chặn trong thời gian dài bất thường (5 đến 40 giây) đôi khi. Ứng dụng chạy tốt hầu hết các lần trừ vài lần một ngày nó có vấn đề này. Có 5 ứng dụng tương tự khác đang chạy trên hộp cũng là I/O bị ràng buộc do dữ liệu ổ cắm đến nặng.

Tôi muốn biết nếu có bất kỳ điều gì tôi có thể thực hiện theo chương trình để xem liệu luồng/quy trình có nhận được lát thời gian của chúng hay không.

Trả lời

3

Nếu quá trình đang bị bỏ đói, tự giám sát quy trình đó sẽ không hiệu quả. Tuy nhiên, nếu bạn chỉ muốn quá trình đó nhận thấy nó không được chạy trong một thời gian, nó có thể gọi định kỳ times và so sánh chênh lệch tương đối trong thời gian đã trôi qua với chênh lệch tương đối trong thời gian người dùng được lập lịch (bạn sẽ tổng hợp các trường tms_utimetms_cutime nếu bạn muốn đếm chờ đợi cho trẻ em như là thời gian sản xuất, và bạn sẽ tổng hợp trong các lĩnh vực tms_stimetms_cstime nếu bạn đếm thời gian hạt nhân dành cho bạn để được thời gian sản xuất). Đối với thời gian thread, cách duy nhất tôi biết là tham khảo hệ thống tập tin /proc.

Quy trình bên ngoài ưu tiên cao hoặc chuỗi ưu tiên cao có thể giám sát các quy trình (và chủ đề) bên ngoài bằng cách đọc các mục /proc/<pid>/stat thích hợp cho quy trình (và /proc/<pid>/task/<tid>/stat cho chủ đề). Thời gian của người dùng được tìm thấy trong các trường 14 và 16 của tệp stat. Thời gian hệ thống được tìm thấy trong các trường 15 và 17. (Các vị trí trường là chính xác cho hạt nhân Linux 2.6 của tôi.)

Giữa hai điểm thời gian, bạn xác định lượng thời gian trôi qua đã trôi qua (quy trình giám sát hoặc luồng thường sẽ thức dậy đều đặn). Sau đó, sự khác biệt giữa thời gian xử lý tích lũy tại mỗi điểm thời gian đó biểu thị lượng thời gian mà chuỗi yêu thích đã chạy trong thời gian đó. Tỷ lệ thời gian xử lý đến thời gian trôi qua sẽ đại diện cho lát thời gian.

Một chút cuối cùng của thông tin: Trên Linux, tôi sử dụng sau đây để có được những tid của thread hiện hành để kiểm tra quyền task trong thư mục /proc/<pid>/task/:

tid = syscall(__NR_gettid); 

Tôi làm điều này, bởi vì tôi không thể tìm thấy cuộc gọi hệ thống gettid thực sự được xuất bởi bất kỳ thư viện nào trên hệ thống của tôi, mặc dù nó đã được ghi lại. Nhưng, nó có thể có sẵn trên máy của bạn.