通过编程控制CPU利用率

简介: 今天想起一个几年前学习过的程序,是在《编程之美》中提到的,是作为当时微软的面试题,写一个程序来控制CPU的利用率保持在50%,进一步延伸,能够写出程序来画出CPU利用率的正弦曲线。
今天想起一个几年前学习过的程序,是在《编程之美》中提到的,是作为当时微软的面试题,写一个程序来控制CPU的利用率保持在50%,进一步延伸,能够写出程序来画出CPU利用率的正弦曲线。
这个题目看起来真是奇怪,能够达到这种程度,编程感觉就是出神入化了,但是仔细看看这个题目还是有一些依据可循,也有点小聪明的意思。
首先,对我们来说,能够直观感受CPU利用率就是通过任务管理器来得到的,我们可以大体的观察得到,基本上刷新CPU利用率的情况是按照秒来更新的,任何额外的操作都可能造成CPU的抖动,比如我打开另外一个程序,或者动动鼠标之类的。
所以在程序中,处理的时候CPU就开始忙起来了,如果想在一定的时间频度内给予CPU空闲时间,使得CPU利用率保持在50%,就代表
(CPU忙碌/(CPU忙碌+CPU空闲)=50%
从程序中来实现,CPU忙碌可以通过循环来实现,而空闲则可以通过sleep来实现。
关于这个实现,自己使用了如下的代码

点击(此处)折叠或打开

  1. public class CPUTest 
  2. { 
  3.     public static void main(String[] args) 
  4.     { 
  5.         long startTime = 0; 
  6.         int busyTime = 10; 
  7.         int idleTime = 10;
  8.         while (true) 
  9.         { 
  10.             startTime = System.currentTimeMillis(); 
  11.             while (System.currentTimeMillis() - startTime = busyTime) 
  12.                 try 
  13.             { 
  14.                 Thread.sleep(idleTime); 
  15.             } 
  16.             catch (InterruptedException e) 
  17.             { 
  18.                 e.printStackTrace(); 
  19.               }
  20.         } 
  21.     }
  22. }
这个程序来本地的环境中测试,因为是多CPU的,所以得到的结果总是不太满意,没有达到预期,在单核的情况是没有问题的。
我灵机一动,可以通过Total CPU的使用率来说明。在任务管理器->性能 页面的右下角,有个资源监控的按钮,点进去就能看到一些详细的信息了。


得到了基本的要求,使得CPU利用率在50%左右,我们可以得到一个更为复杂的例子,就是画出正弦曲线来。
这个例子在本地测试基本得到了预期的效果。
使用的代码如下:

点击(此处)折叠或打开

  1. public class CPUTest
  2. {
  3.    
  4.     
  5.     public static void main(String[] args) throws Exception {
  6.         final double SPLIT = 0.01;
  7.         final int COUNT = (int) (2 / SPLIT);
  8.         final double PI = Math.PI;
  9.         final int INTERVAL = 200;
  10.         long[] busySpan = new long[COUNT];
  11.         long[] idleSpan = new long[COUNT];
  12.         int half = INTERVAL / 2;
  13.         double radian = 0.0;
  14.         for (int i = 0; i COUNT; i++) {
  15.           busySpan[i] = (long) (half + (Math.sin(PI * radian) * half));
  16.           idleSpan[i] = INTERVAL - busySpan[i];
  17.           radian += SPLIT;
  18.         }
  19.         long startTime = 0;
  20.         int j = 0;
  21.         while (true) {
  22.           j = j % COUNT;
  23.           startTime = System.currentTimeMillis();
  24.           while (System.currentTimeMillis() - startTime busySpan[j])
  25.             ;
  26.           Thread.sleep(idleSpan[j]);
  27.           j++;
  28.         }
  29.       }
  30. }
得到的图表如下,是不是有点味道。


可以通过这个例子看到,如果明白一些基本的知识点,结合实际还是能够得到很多意想不到的效果,学以致用在这个时候还是挺有趣的。
目录
相关文章
|
7月前
|
消息中间件 SQL Kafka
Flink CPU问题之CPU利用率低如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
6月前
|
Prometheus 监控 Cloud Native
grafana展示的CPU利用率与实际不符的问题探究
观察到`mpstat`命令显示单核CPU的`%usr`和`%sys`分别持续在70%和20%,而Grafana监控数据显示较低。问题源于Grafana表达式计算的是CPU时间增量而非利用率。`mpstat`通过`/proc/stat`获取数据并计算CPU利用率,而`node-exporter`直接导出原始数据。调整Grafana表达式以匹配`mpstat`的计算方式后,两者结果一致。解决方案是修正Grafana查询以准确反映CPU占用率。
287 1
grafana展示的CPU利用率与实际不符的问题探究
|
6月前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
105 1
|
6月前
|
Python
python3获取内存和cpu利用率记录日志文件psutil
python3获取内存和cpu利用率记录日志文件psutil
77 1
|
7月前
|
监控 Shell
Shell脚本监控CPU、内存和硬盘利用率
Shell脚本监控CPU、内存和硬盘利用率
|
7月前
|
缓存 编译器 调度
【C/C++ 性能优化】了解cpu 从而进行C++ 高效编程
【C/C++ 性能优化】了解cpu 从而进行C++ 高效编程
427 0
|
7月前
|
安全 机器人
ABB PLC自动化可编程逻辑控制器PLC AC500型 CPU
ABB PLC自动化可编程逻辑控制器PLC AC500型 CPU
|
7月前
|
存储 人工智能 缓存
探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展
近年来,AIGC的技术取得了长足的进步,其中最为重要的技术之一是基于源代码的CPU调优,可以有效地提高人工智能模型的训练速度和效率,从而加快了人工智能的应用进程。同时,多GPU编程技术也在不断发展,大大提高人工智能模型的计算能力,更好地满足实际应用的需求。 本文将分析AIGC的最新进展,深入探讨以上话题,以及中国算力产业的瓶颈和趋势。
|
监控 Shell Perl
监控CPU、内存和硬盘利用率
监控CPU、内存和硬盘利用率
153 1
CPU利用率高又看不到占用率高的进程?
CPU利用率高又看不到占用率高的进程?
177 0