我在osx上使用htop,似乎找不到"S"状态列中的"C"状态对进程状态意味着什么。
在htop中,C进程状态意味着什么?
以下是s、stat和状态输出说明符(标头"stat"或"s")将显示的不同值,以描述进程的状态:
- D不间断睡眠(通常为IO)
- R正在运行或可运行(在运行队列中)
- S可中断睡眠(等待事件完成)
- T由于作业控制信号或正在跟踪而停止
- W分页(自2.6.xx内核以来无效)
- X死亡(不应被看到)
- ZDefunct("僵尸")进程,已终止但未被其父进程收割
来源:man ps
我最近看到了第二个列表:
- R跑步
- S在可中断的等待中睡觉
- D在不间断磁盘睡眠中等待
- Z僵尸
- T已停止(根据信号)或(在Linux 2.6.33之前)跟踪已停止
- t跟踪停止(Linux 2.6.33以后版本)
- W分页(仅限Linux 2.6.0之前的版本)
- XDead(从Linux 2.6.0开始)
- xDead(仅限Linux 2.6.33至3.13)
- KWakekill(仅限Linux 2.6.33到3.13)
- W唤醒(仅限Linux 2.6.33至3.13)
- P驻车(仅限Linux 3.9至3.13)
http://man7.org/linux/man-pages/man5/proc.5.html在"/proc/[pid]/stat"部分:
htop作者在这里。我不知道htop代码库中有这样的状态代码。请记住,htop只是为Linux编写的,因此不支持macOS/OSX。当我听说人们在OSX上运行它时,他们经常使用过时的、不受支持的fork(htop的最新版本是2.0.1,包括macOS支持)。
我最近也有同样的问题。我们可以尝试在htop中查找来源:
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 '?';
}
}
因此,我们转到/usr/include/sys/proc.h:中Unix对进程状态的定义
/* 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"状态意味着"由fork创建的进程"。它是什么?根据旧的unix源代码,当分叉进程时内存不足,需要交换父进程时,会出现这种瞬态。
什么??
返回htop来源。我们从哪里得到ki->state
?
// 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 */
我们有以下(混乱的)映射:
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'
因此,真正的答案是:'C'表示进程当前正在运行
这是怎么发生的?似乎ki->state
处理是从ps
源代码中借来的,并没有针对Unix进程代码进行调整。
更新:此错误已修复。是开源的!