Si un proceso se está muriendo de hambre, el autocontrol para ese proceso no sería tan productivo. Pero, si solo desea que el proceso detecte que no se ha ejecutado por un tiempo, puede llamar al times
periódicamente y comparar la diferencia relativa en el tiempo transcurrido con la diferencia relativa en el tiempo programado del usuario (sumaría los campos tms_utime
y si desea contar los tiempos de espera para los hijos como tiempo productivo, y sumaría en los campos tms_stime
y tms_cstime
si considera que el tiempo del núcleo gastado en su nombre es un tiempo productivo). Para los tiempos de subprocesos, la única forma que conozco es consultar el sistema de archivos /proc
.
Un proceso externo de alta prioridad o un subproceso de alta prioridad podría supervisar externamente procesos (y subprocesos) de interés leyendo las entradas /proc/<pid>/stat
apropiadas para el proceso (y /proc/<pid>/task/<tid>/stat
para los subprocesos). Los tiempos del usuario se encuentran en los campos 14 y 16 del archivo stat
. Los tiempos del sistema se encuentran en los campos 15 y 17. (Las posiciones de campo son precisas para mi kernel Linux 2.6.)
Entre dos puntos de tiempo, determina la cantidad de tiempo transcurrido que ha pasado (un proceso de monitor o una secuencia por lo general se activaría a intervalos regulares). Entonces la diferencia entre los tiempos acumulados de procesamiento en cada uno de esos puntos de tiempo representa cuánto tiempo el hilo de interés llegó a ejecutarse durante ese tiempo. La relación entre el tiempo de procesamiento y el tiempo transcurrido representaría el intervalo de tiempo.
Una última poco de información: En Linux, yo uso el siguiente para obtener el tid
del hilo actual para examinar la derecha task
en el directorio /proc/<pid>/task/
:
tid = syscall(__NR_gettid);
hago esto, porque no podía Busque la llamada al sistema gettid
realmente exportada por cualquier biblioteca de mi sistema, aunque esté documentada. Pero, podría estar disponible en el tuyo.