就绪状态的线程消耗 CPU

Thread in ready state consumes CPU

我知道只有处于 运行 状态的线程实际消耗 CPU 但如下图所示,在 QNX 平台中,总 CPU 状态是 99.3,这是四个的累加只有一个线程处于 运行 状态。

知道为什么 CPU 消耗的线程比 运行 线程消耗的多吗?

    CPU states: 99.3% user, 0.6% kernel
    CPU  0 Idle: 0.0% 
    CPU  1 Idle: 0.0% 
    Memory: 0 total, 1G avail, page size 4K
    PID   TID PRI STATE HH:MM:SS CPU  COMMAND
    704585 11  10  Run   0:01:52 24.82% App
    704585 10  10  Rdy   0:01:52 24.68% App
    704585 13  10  Rdy   0:01:52 24.53% App
    704585 16  10  Rdy   0:01:49 24.19% App

就绪的线程在消耗 CPU 时处于 运行ning 状态。鉴于非常相似的 CPU 值,我敢打赌所有这些线程总是准备好 运行 或 运行ning.

处于 运行 状态的线程是唯一 当前 在当前时刻消耗 CPU 的线程,但处于 READY 状态的线程是那些正在有资格在一段时间内消费 CPU。

您的处理器有两个内核,因此最多可以同时 运行 两个线程。任何数字都可以就绪(即未阻塞和 运行 可用,但不一定当前在核心上执行),并且根据适用的优先级和调度方法,这些将 运行。由于您正在查询进程管理器的线程状态,因此这两个核心之一显然会在该实例中 运行 在进程管理器中创建一个线程。另一个核心仍将 运行 从系统中未阻塞的线程集中选择一个可用的 READY 线程,同样基于优先级和调度算法。这就是为什么您的四个线程中只有一个显示为 运行ning,而其他线程只是准备就绪。其他三个线程准备就绪意味着,假设它们与您当前的其他 运行ning 线程具有相同的优先级,调度程序将根据您的调度算法 运行 可用核心上的那些线程正在使用,只要没有更高优先级的线程处于或变为 READY。线程状态反映了进程管理器被要求提供来自内核的线程状态信息时的瞬时状态,而使用情况统计反映了 activity 随着时间的推移而不是瞬时状态。在短时间内,如果您有四个循环线程全部就绪并且具有相同的优先级 运行ning 循环,您将看到四个线程中的每一个的利用率接近 25%。但是,如果您只有两个内核,那么在任何一个时刻都只能有两个 运行,并且如果您实际上忙于获取有关线程状态的信息,那么这两个可用内核中的一个正忙于获取该信息,您将永远在 运行 状态下最多查看另一个线程。如果您使用的是 QNX,我建议您阅读并记住系统架构手册 (http://www.qnx.com/download/feature.html?programid=26183)。通道。 2 对线程生命周期和调度的讨论解决了这个问题。 希望对您有所帮助。