Chapter 0:
Nothing replaces hard work.
纸上得来终觉浅,绝知此事要躬行
1.知己(能力、兴趣、方向)知彼(文化、战略、标准)
Chapter 1:
1.1 CPU占用率曲线
Task:
任务管理器中的CPU占用率曲线:
- 直线,固定在50%
- 直线,参数范围(1-100)
- 正弦曲线
环境:
观察:
打开任务管理器,监测CPU使用率。根据肉眼观察,曲线一秒更新一次。
CPU占用为0时,是System Idle Process 占用了CPU的空闲时间。
闲下来:
进程或者在等待用户输入,或者在等待某些事件的发生,或者主动进入休眠状态。
CPU占用率:
在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率。
测试:
-
只打开idea和任务管理器时,CPU利用率如下:
CPU占用率稳定在5-8%左右,但是过几秒会出现20%左右的未知原因的峰值,暂称之为“大狗牙”
补充:
通过观察任务管理器,发现“大狗牙”是“服务和控制器应用”、“桌面窗口管理器”、“System”和任务管理器自身等几个系统进程占用了CPU
- 启动一个死循环线程
Thread t1 = new Thread(){
@Override
public void run() {
while(true){
}
}
};
t1.start();
CPU占用率如下:
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占用率如下:
CPU占用率稳定在57%左右,大狗牙为70%
- 同理,启动三个死循环线程,CPU占用率如下:
CPU占用率稳定在80%左右,大狗牙为91%
- 启动四个死循环线程,CPU占用率如下:
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的调度时间片)