Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 为什么线程是';s状态正在运行,但它不';不使用任何CPU?_Linux Kernel_Scheduling_Scheduler_Hyperthreading - Fatal编程技术网

Linux kernel 为什么线程是';s状态正在运行,但它不';不使用任何CPU?

Linux kernel 为什么线程是';s状态正在运行,但它不';不使用任何CPU?,linux-kernel,scheduling,scheduler,hyperthreading,Linux Kernel,Scheduling,Scheduler,Hyperthreading,今天我发现了一个很奇怪的问题。 我运行的是Redhat Enterprise Linux 6,CPU是Intel E31275(4核,8线程)。我发现一个内核线程(我称之为我的_线程)不能正常工作。 使用“ps”命令,我发现我的_线程的状态始终在运行: ps ax 5545 ? R 3:14 [my_thread] 15774 ttyS0 Ss 0:00 -bash ... 但它的运行时间总是3:14。既然它正在运行,为什么总时间没有增加? 从proc文件

今天我发现了一个很奇怪的问题。 我运行的是Redhat Enterprise Linux 6,CPU是Intel E31275(4核,8线程)。我发现一个内核线程(我称之为我的_线程)不能正常工作。 使用“ps”命令,我发现我的_线程的状态始终在运行:

ps ax
5545 ?        R      3:14 [my_thread]
15774 ttyS0    Ss     0:00 -bash
...
但它的运行时间总是3:14。既然它正在运行,为什么总时间没有增加? 从proc文件/proc/5545/sched中,我发现这个线程的所有统计数据,包括唤醒计数(se.nr_wakeups),也总是相同的

在/proc/5545/stack中,我发现这个线程调用了这个函数,但从未返回:

interruptible_sleep_on_timeout(&q, 3*HZ);
理论上,如果没有其他线程唤醒该线程,该函数将每3秒返回一次。每次函数返回后,/proc/5545/sched中的se.nr_唤醒将增加1。但是,在我发现线程有一些问题之后,这种情况从未发生过

有人有什么想法吗?有没有可能,可中断的\u睡眠\u on \u timeout()永远不会返回

更新: 我发现如果我为这个线程设置了CPU相关性,问题就不会发生。如果我把它固定在一个专用的核心上,那么一切都很好。SMP调度是否存在任何问题

再次更新:
在我在BIOS中禁用超线程后,我到目前为止还没有看到这样的问题。

首先,R表示线程未处于运行状态,但处于可运行状态。也就是说,这并不意味着它运行,而是意味着它处于允许调度器选择它运行的状态。这两者之间有很大的区别

在类似意义上,可中断睡眠超时(&q,3*HZ);不会在3个jiffies之后运行线程,而是让它在3个jiffies之后可以运行-实际上,您在“ps”中看到它可以运行,因此可能确实发生了超时

由于您没有提到任何有关内核线程的问题,我甚至不知道它是否在您自己的代码或标准内核代码中,因此我无法真正详细回答


您描述的这种情况的一个可能原因是其他线程(用户或内核)的优先级高于您的线程,因此调度器从不选择它运行。如果是这样的话,它可能不是以实时优先级(SCHED_FIFO或SCHED_RR)运行的线程。

谢谢您的回复。发生此问题时,系统处于空闲状态。CPU空闲百分比超过99%。更新:我发现如果我为该线程设置CPU相关性,则不会出现问题。如果我把它固定在一个专用的核心上,那么一切都很好。SMP调度是否有任何问题?堆栈中的可中断睡眠超时是什么?这是内核线程吗?