编程之美

Chapter 0:


Nothing replaces hard work.

纸上得来终觉浅,绝知此事要躬行

1.知己(能力、兴趣、方向)知彼(文化、战略、标准)

Chapter 1:


1.1 CPU占用率曲线

Task:
任务管理器中的CPU占用率曲线:

  1. 直线,固定在50%
  2. 直线,参数范围(1-100)
  3. 正弦曲线

环境:

编程之美_第1张图片

观察:
打开任务管理器,监测CPU使用率。根据肉眼观察,曲线一秒更新一次。
CPU占用为0时,是System Idle Process 占用了CPU的空闲时间。

闲下来:
进程或者在等待用户输入,或者在等待某些事件的发生,或者主动进入休眠状态。

CPU占用率:
在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率。

测试:

  • 只打开idea和任务管理器时,CPU利用率如下:


    编程之美_第2张图片

    CPU占用率稳定在5-8%左右,但是过几秒会出现20%左右的未知原因的峰值,暂称之为“大狗牙”

补充:
通过观察任务管理器,发现“大狗牙”是“服务和控制器应用”、“桌面窗口管理器”、“System”和任务管理器自身等几个系统进程占用了CPU

  • 启动一个死循环线程
        Thread t1 = new Thread(){
            @Override
            public void run() {
                while(true){
                }
            }
        };
        t1.start();

CPU占用率如下:


编程之美_第3张图片

CPU占用率稳定在32%左右,大狗牙为49%

  • 启动两个死循环线程
        Thread t1 = new Thread(){
            @Override
            public void run() {
                while(true){
                }
            }
        };
        Thread t2 = new Thread(){
            @Override
            public void run() {
                while(true){
                }
            }
        };
        t1.start();
        t2.start();

CPU占用率如下:


编程之美_第4张图片

CPU占用率稳定在57%左右,大狗牙为70%

  • 同理,启动三个死循环线程,CPU占用率如下:
编程之美_第5张图片

CPU占用率稳定在80%左右,大狗牙为91%

  • 启动四个死循环线程,CPU占用率如下:
编程之美_第6张图片

CPU占用100%

对于四核四线程的CPU,启动四个死循环线程,每个线程分别可以占满25%的CPU占用率。故我们可以调控每个线程的CPU占用,来达到总计50%的CPU占用率。

根据当前测试环境的情况,我们可以使用一个线程占满25%的CPU占用率,另一个线程占用20%的CPU占用率来实现近似50%占用率的目标。

上边我们通过空循环占用满了25%的CPU使用率,如何让一个线程占用20/25=80%的单个内核使用率呢?

按照书中的介绍,要操纵CPU的使用率曲线,就需要使CPU在一段时间内(根据Task Manager的采样率)跑busy和idle两个不同循环(loop),从而通过不同的时间比例,来调节CPU使用率。

书中提及的空循环汇编代码:

next:
mov  eax, dword ptr [i]  ; i 放入寄存器
add  eax, 1              ; 寄存器加 1
mov  dword ptr [i], eax  ; 寄存器赋回 i
cmp  eax, dword ptr [n]  ; 比较 i 和 n 
jl   next                ; i 小于 n 时重复循环

我的CPU是3.19 GHz,即3.19 * 10 的9次方个时钟周期/秒
现代CPU每个时钟周期可以执行两条以上代码,取平均值两条
有共计5条代码
于是有(3 190 000 000 * 2) / 5 = 1 276 000 000,也就是说CPU一秒可以执行空循环
1 276 000 000次,降低两个数量级,令 n = 12 760 000,相应的睡眠时间改为 10 毫秒(10毫秒比较接近Windows的调度时间片)






你可能感兴趣的:(编程之美)