Android使用top指令,在多核cpu占用统计中,cpu占用比与linux不一致,其统计的为所有核心占用百分比,非单核平均占用。
比如4核cpu下,top指令统计出的所有进程cpu占用百分比之和是100%,而非400%,具体的分析可从top.c源码中分析:
源码路径:
system/core/toolbox/top.c
读取/proc/stat文件:
file = fopen("/proc/stat", “r”);
fscanf(file, “cpu %lu %lu %lu %lu %lu %lu %lu”, &new_cpu.utime, &new_cpu.ntime, &new_cpu.stime,
&new_cpu.itime, &new_cpu.iowtime, &new_cpu.irqtime, &new_cpu.sirqtime);
上面读取的是4核cpu总共的运行时间,/proc/stat文件内容如下:
cpu 3055548 471585 1702314 676282 4341 22 5840 0 0 0--------------读取的该行内容,为4核心总共的运行时间。
cpu0 717093 93095 488195 157670 837 2 3895 0 0 0
cpu1 800617 139532 431233 153768 898 12 719 0 0 0
cpu2 780953 122609 407102 161474 1373 6 623 0 0 0
cpu3 756885 116349 375784 203370 1233 2 603 0 0 0
将当前时间点读取到的cpu时间存为old_cpu中。
memcpy(&old_cpu, &new_cpu, sizeof(old_cpu));
经过时间段(-d指定)后读取到cpu占用时间减去上一个时间点的时间,注意这里仍然是4核总共的。
total_delta_time = (new_cpu.utime + new_cpu.ntime + new_cpu.stime + new_cpu.itime
+ new_cpu.iowtime + new_cpu.irqtime + new_cpu.sirqtime)
- (old_cpu.utime + old_cpu.ntime + old_cpu.stime + old_cpu.itime
+ old_cpu.iowtime + old_cpu.irqtime + old_cpu.sirqtime);
打印top表头:
printf("%5s %2s %4s %1s %5s %7s %7s %3s %-8s %s\n", “PID”, “PR”, “CPU%”, “S”, “#THR”, “VSS”, “RSS”, “PCY”, “UID”, “Name”);
打印各个进程的信息:
printf("%5d %2d %3" PRIu64 “%% %c %5d %6” PRIu64 “K %6” PRIu64 “K %3s %-8.8s %s\n”,
proc->pid, proc->prs, proc->delta_time * 100 / total_delta_time, proc->state, proc->num_threads,
proc->vss / 1024, proc->rss * getpagesize() / 1024, proc->policy, user_str, proc->name[0] != 0 ? proc->name : proc->tname);
proc->delta_time * 100 / total_delta_time这就是进程占用的cpu值,这个total_delta_time是上面计算的4核总共的时间片占用。proc->delta_time为/proc/pid/stat中,所有的子线程占用的单核心cpu时间片,加和得到。
所以android中的top打印出的数值都是4核心为分母计算的,不是单核的占用。