当一个进程进入特殊types的睡眠,在Linux中被称为“D”或“磁盘睡眠”,其子线程是否仍然正常运行? 所以线程可以告诉我进程处于“磁盘睡眠”状态。
关于“D”状态
顺便说一句:对不起,我可怜的英语,谢谢大家。
在Linux中,线程被定义为“任务”。
每个任务是一个过程中的一个单独的执行单元。 他们都有自己的任务id tid
– 与进程id( pid
)有关。
每个进程在启动时都带有一个主要任务,“主要”任务标识进程,实际上进程标识pid
是主要任务的任务标识tid
。
执行过程状态类似于主要任务,包括状态R
, D
, S
…
所以如果你的进程被标记为D
(磁盘睡眠),这只是意味着主要任务是在磁盘睡眠。 所有其他任务(线程)可以做其他任何事情。
检查/proc/[pid]/task/[tid]/stat
个别任务状态。
另外ps -eLf
显示任务的ps条目。
试试这个代码:
#include <pthread.h> #include <stdlib.h> #include <stdio.h> void * thread_sleep() { long long int i = -1; while (i--); exit(0); return NULL; } int main() { pthread_t thread; pthread_create(&thread, NULL, thread_sleep, NULL); getchar(); return 0; }
运行它,做
cat /proc/$PID/stat cat /proc/$PID/task/*/stat
您会注意到进程具有状态S
(等待终端输入),如同第一个任务(与进程pid
相同的tid
),而另一个线程是R
如果你把i
放到更小的地方,它实际上会在某个时候完成。