我目前正在创建一个程序,用于识别挂起/失控且占用整个 CPU 核心的进程。然后该程序终止这些进程,以便可以控制 CPU 使用率。这些都是单线程进程。
但是,我遇到了一个问题:当我在 Windows 上执行“tasklist”命令时,它会输出以下内容:
Image Name: Blockland.exe
PID: 4880
Session Name: Console
Session#: 6
Mem Usage: 127,544 K
Status: Running
User Name: [removed]\[removed]
CPU Time: 0:00:22
Window Title: C:\HammerHost\Blockland\Blockland.exe
所以我知道“CPU 时间”这一行表示程序自启动以来所用的总时间(以秒为单位)。
但是,假设系统上有 4 个 CPU 核心。这是否意味着它占用了一个核心的 22 秒,因此总共占用了整个 CPU 的 5.5 秒?或者这是否意味着该进程占用了整个 CPU 的 22 秒?
答案1
“CPU 时间”是程序在所有 CPU 上使用的总时间(如果您禁用了超线程,则此处的“CPU”表示“核心”;如果启用了超线程,则表示“逻辑处理器”)。
因此,在具有四个核心且禁用 HT 的系统上,运行时间为 30 秒的程序理论上最多可以使用 120 秒的 CPU 时间。
正如 MaQleod 所说,单线程每次只能在一个 CPU 上运行。然而,单线程程序如今相当少见。
这是否意味着它占用了一个核心的 22 秒,因此整个 CPU 总共占用了 5.5 秒?或者这是否意味着该过程占用了整个 CPU 的 22 秒?
一个核心上可能为 22 秒。也可能意味着四个核心上同时各为 5.5 秒,这可以描述为“整个 CPU 上为 5.5 秒”。或者一个核心上为 5 秒,另一个核心上为 2 秒,第三个核心上为 15 秒,而第四个核心上则为零。
或者,22 秒的总 CPU 时间可以分散到更长的挂钟时间中,需要等待很长时间。大多数程序大部分时间都在等待。比总 CPU 使用时间更有用的指标是百分比CPU 时间使用情况。但真正识别占用大量 CPU 的程序非常棘手,而那些只是暂时计算受限的程序则不然。终止进程可能会丢失工作,甚至损坏文件 - 您确定要这样做吗?
提示:不要尝试终止空闲进程。