Chapter 0:
Nothing replaces hard work.
紙上得來終覺淺,絕知此事要躬行
1.知己(能力、興趣店溢、方向)知彼(文化叁熔、戰(zhàn)略、標(biāo)準(zhǔn))
Chapter 1:
1.1 CPU占用率曲線
Task:
任務(wù)管理器中的CPU占用率曲線:
- 直線床牧,固定在50%
- 直線荣回,參數(shù)范圍(1-100)
- 正弦曲線
環(huán)境:
觀察:
打開任務(wù)管理器,監(jiān)測(cè)CPU使用率戈咳。根據(jù)肉眼觀察心软,曲線一秒更新一次。
CPU占用為0時(shí)著蛙,是System Idle Process 占用了CPU的空閑時(shí)間删铃。
閑下來:
進(jìn)程或者在等待用戶輸入,或者在等待某些事件的發(fā)生踏堡,或者主動(dòng)進(jìn)入休眠狀態(tài)泳姐。
CPU占用率:
在任務(wù)管理器的一個(gè)刷新周期內(nèi),CPU忙(執(zhí)行應(yīng)用程序)的時(shí)間和刷新周期總時(shí)間的比率暂吉,就是CPU的占用率胖秒。
測(cè)試:
-
只打開idea和任務(wù)管理器時(shí),CPU利用率如下:
CPU占用率穩(wěn)定在5-8%左右慕的,但是過幾秒會(huì)出現(xiàn)20%左右的未知原因的峰值阎肝,暫稱之為“大狗牙”
補(bǔ)充:
通過觀察任務(wù)管理器,發(fā)現(xiàn)“大狗牙”是“服務(wù)和控制器應(yīng)用”肮街、“桌面窗口管理器”风题、“System”和任務(wù)管理器自身等幾個(gè)系統(tǒng)進(jìn)程占用了CPU
- 啟動(dòng)一個(gè)死循環(huán)線程
Thread t1 = new Thread(){
@Override
public void run() {
while(true){
}
}
};
t1.start();
CPU占用率如下:
CPU占用率穩(wěn)定在32%左右,大狗牙為49%
- 啟動(dòng)兩個(gè)死循環(huán)線程
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占用率穩(wěn)定在57%左右嫉父,大狗牙為70%
- 同理沛硅,啟動(dòng)三個(gè)死循環(huán)線程,CPU占用率如下:
CPU占用率穩(wěn)定在80%左右绕辖,大狗牙為91%
- 啟動(dòng)四個(gè)死循環(huán)線程摇肌,CPU占用率如下:
CPU占用100%
對(duì)于四核四線程的CPU,啟動(dòng)四個(gè)死循環(huán)線程仪际,每個(gè)線程分別可以占滿25%的CPU占用率围小。故我們可以調(diào)控每個(gè)線程的CPU占用,來達(dá)到總計(jì)50%的CPU占用率树碱。
根據(jù)當(dāng)前測(cè)試環(huán)境的情況肯适,我們可以使用一個(gè)線程占滿25%的CPU占用率,另一個(gè)線程占用20%的CPU占用率來實(shí)現(xiàn)近似50%占用率的目標(biāo)成榜。
上邊我們通過空循環(huán)占用滿了25%的CPU使用率框舔,如何讓一個(gè)線程占用20/25=80%的單個(gè)內(nèi)核使用率呢?
按照書中的介紹,要操縱CPU的使用率曲線刘绣,就需要使CPU在一段時(shí)間內(nèi)(根據(jù)Task Manager的采樣率)跑busy和idle兩個(gè)不同循環(huán)(loop)樱溉,從而通過不同的時(shí)間比例,來調(diào)節(jié)CPU使用率额港。
書中提及的空循環(huán)匯編代碼:
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 時(shí)重復(fù)循環(huán)
我的CPU是3.19 GHz饺窿,即3.19 * 10 的9次方個(gè)時(shí)鐘周期/秒
現(xiàn)代CPU每個(gè)時(shí)鐘周期可以執(zhí)行兩條以上代碼,取平均值兩條
有共計(jì)5條代碼
于是有(3 190 000 000 * 2) / 5 = 1 276 000 000移斩,也就是說CPU一秒可以執(zhí)行空循環(huán)
1 276 000 000次肚医,降低兩個(gè)數(shù)量級(jí),令 n = 12 760 000向瓷,相應(yīng)的睡眠時(shí)間改為 10 毫秒(10毫秒比較接近Windows的調(diào)度時(shí)間片)