Chr*_*nte 69 algorithm cpu performance cpu-architecture cpu-usage
在我的桌面上,我有一个小小部件告诉我当前的CPU使用情况.它还显示了我的两个核心的使用情况.
我总是想知道,CPU如何计算其处理能力的使用量?此外,如果CPU挂起来进行一些强烈的计算,它怎么能(或任何处理此活动)检查使用情况,而不会挂断?
dav*_*ave 64
有一个称为空闲任务的特殊任务,在没有其他任务可以运行时运行.%使用率只是我们没有运行空闲任务的时间百分比.操作系统将保持运行空闲任务所花费的总时间:
如果我们将相隔n秒运行总计的两个样本,我们可以计算运行空闲任务所花费的n秒的百分比(第二个样本 - 第一个样本)/ n
请注意,这是操作系统所做的事情,而不是CPU.CPU级别不存在任务的概念!(实际上,空闲任务会使处理器使用HLT指令进入休眠状态,因此CPU确实知道它何时未被使用)
至于第二个问题,现代操作系统是先发制人的多任务,这意味着操作系统可以随时切换您的任务.操作系统如何实际窃取CPU远离您的任务?中断:http://en.wikipedia.org/wiki/Interrupt
In *_*ico 30
CPU本身不进行使用计算.它可能具有硬件功能,使该任务更容易,但它主要是操作系统的工作.显然,实现的细节会有所不同(特别是在多核系统的情况下).
一般的想法是看看CPU需要做多长时间的事情.操作系统可以定期查看调度程序以确定它必须执行的操作的数量.
#define FSHIFT 11 /* nr of bits of precision */
#define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */
#define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */
#define CALC_LOAD(load,exp,n) \
load *= exp; \
load += n*(FIXED_1-exp); \
load >>= FSHIFT;
unsigned long avenrun[3];
static inline void calc_load(unsigned long ticks)
{
unsigned long active_tasks; /* fixed-point */
static int count = LOAD_FREQ;
count -= ticks;
if (count < 0) {
count += LOAD_FREQ;
active_tasks = count_active_tasks();
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
}
}
Run Code Online (Sandbox Code Playgroud)
至于问题的第二部分,大多数现代操作系统都是多任务的.这意味着操作系统不会让程序占用所有的处理时间而且没有任何处理时间(除非你做到这一点).换句话说,即使应用程序出现挂起,操作系统仍然可以为自己的工作偷走一些时间.
zil*_*n01 14
要获得CPU使用率,请定期对总处理时间进行采样,并找出差异.
例如,如果这些是进程1的CPU时间:
kernel: 1:00:00.0000
user: 9:00:00.0000
Run Code Online (Sandbox Code Playgroud)
然后你在两秒钟后再次获得它们,它们是:
kernel: 1:00:00.0300
user: 9:00:00.6100
Run Code Online (Sandbox Code Playgroud)
你减去内核时间(差异0.03)和用户时间(0.61),将它们加在一起(0.64),然后除以2秒的采样时间(0.32).
因此,在过去的两秒钟内,该进程平均使用32%的CPU时间.
获取此信息所需的特定系统调用(显然)在每个平台上都是不同的.在Windows上,如果需要快捷方式总使用时间或空闲CPU时间,则可以使用GetProcessTimes或GetSystemTimes.
小智 8
一种方法如下:
选择一个采样间隔,比如每5分钟(300秒)的实际经过时间.你可以从中得到这个gettimeofday.
获取您在300秒内使用的处理时间.您可以使用此times()调用来获取此信息.这将是new_process_time - old_process_time,这里old_process_time是你的最后的时间段节省了处理时间.
您的cpu百分比是那么(process_time/elapsed_time)*100.0
您可以设置一个警报,每隔300秒发出一次警报来进行这些计算.
我有一个进程,我不想使用超过某个目标CPU百分比.这种方法效果很好,与我的系统监视器很吻合.如果我们使用太多的CPU,我们会睡一会儿.