Quá trình bị mắc kẹt: đó có phải là một dấu hiệu xấu?


23

Đôi khi một vài quá trình ở trong tình trạng bị mắc kẹt. Ví dụ:

PID    COMMAND          %CPU TIME     #TH  #WQ  #POR #MREGS RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP  PPID  STATE
99357  plugin-container 0.1  12:07.07 10   1    224  2097   40M    84M    66M    82M    2757M  91688 99346 sleeping
99346  firefox          0.4  48:54.20 29   1    265  16250  467M   172M   799M   538M   4210M  91688 1     sleeping 
88029- Aquamacs       1.2  31:24.12 4    3    126  268    19M    49M    32M    36M    777M   88029 152   stuck

Nó là một phần của vòng đời bình thường của quá trình? Tại sao quá trình này nói riêng?

Điều đó có chính xác ?

Câu trả lời:


38

Nó không nhất thiết là một dấu hiệu xấu, nhưng hãy để tôi trả lời câu hỏi cuối cùng của bạn trước:

điều đó có chính xác?

Trong topmã nguồn (từ http://www.opensource.apple.com/release/mac-os-x-1082/ ) trạng thái bị kẹt được gọi là định danh LIBTOP_STATE_STUCK(từ libtop.c):

libtop_state_str(uint32_t state)
{
        const char *strings[] = {
                "zombie",
#define LIBTOP_STATE_ZOMBIE     0
                "running",
#define LIBTOP_STATE_RUN        1
                "stuck",
#define LIBTOP_STATE_STUCK      2
                "sleeping",
#define LIBTOP_STATE_SLEEP      3
                "idle",
#define LIBTOP_STATE_IDLE       4
                "stopped",
#define LIBTOP_STATE_STOP       5
                "halted",
#define LIBTOP_STATE_HALT       6
                "unknown"
#define LIBTOP_STATE_UNKNOWN    7
        };
(...)
}

Sau đó trong cùng một tệp, LIBTOP_STATE_STUCKđược ánh xạ tới trạng thái kernel TH_STATE_UNINTERRUPTIBLE:

/* Translate a mach state to a state in the state breakdown array. */
static int
libtop_p_mach_state_order(int state, long sleeptime)
{
        switch (state) {
                case TH_STATE_RUNNING:
                        return LIBTOP_STATE_RUN;
                case TH_STATE_UNINTERRUPTIBLE:
                        return LIBTOP_STATE_STUCK;
(...)
}

Vì vậy, một quá trình ở trạng thái bị kẹt có nghĩa là tiến trình / luồng đang ở trạng thái chờ không bị gián đoạn , đó là cách TH_STATE_UNINTERRUPTIBLEđược định nghĩa trong cấu trúc kernel thread_basic_info(xem http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man / thread_basic_info.html ):

struct thread_basic_info
{
(...)
       integer_t        run_state;
(...)
};

ở đâu run_state:

run_state: Trạng thái chạy của luồng. Các giá trị có thể là:

(...)

  • TH_STATE_UNINTERRUPTIBLE: Chuỗi đang ở trạng thái chờ không bị gián đoạn.

(...)

Điều này thường được gây ra bởi một quá trình chờ vào I / O, nghĩa là quá trình đã yêu cầu đọc hoặc ghi vào / từ đĩa hoặc mạng và chờ cuộc gọi hệ thống trở lại (xem http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Uninterruptible_s ngủ hoặc http://www.novell.com/support/kb/doc.php?id=7002725 để biết thêm thông tin).

(Khi không sử dụng các tùy chọn BSD, như thường thấy trong Linux, pshiển thị giấc ngủ không bị gián đoạn ở trạng thái D. )

Nó là một phần của vòng đời bình thường của quá trình?

Vâng, nó là. Điều không bình thường là một quá trình trong trạng thái này trong một thời gian dài. Đó là một dấu hiệu xấu.

Tại sao quá trình này nói riêng?

Thật khó để nói. Nó thường được gây ra bởi các nút cổ chai I / O với hoạt động của đĩa nặng hoặc kết nối bị suy giảm khi sử dụng các hệ thống tệp mạng (kịch bản thông thường nhất, theo kinh nghiệm của tôi).

(Đây là một câu hỏi có liên quan trong Hỏi khác nhau: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- m .)


1
Làm thế nào tôi có thể tìm ra chính xác quá trình bị mắc kẹt?
mareoraft

3
@mareoraft Trong OS X, những cái có mã trạng thái 'U' ở đầu ra của ps axughoặc ps -eo user,pid,stat,args. Trong Linux, những cái có mã trạng thái 'D' có cùng pslệnh. Xem phần giải thích về từ khóa trạng thái (OS X) hoặc phần PROCESS STATE CODES (Linux) man psđể biết thêm thông tin. Hoặc, trong OS X, bạn có thể chạy topvà tìm kiếm các quy trình được đánh dấu như stucktrong cột STATE.
jaume
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.