macos htop

macos - ¿Qué significa un estado de proceso C en htop?



(3)

Aquí están los diferentes valores que mostrarán los especificadores de salida s, stat y state (encabezado "STAT" o "S") para describir el estado de un proceso:

  • D Sueño ininterrumpido (generalmente IO)
  • R En ejecución o ejecutable (en la cola de ejecución)
  • S Sueño interrumpible (a la espera de que se complete un evento)
  • T Detenido, ya sea por una señal de control de trabajo o porque se está rastreando.
  • W Paging (no válido desde el kernel 2.6.xx)
  • X Muerto (nunca se debe ver)
  • Z Proceso difunto ("zombie"), finalizado pero no obtenido por su padre.

Fuente: man ps

Estoy usando htop en osx y parece que no puedo averiguar qué significa un estado de ''C'' en la columna de estado de ''S'' para un estado de proceso.

¿Qué significa un estado de proceso C en htop?


Tengo la misma pregunta recientemente. Podemos intentar buscarlo en las fuentes de 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 ''?''; } }

Entonces vamos a la definición de estados de proceso de Unix en /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. */

Por lo tanto, el estado ''C'' debe ser ''Proceso creado por la bifurcación''. ¿Qué es? De acuerdo con las fuentes antiguas de Unix , es un estado transitorio que ocurre cuando no hay suficiente memoria cuando se procesa un proceso y el padre debe ser intercambiado.

¿¿Qué??

Volver a la fuente htop. ¿De dónde obtenemos el 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 */

Tenemos el siguiente mapeo (desordenado):

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''

Entonces, la respuesta real es: ''C'' significa que el proceso se está ejecutando actualmente.

¿Como paso? Parece que el manejo de ki->state fue tomado de la fuente ps y no fue ajustado para los códigos de proceso Unix.

Actualización: este error está arreglado . ¡Yay de código abierto!


htop autor aquí. No tengo conocimiento de tal código de estado en el código base de htop. Tenga en cuenta que htop está escrito solo para Linux, por lo que no hay soporte para macOS / OSX. Cuando me entero de personas que lo ejecutan en OSX, a menudo usan una bifurcación desactualizada y no compatible (la última versión de htop es 2.0.1, incluida la compatibilidad con macOS).