当一个进程进入特殊类型的睡眠时,在Linux中被称为“D”或“Disk Sleep”,它的子线程是否仍然正常运行?这样线程可以告诉我进程处于“磁盘休眠”状态。
顺便说一句:抱歉我的英语不好,谢谢大家。
答案 0 :(得分:7)
在Linux中,线程被定义为“任务”。
每个任务都是流程中的单个执行单元。他们都有自己的个人任务ID tid
- 与流程ID(pid
s)相关。
每个进程在启动时都有一个主要任务,“主”任务标识进程,而且进程标识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
(等待终端输入),第一个任务(与进程tid
相同pid
),而另一个线程为{{ 1}}。如果将R
设置为较小的值,它实际上会在某个时刻完成。