c语言程序会使cpu变高,用 C 语言写个程序,运行时,cpu占用率一直保持50%
好記性不如爛筆頭 ——東西太多,腦子永遠不夠用
問題
用 C 語言寫個程序,運行時,cpu占用率一直保持50%
解決方案
一看題目好眼熟!《編程之美》!然而已經記不清楚了,果然東西需要經常用經常積累,廢話不多說重來一遍。
第一步:cpu占用率計算方法
既然想要讓cpu占有率一直保持一定數值,就想要弄明白,cpu占用率是如何得到的
在Linux下,CPU利用率分為用戶態,系統態和空閑態,分別表示CPU處于用戶態執行的時間,系統內核執行的時間,和空閑系統進程執行的時間,三者之和就是CPU的總時間,當沒有用戶進程、系統進程等需要執行的時候,CPU就執行系統缺省的空閑進程。從平常的思維方式理解的話,CPU的利用率就是非空閑進程占用時間的比例,即CPU執行非空閑進程的時間/ CPU總的執行時間。
那么問題就很簡單了,我們只要保持讓cpu運行50,休息50就可以保證cpu的利用保持在50%了(忽略其他程序的影響)。運行到100%很簡單,無限循環執行代碼,不過應該會報錯吧?先試試。
#include
int main(){
while(1){
for(int i = 0 ;i<100;i++);
}
return 0;
}
代碼執行完畢,成功接近100%(話說死循環不報錯的嗎?)
代碼執行結果
下面我們要做的就是控制好進程閑置的時間,讓cpu的閑置時間等于非閑置時間,問題也就解決了。最笨的方法先填一個數字試試。
#include
#include
int main(){
while(1){
for(int i = 0 ;i<100;i++){};
sleep(50);
}
return 0;
}
在mac下for循環后面需要加花括弧不然會報錯,不知道為什么之前的不報錯。
結果是沒有反應。cpu:0,執行時間0。好吧好像太低估cpu能力了。還是科學一點的方案吧。用時鐘記錄運行開始時間,并控制runtime和idle的時間比例就可以了。雖然時鐘會有一定的誤差,但是理論上是可以行的通的。
#include
#include
#include
#include
int main(){
int time_start;
int fulltime = 100;//總時間
int runtime = 50;//運行時間
while(1){
time_start = clock();
while((clock()-time_start)
usleep(fulltime-runtime);
}
return 0;
}
運行結果
從運行結果中,可以看到并沒有達到50%,根據我的猜測有以下幾點影響:
1、系統中還有其他運行程序,留給本程序的cpu肯定達不到100% 。從理論上來說本程序進行的更頻繁,占用cpu也會更多,可以嘗試把時間改到1,結果應該會更接近點
2、時鐘計算的誤差,無論是clock()還是usleep()都存在誤差。特別是睡眠的時鐘會設置一個緩沖區域,之前之后醒來都可以。
如果想要做的更準確的話,應該實時監測cpu使用率,然后來控制程序運行,不過應該也做不到完全準確,畢竟cpu使用率只是一個統計值。
關于sleep()函數的單位很頭疼,不同平臺好像有不同的參數單位,可以自己嘗試一下。
附上java代碼以及運行結果
import java.lang.Thread;
import java.text.SimpleDateFormat;
public class cpu50 {
public static void main(String[] args) {
long time_start;
int fulltime = 100;
int runtime = 50;
while(true){
time_start = System.currentTimeMillis();
while((System.currentTimeMillis()-time_start)
try {
Thread.sleep(fulltime-runtime);
}catch (InterruptedException e) {
return;
}
}
}
}```

總結
以上是生活随笔為你收集整理的c语言程序会使cpu变高,用 C 语言写个程序,运行时,cpu占用率一直保持50%的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux显卡烤机操作,显卡拷机必备:F
- 下一篇: c语言定义链式队列用菜单,数据结构之--