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_utime
và tms_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_stime
và tms_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.