面试问linux cpu过高,【Linux通信面试题】面试问题:【cpu_lo… - 看准网

参考:http://www.blogjava.net/fjzag/articles/317773.html

基于目前正在开发的手机

proc伪文件系统

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,在Linux 2.6.0-test6以上的版本中/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。

proc/stat

该文件中的所有值都是系统启动至今的数据,不同内核版本时间单位可能不同cat stat

cpu 69904 21104 138494 23477594 1232 0 317 0 0 0

cpu0 28792 2066 56307 2858036 131 0 125 0 0 0

cpu1 27146 1804 51688 2860147 84 0 15 0 0 0

cpu2 5561 1066 10786 2943586 87 0 105 0 0 0

cpu3 4716 642 7122 2951398 35 0 6 0 0 0

cpu4 2109 9525 8942 2952628 626 0 40 0 0 0

cpu5 916 2241 2465 2968654 145 0 10 0 0 0

cpu6 361 1950 682 2971229 62 0 8 0 0 0

cpu7 300 1808 501 2971912 60 0 6 0 0 0

intr 10805705 0 3500279 5996187 0 0 1 18 54 973 26755 0 0 115777 0 5 31482 0 0 0 0 77498 0 22550 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4610 0 0 0 0 0 0 0 0 0 0 0 0 27384 0 0 2965 2947 0 17 1 0 0 1 0 1 27

0 0 0 6 10 249 0 0 0 0 0 0 0

ctxt 7732037

btime 1325375998

processes 28877

procs_running 1

procs_blocked 0

softirq 5725677 1 2134789 0 0 0 0 74120 1979642 0 1537125

cpu  69904 21104 138494 23477594 1232 0 317 0 0 0

是CPU总的使用情况:

进程的nice,进程的nice值一般是-20~19,他影响的是cpu分配给进程的时间片

对nice值一个形象比喻,假设在一个CPU轮转中,有2个runnable的进程A和B,如果他们的nice值都为0,假设内核会给他们每人分配1k个cpu时间片。但是假设进程A的为0,但是B的值为-10,那么此时CPU可能分别给A和B分配1k和1.5k的时间片。故可以形象的理解为,nice的值影响了内核分配给进程的cpu时间片的多少,时间片越多的进程,其优先级越高

参数:                            解析

(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)类似time_in_stat里面的时间取的是10ms

user:69904                                处于用户态的运行时间,不包含nice值为负的进程

nice:21104                                nice值为负的进程所占用的CPU时间

system:138494                        核心态(内核态)的运行时间

idle:23477594                           除I/O等待时间以外的其他等待时间

iowait:1232                                IO等待时间(since 2.5.41之后加入)

irq:0                                              硬中断时间

softirq:317                                       软中断的时间

stealstolen:0                                which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)

guest:0which is the time spent running a virtual  CPU  for  guest operating systems under the control of the Linux kernel(since 2.6.24)

至于这个结论,我不是很赞同啊

总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq+ stealstolen  +  guest

下面是根据上面的内容计算出的cpu的使用率#include

#include

#include

#include

#include

#include

#include "cpu_loading.h"

static si get_argv(char *time_char)

{

char *ch = time_char;

si ret = 0;

if( *ch == '0'){

fprintf(stderr, "interval should not be zero\n");

return INVALID_ARGV;

}

for(ch=time_char; *ch; ch++){

if( *ch == '-' || !(*ch >= '0' || *ch <= '9')){

fprintf(stderr, "please input the correct argv time(no negative)\n");

return INVALID_ARGV;

}

ret = ret*10+(*ch-'0');

}

return ret;

}

static s8 get_init_freq_count(const char *cpu_cur_path, u8 *size, ui *cpu_available_freq)

{

FILE*fp = NULL;

fp = fopen(cpu_cur_path, "r");

u8 i = 0;

if(fp==NULL){

fprintf(stderr, "failed opend file:", cpu_cur_path);

return INVALID_ARGV;

}

// even freq

// odd count

for(i=0; i

cpu_available_freq[i+1] = 0;

if(fscanf(fp,"%d", cpu_available_freq+i)!=1)

break;

}

*size = i;

fclose(fp);

return 0;

}

static void debug_cpufreq_count(u8 cpu0_size, ui *cpu0_available_freq,

u8 cpu4_size, ui *cpu4_available_freq)

{

u8 i = 0;

for(i=0;i

printf("%d\t%d\n", cpu0_available_freq[i], cpu0_available_freq[i+1]);

}

printf("\n");

for(i=0;i

printf("%d\t%d\n", cpu4_available_freq[i], cpu4_available_freq[i+1]);

}

}

static s8 calculate_freq_percent(const u8 cpu_size, ui *cpu_available_freq, ui total_count, char *file_path)

{

u8 i = 0;

FILE *fp = NULL;

fp = fopen(file_path, "r");

ui cur_cpu = 0;

if(fp==NULL){

fprintf(stderr, "", file_path);

return FAILED_OPEN_FILE;

}

while(fscanf(fp,"%d", &cur_cpu)==1){

for(i=0;i

if(cur_cpu==cpu_available_freq[i]){

cpu_available_freq[i+1]++;

break;

}

}

}

fclose(fp);

return 0;

}

static s8 statistic_cpu_stat(const char *stat_path, ui count)

{

FILE *fp = NULL;

FILE *fp_cpu = NULL;

char cpu_stat[BUFFER_SIZE];

char *result_stat;

u8 i = 0;

fp = fopen(stat_path, "r");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", stat_path);

return INVALID_ARGV;

}

if(count%2==0){

fp_cpu = fopen(START_STAT,"a");

}else{

fp_cpu = fopen(END_STAT,"a");

}

if(fp_cpu==NULL){

fprintf(stderr, "failed opend file:\n");

return INVALID_ARGV;

}

fgets(cpu_stat, BUFFER_SIZE, fp);

while(fgets(cpu_stat, BUFFER_SIZE, fp)&&i<8){

result_stat = cpu_stat+3;

fprintf(fp_cpu, "%s", result_stat);

i++;

}

fclose(fp);

fclose(fp_cpu);

return 0;

}

static s8 store_cpu_freq(ui cur_freq, char *file_path)

{

FILE *fp = NULL;

fp = fopen(file_path, "a");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", file_path);

return FAILED_OPEN_FILE;

}

fprintf(fp, "%d\n", cur_freq);

fclose(fp);

return 0;

}

static ui get_store_cur_freq(const char *file_path, char *store_path)

{

FILE*fp = NULL;

ui cur_cpu_freq = 0;

fp = fopen(file_path, "r");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", file_path);

return INVALID_ARGV;

}

fscanf(fp, "%d", &cur_cpu_freq);

fclose(fp);

store_cpu_freq(cur_cpu_freq, store_path);

return 0;

}

static void clear_envirment()

{

remove(LITTLE_CORE);

remove(BIG_CORE);

remove(START_STAT);

remove(END_STAT);

}

static s8 data_simpling(si accummulate_time, si interval, ui total_count)

{

struct timeval start, end;

float timeuse = 0.0;

ui count = 0;

u8 i = 0;

gettimeofday(&start, NULL);

while(count

get_store_cur_freq(CPU0_CUR_FREQ_PATH, LITTLE_CORE);

get_store_cur_freq(CPU4_CUR_FREQ_PATH, BIG_CORE);

statistic_cpu_stat(PROC_CPU_STAT, count);

usleep(100000);

count++;

}

gettimeofday(&end, NULL);

timeuse = (1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec)/1000.0;

printf("time_use is %.2f\n", timeuse);

}

static s8 compute_cpu_loading(char *start_file, char *end_file, float *pcpu_set)

{

FILE *fp_start, *fp_end;

ui start_buffer[BUFFER_SIZE], end_buffer[BUFFER_SIZE];

memset(start_buffer, 0, BUFFER_SIZE);

memset(end_buffer, 0, BUFFER_SIZE);

u8 i = 0, cpu_id, j;

const u8 cpu_consist = 11;

uli total_time = 0;

ui idle_time = 0, set = 0;

float pcpu = 0.0;

fp_start = fopen(start_file, "r");

if(fp_start==NULL){

fprintf(stderr, "failed opend file", start_file);

return FAILED_OPEN_FILE;

}

fp_end = fopen(end_file, "r");

if(fp_end==NULL){

fprintf(stderr, "failed opend file", end_file);

return FAILED_OPEN_FILE;

}

while(fscanf(fp_start, "%d", start_buffer+i)==1 &&

fscanf(fp_end, "%d", end_buffer+i)==1

){

if(i==0){

cpu_id = start_buffer[i];

}

ui minus = end_buffer[i]-start_buffer[i];

total_time+=minus;

if(i==4){

idle_time = minus;

//printf("%d\t%d\t%d\t%d\n", end_buffer[i], start_buffer[i], idle_time, total_time);

}

i++;

if(i==cpu_consist){

set++;

pcpu = ((total_time-idle_time)*1.0/total_time);

//printf("%d\t%f\n", cpu_id, pcpu);

pcpu_set[cpu_id]+=pcpu;

i=0;

total_time = 0;

memset(start_buffer, 0, BUFFER_SIZE);

}

}

set/=8;

for(i=0;i<=cpu_id; i++){

pcpu_set[i] /=set;

printf("cpu%d is %f\n", i, pcpu_set[i]);

}

fclose(fp_start);

fclose(fp_end);

return 0;

}

int main(int argc, char *argv[])

{

si interval , accummulate_time = 0;

ui cpu0_freq , cpu4_freq = 0;

ui total_count = 0;

u8 cpu0_size, cpu4_size, i , j ;

ui cpu0_available_freq[MAX_AVALLABLE_FREQ], cpu4_available_freq[MAX_AVALLABLE_FREQ];

float pcpu_set[BUFFER_SIZE];

// input argc less than 1

if( argc < 1 ){

fprintf(stderr, "you must input two argv");

fprintf(stderr, "first: cal cpu loading tool \n");

fprintf(stderr, "secn: interval time(default:100ms) \n");

fprintf(stderr, "expl: ./data/cpu_loading 100\n");

return INVALID_ARGV;

}

// input argc 1

if(argc==1){

interval = 100;

accummulate_time = 60;

// input argc 2

}else if(argc==2){

interval = get_argv(argv[1]);

if(interval<0){

return INVALID_ARGV;

}

accummulate_time = 60;

// input argc 3

}else{

interval = get_argv(argv[1]);

if(interval<0){

return INVALID_ARGV;

}

accummulate_time = get_argv(argv[2]);

if(accummulate_time<0){

return INVALID_ARGV;

}

}

printf("interval is %d\n", interval);

printf("accummulate_time is %d\n", accummulate_time);

get_init_freq_count(CPU0_AVAILABLE_FREQ_PATH, &cpu0_size, cpu0_available_freq);

get_init_freq_count(CPU4_AVAILABLE_FREQ_PATH, &cpu4_size, cpu4_available_freq);

// debug

//debug_cpufreq_count(cpu0_size, cpu0_available_freq ,cpu4_size, cpu4_available_freq);

total_count = (accummulate_time*1000)/interval;

clear_envirment();

// data cimpling

data_simpling(accummulate_time, interval, total_count);

calculate_freq_percent(cpu0_size, cpu0_available_freq, total_count, LITTLE_CORE);

calculate_freq_percent(cpu4_size, cpu4_available_freq, total_count, BIG_CORE);

// debug

debug_cpufreq_count(cpu0_size, cpu0_available_freq ,cpu4_size, cpu4_available_freq);

// compute pcpux

compute_cpu_loading(START_STAT, END_STAT, pcpu_set);

// show result

for(i=0; i

if(i==0)

printf("\t");

printf("%d\t", cpu0_available_freq[i]);

if(i==cpu0_size-2)

printf("\n");

}

for(i=0; i

if(i==0)

printf("little\t");

printf("%.3f%\t", cpu0_available_freq[i+1]*1.0/total_count*100);

if(i==cpu0_size-2)

printf("\n");

}

for(i=0;i<4;i++){

printf("cpu%d\t", i);

for(j=0;j

printf("%.3f%\t", (cpu0_available_freq[j+1]*1.0/total_count)*100*pcpu_set[i]);

}

printf("\n");

}

printf("\n");

for(i=0; i

if(i==0)

printf("\t");

printf("%d\t", cpu4_available_freq[i]);

if(i==cpu4_size-2)

printf("\n");

}

for(i=0; i

if(i==0)

printf("big\t");

printf("%.3f%\t", cpu4_available_freq[i+1]*1.0/total_count*100);

if(i==cpu4_size-2)

printf("\n");

}

for(i=4;i<8;i++){

printf("cpu%d\t", i);

for(j=0;j

printf("%.3f%\t", (cpu4_available_freq[j+1]*1.0/total_count)*100*pcpu_set[i]);

}

printf("\n");

}

return 0;

}

其中头文件的定义如下:#define INVALID_ARGV-1

#define FAILED_OPEN_FILE-2

#define MAX_AVALLABLE_FREQ40

#define BUFFER_SIZE512

#define CPU0_CUR_FREQ_PATH"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"

#define CPU4_CUR_FREQ_PATH"/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq"

#define CPU0_AVAILABLE_FREQ_PATH"/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"

#define CPU4_AVAILABLE_FREQ_PATH"/sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies"

#define PROC_CPU_STAT"/proc/stat"

#define LITTLE_CORE"/sdcard/little_core"

#define BIG_CORE"/sdcard/big_core"

#define START_STAT"/sdcard/stat_start.txt"

#define END_STAT"/sdcard/stat_end.txt"

typedef signed int si;

typedef signedchar s8;

typedef unsigned char u8;

typedef unsignedint ui;

typedef unsigned long int uli;

运行结果如下:

f12d79b6a72119b31b4b669b92606d7b.png

从另一个维度计算cpu_loading,简称#include

#include

#include

#include

#include

#include

#include "cpu_loading.h"

static void debug_cpufreq_count(u8 cpu0_size, ui *cpu0_available_freq,

u8 cpu4_size, ui *cpu4_available_freq, ui total_count)

{

u8 i = 0;

for(i=0;i

printf("%d\t%.2f%\n", cpu0_available_freq[i], cpu0_available_freq[i+1]*1.0/total_count*100);

}

printf("\n");

for(i=0;i

printf("%d\t%.2f%\n", cpu4_available_freq[i], cpu4_available_freq[i+1]*1.0/total_count*100);

}

}

static si get_argv(char *time_char)

{

char *ch = time_char;

si ret = 0;

if( *ch == '0'){

fprintf(stderr, "interval should not be zero\n");

return INVALID_ARGV;

}

for(ch=time_char; *ch; ch++){

if( *ch == '-' || !(*ch >= '0' || *ch <= '9')){

fprintf(stderr, "please input the correct argv time(no negative)\n");

return INVALID_ARGV;

}

ret = ret*10+(*ch-'0');

}

return ret;

}

static s8 get_init_freq_count(const char *cpu_cur_path, u8 *size, ui *cpu_available_freq)

{

FILE*fp = NULL;

fp = fopen(cpu_cur_path, "r");

u8 i = 0;

if(fp==NULL){

fprintf(stderr, "failed opend file:", cpu_cur_path);

return INVALID_ARGV;

}

// even freq

// odd count

for(i=0; i

cpu_available_freq[i+1] = 0;

if(fscanf(fp,"%d", cpu_available_freq+i)!=1)

break;

}

*size = i;

fclose(fp);

return 0;

}

static void clear_envirment()

{

remove(LITTLE_CORE);

remove(BIG_CORE);

remove(START_STAT);

remove(END_STAT);

remove(PCPU_PATH);

}

static s8 statistic_cpu_stat(const char *stat_path, ui count)

{

FILE *fp = NULL;

FILE *fp_cpu = NULL;

char cpu_stat[BUFFER_SIZE];

char *result_stat;

u8 i = 0;

fp = fopen(stat_path, "r");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", stat_path);

return INVALID_ARGV;

}

if(count%2==0){

fp_cpu = fopen(START_STAT,"a");

}else{

fp_cpu = fopen(END_STAT,"a");

}

if(fp_cpu==NULL){

fprintf(stderr, "failed opend file:\n");

return INVALID_ARGV;

}

// aband sum pcpu

fgets(cpu_stat, BUFFER_SIZE, fp);

while(fgets(cpu_stat, BUFFER_SIZE, fp)&&i<8){

result_stat = cpu_stat+3;

fprintf(fp_cpu, "%s", result_stat);

i++;

}

fclose(fp);

fclose(fp_cpu);

return 0;

}

static s8 store_cpu_freq(ui cur_freq, char *file_path)

{

FILE *fp = NULL;

fp = fopen(file_path, "a");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", file_path);

return FAILED_OPEN_FILE;

}

fprintf(fp, "%d\n", cur_freq);

fclose(fp);

return 0;

}

static ui get_store_cur_freq(const char *file_path, char *store_path)

{

FILE*fp = NULL;

ui cur_cpu_freq = 0;

fp = fopen(file_path, "r");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", file_path);

return INVALID_ARGV;

}

fscanf(fp, "%d", &cur_cpu_freq);

fclose(fp);

store_cpu_freq(cur_cpu_freq, store_path);

return 0;

}

static s8 data_simpling(si accummulate_time, si interval, ui total_count)

{

struct timeval start, end;

float timeuse = 0.0;

ui count = 0;

u8 i = 0;

gettimeofday(&start, NULL);

while(count

get_store_cur_freq(CPU0_CUR_FREQ_PATH, LITTLE_CORE);

get_store_cur_freq(CPU4_CUR_FREQ_PATH, BIG_CORE);

statistic_cpu_stat(PROC_CPU_STAT, count);

usleep(interval*1000);

count++;

}

gettimeofday(&end, NULL);

timeuse = (1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec)/1000.0;

printf("time_use is %.2f\n", timeuse);

}

static s8 store_pcpu(u8 cpu_id, float pcpu)

{

FILE *fp = NULL;

fp = fopen(PCPU_PATH, "a");

if(fp==NULL){

fprintf(stderr, "failed opend file:\n", PCPU_PATH);

return FAILED_OPEN_FILE;

}

fprintf(fp, "%f\n", pcpu);

fclose(fp);

return 0;

}

static si compute_cpu_loading_freq(char *start_file, char *end_file, float *pcpu_set)

{

FILE *fp_start, *fp_end;

ui start_buffer[BUFFER_SIZE], end_buffer[BUFFER_SIZE];

memset(start_buffer, 0, BUFFER_SIZE);

memset(end_buffer, 0, BUFFER_SIZE);

u8 i = 0, cpu_id, j;

const u8 cpu_consist = 11;

uli total_time = 0;

ui idle_time = 0, set = 0;

float pcpu = 0.0;

fp_start = fopen(start_file, "r");

if(fp_start==NULL){

fprintf(stderr, "failed opend file", start_file);

return FAILED_OPEN_FILE;

}

fp_end = fopen(end_file, "r");

if(fp_end==NULL){

fprintf(stderr, "failed opend file", end_file);

return FAILED_OPEN_FILE;

}

while(fscanf(fp_start, "%d", start_buffer+i)==1 &&

fscanf(fp_end, "%d", end_buffer+i)==1){

if(i==0){

cpu_id = start_buffer[i];

}

ui minus = end_buffer[i]-start_buffer[i];

total_time+=minus;

if(i==4){

idle_time = minus;

//printf("%d\t%d\t%d\t%d\n", end_buffer[i], start_buffer[i], idle_time, total_time);

}

i++;

if(i==cpu_consist){

set++;

pcpu = ((total_time-idle_time)*1.0/total_time);

store_pcpu(cpu_id, pcpu);

pcpu_set[cpu_id]+=pcpu;

i=0;

total_time = 0;

memset(start_buffer, 0, BUFFER_SIZE);

}

}

set/=8;

fclose(fp_start);

fclose(fp_end);

return set;

}

static s8 calculate_freq_percent(const u8 cpu0_size, ui *cpu0_available_freq,

ui total_count, const u8 cpu4_size, ui *cpu4_available_freq, si set_group)

{

u8 i = 0, k;

ui j = 0;

FILE *fp_cpu0 = NULL;

FILE *fp_cpu4 = NULL;

FILE *fp_stat = NULL;

ui cpu0_cur_cpu, cpu4_cur_cpu;

float pcpu[BUFFER_SIZE];

float pcpu_per[MAX_AVALLABLE_FREQ][BUFFER_SIZE*10];

ui pcpu_per_count[MAX_AVALLABLE_FREQ][BUFFER_SIZE*10];

fp_cpu0 = fopen(LITTLE_CORE, "r");

if(fp_cpu0==NULL){

fprintf(stderr, "", LITTLE_CORE);

return FAILED_OPEN_FILE;

}

fp_cpu4 =fopen(BIG_CORE, "r");

if(fp_cpu4==NULL){

fprintf(stderr, "", BIG_CORE);

return FAILED_OPEN_FILE;

}

fp_stat = fopen(PCPU_PATH, "r");

if(fp_stat==NULL){

fprintf(stderr, "", PCPU_PATH);

return FAILED_OPEN_FILE;

}

while(fscanf(fp_cpu0,"%d", &cpu0_cur_cpu)==1&&

fscanf(fp_cpu4,"%d", &cpu4_cur_cpu)==1){

for(i=0;i

if(cpu0_cur_cpu==cpu0_available_freq[i]){

cpu0_available_freq[i+1]++;

break;

}

}

for(i=0;i

if(cpu4_cur_cpu==cpu4_available_freq[i]){

cpu4_available_freq[i+1]++;

break;

}

}

if(j%2==1){

i=0;

while(fscanf(fp_stat, "%f", pcpu+i)==1){

pcpu_per[i][cpu0_cur_cpu/1000]+=pcpu[i];

pcpu_per_count[i][cpu0_cur_cpu/1000]++;

//printf("%d\t%d\t%f\t%d\n", i, cpu0_cur_cpu, pcpu[i], pcpu_per_count[i][cpu0_cur_cpu/1000]);

i++;

if(i>3){

break;

}

}

while(fscanf(fp_stat, "%f", pcpu+i)==1){

pcpu_per[i][cpu4_cur_cpu/1000]+=pcpu[i];

pcpu_per_count[i][cpu4_cur_cpu/1000]++;

//printf("%d\t%d\t%.2f\t%d\n", i, cpu4_cur_cpu, pcpu[i],pcpu_per_count[i][cpu4_cur_cpu/1000]);

i++;

if(i>7){

break;

}

}

}

j++;

}

fclose(fp_cpu0);

fclose(fp_stat);

for(j=0;j

if(j==0)

printf(" \t");

printf("%d\t", cpu0_available_freq[j]);

if(j==cpu0_size-2)

printf("\n");

}

for(i=0;i<4;i++){

printf("%d\t", i);

for(j=0;j

if(pcpu_per_count[i][cpu0_available_freq[j]/1000]!=0){

printf("%.2f%\t", pcpu_per[i][cpu0_available_freq[j]/1000]/(pcpu_per_count[i][cpu0_available_freq[j]/1000])*100);

}else{

printf("0.00%\t");

}

}

printf("\n");

}

printf("\n");

for(j=0;j

if(j==0)

printf(" \t");

printf("%d\t", cpu4_available_freq[j]);

if(j==cpu4_size-2)

printf("\n");

}

for(i=4;i<8;i++){

printf("%d\t", i);

for(j=0;j

if(pcpu_per_count[i][cpu4_available_freq[j]/1000]!=0){

printf("%.2f%\t", pcpu_per[i][cpu4_available_freq[j]/1000]/(pcpu_per_count[i][cpu4_available_freq[j]/1000])*100);

}else{

printf("0.00%\t");

}

}

printf("\n");

}

return 0;

}

int main(int argc, char *argv[])

{

si interval , accummulate_time = 0, set_group;

ui cpu0_freq , cpu4_freq = 0;

ui total_count = 0;

u8 cpu0_size, cpu4_size, i , j ;

ui cpu0_available_freq[MAX_AVALLABLE_FREQ], cpu4_available_freq[MAX_AVALLABLE_FREQ];

float pcpu_set[BUFFER_SIZE];

// input argc less than 1

if( argc < 1 ){

fprintf(stderr, "you must input two argv");

fprintf(stderr, "first: cal cpu loading tool \n");

fprintf(stderr, "secn: interval time(default:100ms) \n");

fprintf(stderr, "expl: ./data/cpu_loading 100\n");

return INVALID_ARGV;

}

// input argc 1

if(argc==1){

interval = 100;

accummulate_time = 60;

// input argc 2

}else if(argc==2){

interval = get_argv(argv[1]);

if(interval<0){

return INVALID_ARGV;

}

accummulate_time = 60;

// input argc 3

}else{

interval = get_argv(argv[1]);

if(interval<0){

return INVALID_ARGV;

}

accummulate_time = get_argv(argv[2]);

if(accummulate_time<0){

return INVALID_ARGV;

}

}

printf("interval is %d\n", interval);

printf("accummulate_time is %d\n", accummulate_time);

get_init_freq_count(CPU0_AVAILABLE_FREQ_PATH, &cpu0_size, cpu0_available_freq);

get_init_freq_count(CPU4_AVAILABLE_FREQ_PATH, &cpu4_size, cpu4_available_freq);

// debug

//debug_cpufreq_count(cpu0_size, cpu0_available_freq ,cpu4_size, cpu4_available_freq);

total_count = (accummulate_time*1000)/interval;

clear_envirment();

// data cimpling

data_simpling(accummulate_time, interval, total_count);

set_group = compute_cpu_loading_freq(START_STAT, END_STAT, pcpu_set);

calculate_freq_percent(cpu0_size, cpu0_available_freq, total_count, cpu4_size,cpu4_available_freq, set_group);

return 0;

}#define INVALID_ARGV-1

#define FAILED_OPEN_FILE-2

#define MAX_AVALLABLE_FREQ40

#define BUFFER_SIZE512

#define CPU0_CUR_FREQ_PATH"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"

#define CPU4_CUR_FREQ_PATH"/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq"

#define CPU0_AVAILABLE_FREQ_PATH"/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"

#define CPU4_AVAILABLE_FREQ_PATH"/sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies"

#define PROC_CPU_STAT"/proc/stat"

#define LITTLE_CORE"/sdcard/little_core"

#define BIG_CORE"/sdcard/big_core"

#define START_STAT"/sdcard/stat_start.txt"

#define END_STAT"/sdcard/stat_end.txt"

#define PCPU_PATH"/sdcard/stat_result.txt"

typedef signed int si;

typedef signedchar s8;

typedef unsigned char u8;

typedef unsignedint ui;

typedef unsigned long int uli;

计算结果如下:

interval is 100

accummulate_time is 20

time_use is 20596.07

768000  884000  1000000 1100000 1200000

0       41.64%  45.50%  45.19%  54.13%  52.41%

1       28.25%  28.78%  28.97%  24.77%  42.26%

2       23.41%  24.57%  16.36%  27.08%  46.81%

3       22.34%  15.81%  29.40%  20.00%  20.95%

768000  1050000 1225000 1400000 1500000 1570000

4       1.07%   5.82%   26.26%  10.00%  20.00%  40.00%

5       0.03%   4.00%   0.00%   0.00%   0.00%   0.00%

6       0.03%   0.00%   0.00%   0.00%   0.00%   0.00%

7       0.00%   0.00%   0.00%   0.00%   0.00%   0.00%

io从

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值