Windows 系统中CPU 利用率那些事

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 利用率的原因可能包括以下几点:

  1. 多核处理器:在多核处理器系统中,每个核心的利用率可以独立计算。例如,一个四核处理器的总利用率最大可以达到 400%。
  2. 计数错误或采样误差:某些监控工具可能在计算 CPU 利用率时出现误差或采样不准确,从而导致显示的利用率超过 100%。
  3. 高优先级进程:某些高优先级进程可能会被操作系统安排使用更多的 CPU 时间,从而导致报告的利用率超过 100%。
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值