web-dev-qa-db-ja.com

htopでCプロセスのステータスは何を意味しますか?

私はosxでhtopを使用していますが、「S」ステータス列の「C」ステータスがプロセスステータスに対して何を意味するのかわからないようです。

HtopでCプロセスのステータスは何を意味しますか?

21
jrule

htop作者はこちら。私はhtopコードベースでそのようなステータスコードを認識していません。 htopはLinux専用に作成されているため、macOS/OSXはサポートされていないことに注意してください。 OSXで実行している人の話を聞くと、サポートされていない古いフォークを使用していることがよくあります(最新バージョンのhtopは、macOSサポートを含めて2.0.1です)。

31
Hisham H M

プロセスの状態を説明するためにs、stat、およびstate出力指定子(ヘッダー "STAT"または "S")が表示するさまざまな値を次に示します。

  • [〜#〜] d [〜#〜]無停電スリープ(通常はIO)
  • [〜#〜] r [〜#〜]実行中または実行可能(実行キュー上)
  • [〜#〜] s [〜#〜]割り込み可能なスリープ(イベントの完了を待機)
  • [〜#〜] t [〜#〜]ジョブ制御信号によって、またはトレースされているために停止しました。
  • [〜#〜] w [〜#〜]ページング(2.6.xxカーネル以降は無効)
  • [〜#〜] x [〜#〜]死んでいる(決して見られるべきではない)
  • [〜#〜] z [〜#〜]終了した(「ゾンビ」)プロセスは終了しましたが、親によっては取得されていません.

出典: man ps

私は最近2番目のリストに遭遇しました:

  • [〜#〜] r [〜#〜]実行中
  • [〜#〜] s [〜#〜]割り込み可能な待機でスリープ
  • [〜#〜] d [〜#〜]無停止ディスクスリープで待機しています
  • [〜#〜] z [〜#〜]ゾンビ
  • [〜#〜] t [〜#〜]停止(シグナル上)または(Linux 2.6.33より前)トレースが停止
  • tトレース停止(Linux 2.6.33以降)
  • [〜#〜] w [〜#〜]ページング(Linux 2.6.0より前のみ)
  • [〜#〜] x [〜#〜]デッド(Linux 2.6.0以降)
  • xDead(Linux 2.6.33から3.13のみ)
  • [〜#〜] k [〜#〜]Wakekill(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"セクション内:

61
Homer6

最近同じ質問があります。 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 '?';
  }
}

したがって、/ 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」ステータスは「フォークによって作成されているプロセス」であることを意味します。それは何ですか? 古い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プロセスコード用に調整されていませんでした。

更新:これ バグは修正されました 。オープンソース!

19