2016-01-20 59 views
4

環境 - 與Linux內核2.6.18 要求嵌入裝置 - 3個線程(從一個過程創建的,可以說,P1創建T1,T2,T3)Linux的 - 當較高優先級任務是較低忙優先級的線程未被調度

T1在linux優先級99(最高),T2在linux優先級50(中間),T3在linux優先級2(最低)。沒有明確的值設置爲任何線程。

T1和T3每秒增加一次變量。 T1每5秒打印一次這兩個變量。這順利。 [有問題的地方]當T2進入一個無限循環「for(;;);」時,T1的計數正常增加,但T3的計數並沒有增加。 含義T3從來沒有時間在CPU中運行。

所有這一次,我在想CFS的Linux保證所有的優先事項將得到其適當的份額(基於權重)。但是這證明了任何線程都會在沒有睡眠的情況下執行CPU,從而阻止所有其他較低優先級的線程運行。

Plz答案如果有人知道爲什麼CFS調度程序以這種方式行爲,並且如果有一種方法可以糾正這種情況?

+0

您正在使用什麼SCHED策略? – Maquefel

+0

我們是提供商提供的預編譯內核,大部分終端命令都不適合我們。即使我在進程樹下看不到/ proc//sched。 – BaskarA

+0

你確定你的代碼不是問題的根源嗎?同時要求您的提供商提供來源和配置。 – Maquefel

回答

1

實時調度類總是優先於任何較低的調度類。也就是說,一個線程SCHED_RR,如果它已準備好運行,將總是預先佔用線程SCHED_OTHER。這些類只能用於執行(通常很短),滿足其他線程需求所需的緊急任務,硬件需求(如從串行端口或網卡緩衝區讀取)或出於安全目的(如編寫審計或日誌條目,或提交數據庫事務)。例如,用戶模式設備驅動程序可能會使用這些優先級,因爲它們必須完成其工作才能使其他線程運行。

同樣在SCHED_RR之內,更高優先級的進程將始終運行如果它已準備好就運行,這說明了您所看到的內容。

的關鍵是這樣的:該設置是將CPU約優先訪問它是不是共享訪問CPU。永遠的優先獲勝。這就是優先的意思。

(爲了防止病理情況下,實時進程默認情況下,僅限於使用的CPU時間的95%,這不應該在一個健康的系統發生。)

如果您只是想你的線程有更大分享一般資源的,則應使用SCHED_OTHER並使用nice(2)setpriority(2)將您的nice(2)值設置爲負數。

nice(2)約爲共享CPU,因爲它是很好的分享。

+0

根據這篇文章[https://www.linkedin.com/pulse/20140629145049-21586023-understanding-linux-scheduling,甚至SCHED_RR將有一個限制,之後SCHED_OTHER被允許運行。這似乎將重新開始你的「優先獲勝,永遠」的句子。你能幫忙解釋一下嗎?我是Linux調度中的新手。 – Ryuu

+0

@ryuu看來你是對的。儘管這個問題並沒有真正改變答案。 – Ben

相關問題