2016-08-14 136 views
1

在SO上還有一些類似的問題,但沒有一個具有滿意的/相關的答案。故意限制只有一個線程的CPU使用率

我有一個單線程的C++程序,做一些事情基本上是這樣的:

while(true) { 
    //do things which are cpu bound 
} 

的問題是,當我運行這個程序,它通常是我的整個計算機上唯一的過程,正在做積極的工作。

沒有別的安排,操作系統很自然地安排了這個程序,我的CPU使用率通過屋頂,我不想要。當然,我的粉絲也開始呼呼,這特別煩人。

我打擊這個的方式是在循環內添加sleep(100)(這在我的正確性方面很好),但是它的工作原理讓我很煩惱,它不是技術上正確的解決方案。

這是因爲如果我想睡一個非常準確的時間量,並且我的計算機上有很多其他進程正在運行,這將不是一個好的解決方案,因爲sleep不準確,它也不允許其他進程使用CPU,而我的程序仍在計劃中 - 但這不是我真正的問題。

什麼是正確的解決方案,以降低CPU的使用,而無需使用sleep,假設這是正在運行的唯一的方案?

+0

通常,如果一個進程是可執行的,OS將執行它。故事結局。如果你不想讓你的程序運行,就睡吧。另外,誰告訴你睡眠進程阻止其他進程執行?誰告訴你這完全錯了。 –

+1

我想你應該調用'std :: this_thread :: yield()',這會優先考慮其他進程。這可能會減少CPU使用率 – Rakete1111

+0

@SamVarshavchik,你是對的。忙於等待一秒鐘。 – noobcoder

回答

0

我在處理數字運算問題時經常遇到類似perl腳本的情況。在運行這些腳本時,我將機器設置爲省電模式(通過設置最大cpu閾值限制)。這有幫助。

0

這裏有3種情況需要考慮。

輪詢循環

輪詢循環,「正確」的解決方案更像是:

while(true) { 
    wait_for_something(); 
    //do things which are cpu bound 
} 

的問題是決定做什麼,你應該等待(時間,一按鍵,一垂直同步信號,接收包,......?);然後試圖找到實際做你需要的東西。

CPU綁定的終端條件

對於這種情況,「正確」的解決方案會更喜歡:

do { 
    //do things which are cpu bound 
} while (running); 

在這種情況下,您可以(?應該)設置線程的優先級「非常低的優先級」,以便它不會干擾其他線程。當只有低優先級的線程在運行時,操作系統可以決定是否(或不)降低CPU功率/速度;但這不是你的決定(這是操作系統的決定,希望有一些用戶/管理電源管理控制)。

CPU綁定無端子條件

這種情況是非常罕見的(非常罕見,我想不出一個合理的情景,我甚至不能確定它在實踐中存在的話)。大多數情況下,如果你認爲你的情況是「沒有終端條件的CPU綁定」,那麼你可能是錯的,這可能是其他情況之一。

如果它實際上是「沒有終端條件的CPU綁定」,那麼它大部分與「CPU綁定終端條件」大致相同,除非沒有條件(您仍然需要低優先級的線程,只有低優先級的線程運行仍然不是你的決定)。

0

這在您的程序中很難做到。可以說,大多數有效的方法(至少我知道的)必須從外部強加。

在Linux上,一種可能性是cpulimit,它監視CPU使用情況,並在必要時定期暫停您的程序,以使其CPU使用率保持在您指定的級別。

Linux確實有類似setrlimit和cgroups的東西來控制進程的資源使用情況,但這兩種方法都不適用於您指定的場景(例如,限制CPU使用率,即使在系統空閒時也是如此)。傳統上能夠設置的限制一直在總共 CPU使用率,而不是使用速率,所以像setrlimitrctl這些東西有點類似,但不提供你想要的東西。

如果您使用的是Windows,則可以通過Windows作業對象執行此操作。您創建一個作業對象,然後使用JOBOBJECT_CPU_RATE_CONTROL_INFORMATIONSetInformationJobObject設置該作業對象的限制。

+0

即時通訊使用Windows 10.這不是我真正想要的答案,但我認爲你是對的,只有從'外部'纔有可能。我不認爲C++有辦法讓代碼運行速度變慢:)我會在下班後檢查幾個小時。 – noobcoder