博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
控制CUP占用率曲线
阅读量:6974 次
发布时间:2019-06-27

本文共 4103 字,大约阅读时间需要 13 分钟。

       在《编程之美》上看过一道面试题就是要求:输出cup占用率的曲线图

今天看到了一篇文章就试试看看:

#include 
#include
#include
#include
using namespace std;//得到循环0xFFFFFFFF次用的秒数unsigned int test(){ unsigned int c = 0xFFFFFFFF; time_t t1, t2; time(&t1); for (unsigned int i = 0; i < c; i++) ; time(&t2); return (unsigned int)(t2 - t1);}#define T 20000 //周期时间 20秒#define C 100 //采样点时间间隔#define PI 3.1415 //PIconst unsigned int _count = 0xFFFFFFFF / (test() * 1000); //采样间隔可以执行的循环数目 //考虑到了当前系统的运行程序const unsigned int N = T / C; //周期内采样点数目unsigned int v[N] = { 0 }; //所有采样点连续执行循环数unsigned int mt[N] = { 0 }; //所有采样点休眠毫秒数int main(){ //指定运行CPU SetThreadAffinityMask(GetCurrentThread(), 8); for (int i = 0; i < N; i++) { double x = 2 * PI * i / N; double r = (sin(x) + 1) / 2; mt[i] = C - r * C; //空闲时间 v[i] = r * C * _count; //忙的时间,考虑当前cup使用情况 } for (;;) { for (int i = 0; i < N; i++) { for (int j = 0; j < v[i]; j++) ; Sleep(mt[i]); } }}

实验结果:指定运行cup和核数有关吧

首先什么是CPU占用率?

在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。

因此可以写个程序,在一个刷新周期中,一会儿忙,一会儿闲,调节忙/闲比例,就可以控制CPU占有率!

       题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:

 1.    CPU的占用率固定在50%,为一条直线;

 2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);

 3.    CPU的占用率状态是一个正弦曲线。

 直线cpu:使x=0即可:

#include 
#include
#include
#include
using namespace std;//得到循环0xFFFFFFFF次用的秒数unsigned int test(){ unsigned int c = 0xFFFFFFFF; time_t t1, t2; time(&t1); for (unsigned int i = 0; i < c; i++) ; time(&t2); return (unsigned int)(t2 - t1);}#define T 20000 //周期时间 20秒#define C 100 //采样点时间间隔#define PI 3.1415 //PIconst unsigned int _count = 0xFFFFFFFF / (test() * 1000); //采样间隔可以执行的循环数目const unsigned int N = T / C; //周期内采样点数目unsigned int v[N] = { 0 }; //所有采样点连续执行循环数unsigned int mt[N] = { 0 }; //所有采样点休眠毫秒数int main(){ //指定运行CPU SetThreadAffinityMask(GetCurrentThread(), 1); ////正弦cpu //for (int i = 0; i < N; i++) //{ // double x = 2 * PI * i / N; // double r = (sin(x) + 1) / 2; // mt[i] = C - r * C; // v[i] = r * C * _count; //} //for (;;) //{ // for (int i = 0; i < N; i++) // { // for (int j = 0; j < v[i]; j++) // ; // Sleep(mt[i]); // } //} //直线cpu for (int i = 0; i < N; i++) { double x = 2 * PI * i / N; x = 0; double r = (sin(x) + 1) / 2; mt[i] = C - r * C; v[i] = r * C * _count; } for (;;) { for (int i = 0; i < N; i++) { for (int j = 0; j < v[i]; j++) ; Sleep(mt[i]); } }}//没有考虑现在系统cpu使用情况//#include
//#include
//int main(void)//{// SetThreadAffinityMask(GetCurrentProcess(), 1);// const double SPLIT = 0.01;// const int COUNT = 200;// const double PI = 3.14159265;// const int INTERVAL = 300;// DWORD busySpan[COUNT]; //array of busy time// DWORD idleSpan[COUNT]; //array of idle time// int half = INTERVAL / 2;// double radian = 0.0;// for (int i = 0; i < COUNT; i++)// {// busySpan[i] = (DWORD)(half + (sin(PI*radian)*half));// idleSpan[i] = INTERVAL - busySpan[i];// radian += SPLIT;// }// DWORD startTime = 0;// int j = 0;// while (true)// {// j = j%COUNT;// startTime = GetTickCount();// while ((GetTickCount() - startTime) <= busySpan[j])// ;// Sleep(idleSpan[j]);// j++;// }// return 0;//}

结果:

 

reference:

   

转载地址:http://deesl.baihongyu.com/

你可能感兴趣的文章
MYSQL数据库设计规范与原则
查看>>
chrome贴吧插件——源代码
查看>>
201621123048《Java程序设计》第六周学习总结
查看>>
Eclipse快捷键大全(转载)
查看>>
python压缩文件脚本
查看>>
把Catalina的字符串格式转化为日期格式
查看>>
【语法】NSMutableString的用法
查看>>
前端知识点总结(html+css)部分
查看>>
VI/VIM 编辑器
查看>>
C#写爬虫,版本V2.0
查看>>
基于Ubuntu16搭建Hadoop大数据完全分布式环境
查看>>
网络爬虫
查看>>
python-memcached学习笔记
查看>>
转--Java工程师成神之路(2018修订版)
查看>>
学习python第一天内容回顾
查看>>
原码,补码表示
查看>>
(最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160
查看>>
面面观 | CentOS install etcd 测试
查看>>
[CF566A]Matching Names
查看>>
[Oracle]ORA-01461: can bind a LONG value only for insert into a LONG column
查看>>