Windows 平台下 CPU 使用率的计算
在 Windows 平台下,CPU 使用率通过计算 CPU 在用户态和内核态的时间与总时间的比值来确定。任务管理器的刷新周期通常为 1 秒,这意味着在每秒刷新时计算 CPU 的忙碌时间与总时间的比值。CPU 使用率可以通过以下公式计算:
[ \text{CPU 使用率} = 1 - \frac{\text{空闲时间}}{\text{总的 CPU 时间}} \times 100 ]
其中:
- (\text{总的 CPU 时间} = \text{用户态时间} + \text{内核态时间})
- (\text{空闲时间}) 是 CPU 处于空闲状态的时间
获取 CPU 时间信息的方法
在 Windows 中,可以使用以下 API 获取 CPU 时间信息:
GetSystemInfo
:获取系统信息,包括 CPU 的数量。GetSystemTimes
:获取系统总的 CPU 时间(用户态时间、内核态时间和空闲时间)。
代码示例
下面的 Python 示例代码展示了如何使用 ctypes
库从 Windows API 获取 CPU 时间,并计算 CPU 使用率。
import ctypes
import time
class FILETIME(ctypes.Structure):
_fields_ = [("dwLowDateTime", ctypes.c_uint32),
("dwHighDateTime", ctypes.c_uint32)]
def filetime_to_int(filetime):
return (filetime.dwHighDateTime << 32) + filetime.dwLowDateTime
def get_cpu_times():
idle_time = FILETIME()
kernel_time = FILETIME()
user_time = FILETIME()
ctypes.windll.kernel32.GetSystemTimes(ctypes.byref(idle_time), ctypes.byref(kernel_time), ctypes.byref(user_time))
return (filetime_to_int(idle_time), filetime_to_int(kernel_time), filetime_to_int(user_time))
def calculate_cpu_utilization(prev_times, current_times):
prev_idle, prev_kernel, prev_user = prev_times
curr_idle, curr_kernel, curr_user = current_times
idle_time = curr_idle - prev_idle
kernel_time = curr_kernel - prev_kernel
user_time = curr_user - prev_user
total_time = kernel_time + user_time
utilization = 1 - (idle_time / total_time)
return utilization * 100
prev_times = get_cpu_times()
time.sleep(1)
current_times = get_cpu_times()
cpu_utilization = calculate_cpu_utilization(prev_times, current_times)
print(f"CPU Utilization: {cpu_utilization:.2f}%")
为什么会出现超过 100% 的 CPU 利用率
出现超过 100% 的 CPU 利用率的原因可能包括以下几点:
- 多核处理器:在多核处理器系统中,每个核心的利用率可以独立计算。例如,一个四核处理器的总利用率最大可以达到 400%。
- 计数错误或采样误差:某些监控工具可能在计算 CPU 利用率时出现误差或采样不准确,从而导致显示的利用率超过 100%。
- 高优先级进程:某些高优先级进程可能会被操作系统安排使用更多的 CPU 时间,从而导致报告的利用率超过 100%。