2013-08-27 18 views
14

Ostop'ta ostop kullanıyorum ve 'S' durum sütununda bir 'C' durumunun işlem durumu için ne anlama geldiğini anlayamıyorum.C işlem durumu htop'ta ne anlama geliyor?

C işlem durumu htop'ta ne anlama geliyor?

D kesintisiz uyku (genellikle IO)

: Burada

cevap

20

htop yazar adam ps. Htop kod tabanında bu tür durum kodlarının farkında değilim. Htop'un sadece Linux için yazıldığını ve bu nedenle macOS/OSX için destek olmadığını unutmayın. OSX'de çalışan insanların sesini duyduğumda, genellikle güncelliğini yitirmiş, desteklenmeyen bir çatal kullanıyorlar (MacOS'un en son sürümü MacOS desteği de dahil olmak üzere 2.0.1).

42

s, istatistik ve durum çıkışı belirteçleri (başlık "STAT" veya "S"), bir işlem durumunu tarif etmek için görüntüler farklı değerler

R koşu ya da (run sırasına) çalıştırılabilir

iş kontrol sinyali ile veya takip ediliyor çünkü ya T durdu

interruptible uyku (bir olay tamamlamak için bekliyor) S. Ölü X (asla görünmemesi gereken)

(2.6.xx kernel beri geçerli değil)

W çağrı

Z feshedilmiş ("zombi") süreci, sonlandırıldı ancak ebeveyn tarafından hasat değil.

Kaynak: Burada

14

Son zamanlarda aynı soruyu aldım. Biz htop sources bunu aramak için deneyebilirsiniz: 'Yani

/* 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. */ 

C:

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 '?'; 
    } 
} 

yüzden /usr/include/sys/proc.h proses durumlarının Unix tanımına gitmek 'statünün' çatalla yaratılan süreç 'olduğu kastedilmektedir. Bu ne? old unix sources'a göre, bir işlemi iptal ederken ve üst öğenin takas edilmesi gerektiğinde yeterli bellek olmadığında gerçekleşen geçici bir durumdur.

Ne ??

Donanım kaynağına dönüş. ki->state'u nereden bulabiliriz?

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' 

Yani, gerçek cevap:

// 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 */ 

Aşağıdaki (berbat) eşleme 'C' süreç şu anda çalışıyor demektir.

Nasıl oldu? ki->state kullanımının ps source'dan ödünç alınmış olduğunu ve Unix işlem kodları için ayarlanmadığını görünüyor.

Güncelleme: this bug is fixed. Yay açık kaynak!