2013-08-27 24 views

Trả lời

20

htop tác giả ở đây. Tôi không biết mã trạng thái như vậy trong codebase htop. Hãy nhớ rằng htop được viết cho Linux chỉ, vì vậy không có hỗ trợ cho macOS/OSX. Khi tôi nghe về những người chạy nó trên OSX họ thường sử dụng một ngã ba lỗi thời, không được hỗ trợ (phiên bản mới nhất của htop là 2.0.1, bao gồm hỗ trợ macOS).

42

Dưới đây là các giá trị khác nhau mà các s, stat và trạng thái đầu ra specifiers (tiêu đề "STAT" hoặc "S") sẽ hiển thị để mô tả trạng thái của một quá trình:

D ngủ liên tục (thường IO)

R chạy hoặc Runnable (trên hàng đợi chạy)

S ngủ ngắt (chờ đợi một sự kiện để hoàn thành)

T dừng lại, hoặc bằng một tín hiệu điều khiển công việc hoặc vì nó đang được truy tìm.

W phân trang (không có giá trị kể từ khi kernel 2.6.xx)

X chết (không bao giờ nên được xem)

Z không còn tồn tại ("zombie") quá trình, chấm dứt nhưng không gặt hái được bởi cha của nó.

Nguồn: người đàn ông ps

14

Gần đây tôi có cùng một câu hỏi. Chúng ta có thể cố gắng tìm kiếm nó trong htop sources:

process->state = 
    ProcessList_decodeState(p->p_stat == SZOMB ? SZOMB : ki->state); 

static int 
ProcessList_decodeState(int st) { 
    switch (st) { 
    case SIDL: 
    return 'C'; 
    case SRUN: 
    return 'R'; 
    case SSLEEP: 
    return 'S'; 
    case SSTOP: 
    return 'T'; 
    case SZOMB: 
    return 'Z'; 
    default: 
    return '?'; 
    } 
} 

Vì vậy, chúng tôi đi đến Unix định nghĩa của các quốc gia quá trình tại /usr/include/sys/proc.h:

/* Status values. */ 
#define SIDL 1  /* Process being created by fork. */ 
#define SRUN 2  /* Currently runnable. */ 
#define SSLEEP 3  /* Sleeping on an address. */ 
#define SSTOP 4  /* Process debugging or suspension. */ 
#define SZOMB 5  /* Awaiting collection by parent. */ 

Vì vậy, 'C 'trạng thái có nghĩa là' Quá trình được tạo bởi ngã ba '. Nó là gì? Theo old unix sources, đó là trạng thái tạm thời xảy ra khi không có đủ bộ nhớ khi giả mạo quá trình và cha mẹ cần được hoán đổi.

Cái gì ??

Quay lại nguồn htop. Chúng tôi lấy số điện thoại ki->state ở đâu?

// For all threads in process: 
error = thread_info(ki->thread_list[j], THREAD_BASIC_INFO, 
        (thread_info_t) & ki->thval[j].tb, 
        &thread_info_count); 

tstate = ProcessList_machStateOrder(ki->thval[j].tb.run_state, 
            ki->thval[j].tb.sleep_time); 
if (tstate < ki->state) 
    ki->state = tstate; 

// Below... 
static int 
ProcessList_machStateOrder(int s, long sleep_time) { 
    switch (s) { 
    case TH_STATE_RUNNING: 
    return 1; 
    case TH_STATE_UNINTERRUPTIBLE: 
    return 2; 
    case TH_STATE_WAITING: 
    return (sleep_time > 20) ? 4 : 3; 
    case TH_STATE_STOPPED: 
    return 5; 
    case TH_STATE_HALTED: 
    return 6; 
    default: 
    return 7; 
    } 
} 

// In mach/thread_info.h: 
#define TH_STATE_RUNNING 1 /* thread is running normally */ 
#define TH_STATE_STOPPED 2 /* thread is stopped */ 
#define TH_STATE_WAITING 3 /* thread is waiting normally */ 
#define TH_STATE_UNINTERRUPTIBLE 4 /* thread is in an uninterruptible wait */ 
#define TH_STATE_HALTED 5 /* thread is halted at a clean point */ 

Chúng tôi có như sau (sai lầm) lập bản đồ:

Thread state    | Mapped to | htop state| 'top' state | 'ps' state 
---------------------------------------------------------------------------- 
TH_STATE_RUNNING   | SIDL(1) |  'C' | running  | 'R' 
TH_STATE_UNINTERRUPTIBLE | SRUN(2) |  'R' | stuck  | 'U' 
TH_STATE_WAITING (short) | SSLEEP(3) |  'S' | sleeping | 'S' 
TH_STATE_WAITING (long) | SSTOP(4) |  'T' | idle  | 'I' 
TH_STATE_STOPPED   | SZOMB(5) |  'Z' | stopped  | 'T' 

Vì vậy, câu trả lời thực sự là: 'C' có nghĩa là quá trình hiện đang chạy.

Điều đó xảy ra như thế nào? Dường như việc xử lý ki->state được mượn từ ps source và không được điều chỉnh cho các mã xử lý Unix.

Cập nhật: điều này bug is fixed. Yay mã nguồn mở!

Các vấn đề liên quan