Làm thế nào để biết lý do của một quá trình đi vào trạng thái ngủ và đánh thức nó?


19

Khi tôi làm 'trên cùng', tôi thấy quá trình tập lệnh perl của mình ở trạng thái 'S'. Có cách nào để biết, điều gì đang khiến quá trình perl này đi vào trạng thái ngủ và cách để đánh thức nó? Bất kỳ cách nào để gỡ lỗi để cung cấp thêm thông tin chi tiết về các dòng trong tập lệnh perl làm cho nó đi ở trạng thái 'S'.

Câu trả lời:


22

Một quá trình ở Strạng thái thường là trong một cuộc gọi hệ thống chặn, chẳng hạn như đọc hoặc ghi vào tệp hoặc mạng hoặc chờ chương trình được gọi khác kết thúc.

Bạn có thể sử dụng strace -p <pid>để tìm hiểu cuộc gọi hệ thống nào đang diễn ra. Nó sẽ tạo ra sản lượng như

viết (1, "foobar" ..., 4096

điều đó có nghĩa là quá trình này đang cố gắng ghi 4096 byte bắt đầu bằng "foobar" thành thiết bị xuất chuẩn (fd # 1) nhưng bất cứ điều gì nó đã được chuyển hướng vào đều bận và bộ đệm đầu ra đã đầy.


5

Các quá trình chuyển sang trạng thái ngủ khi chúng đang chờ đợi một cái gì đó, thường là I / O.

Quá trình của bạn sẽ ở Strạng thái khi nó đang đọc và có thể viết đang bị chặn. Cũng có thể xảy ra trong khi chờ đợi trên semaphores hoặc các nguyên thủy đồng bộ hóa khác.

Bạn không thể "đánh thức nó" - nó sẽ chỉ tiếp tục khi dữ liệu / tài nguyên mà nó đang chờ có sẵn.

Đây là tất cả bình thường và dự kiến, và thường không phải là một vấn đề. Thông thường, "chương trình" này chạy trên dòng lệnh không có tệp:

while (<>) { print; }

sẽ dành phần lớn thời gian ở trạng thái ngủ, điều này rất tốt - bạn không muốn nó lãng phí CPU trong khi chờ người dùng nhập liệu.

Nếu bạn nghĩ rằng đây là một vấn đề, hãy thử thay đổi cách bạn thực hiện I / O của mình (đọc các khối lớn hơn, theo bội số đẹp của kích thước khối của thiết bị bên dưới, thực hiện I / O được ánh xạ bộ nhớ, v.v.).

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.