Подтвердить что ты не робот

Что означает статус процесса C в htop?

Я использую htop для osx, и я не могу понять, что означает статус C в столбце состояния S, для состояния процесса.

Что означает статус процесса C в htop?

4b9b3361

Ответ 1

htop автор здесь. Я не знаю такого кода состояния в htop codebase. Имейте в виду, что htop написан только для Linux, поэтому поддержка macOS/OSX отсутствует. Когда я слышу о том, что люди запускают его на OSX, они часто используют устаревшую, неподдерживаемую fork (последняя версия htop 2.0.1, включая поддержку macOS).

Ответ 2

Вот различные значения, которые будут отображаться в выходных спецификаторах s, stat и state (заголовок "STAT" или "S") для описания состояния процесса:

  • D Непрерывный сон (обычно IO)
  • R Выполняется или работает (в очереди выполнения)
  • S Прерывистый сон (ожидание завершения события)
  • T Остановлено либо по сигналу управления заданием, либо по причине его отслеживания.
  • W Paging (не действует с ядра 2.6.xx)
  • X Dead (никогда не должно быть видно)
  • Z Defunct ("zombie") процесс, завершенный, но не собранный его родителем.

Источник: man ps

Недавно я наткнулся на второй список:

  • R Бег
  • S спать в беспрерывном ожидании
  • D Ожидание в непрерывном дисковом сне.
  • Z Zombie
  • T Остановлена (по сигналу) или (до Linux 2.6.33) трассировка остановлена
  • т Трассировка остановка (Linux 2.6.33 и далее)
  • W Paging (только до Linux 2.6.0)
  • X Dead (начиная с Linux 2.6.0 и далее)
  • x Dead (только для Linux с 2.6.33 по 3.13)
  • K Wakekill (только для Linux с 2.6.33 по 3.13)
  • W Waking (только 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":

Ответ 3

У меня такой же вопрос в последнее время. Мы можем попытаться найти его в 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 '?';
  }
}

Итак, переходим к определению состояний процесса Unix в /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. */

Итак, статус "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 source и не была скопирована для кодов процессов Unix.

Обновление: исправлена ​​ошибка . Yay с открытым исходным кодом!