5

当一个进程进入一种特殊的睡眠,在 Linux 中称为“D”或“磁盘睡眠”,它的子线程是否仍然正常运行?这样线程就可以告诉我进程处于“磁盘睡眠”状态。

关于“D”状态

顺便说一句:对不起我的英语不好,谢谢大家。

4

1 回答 1

8

在 Linux 中,线程被定义为“任务”。

每个任务都是进程中的一个单独的执行单元。它们都有各自的任务 ID tid- 与进程 ID ( pids) 相关。

每个进程在启动时都带有一个主任务,并且该“主”任务标识了该进程,并且实际上进程 IDpidtid主任务的任务 ID。

执行方面的流程状态类似于主要任务的状态,包括状态R、...DS

因此,如果您的进程被标记为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相同)一样具有状态(等待终端输入),而另一个线程是. 如果您设置为较小的值,它实际上会在某个时候完成。tidpidRi

于 2013-08-05T10:49:38.907 回答