2017-09-25 101 views
3

我有一個用調度策略SCHED_OTHER(0)和優先級爲120(默認優先級,頂部顯示PR爲20)的用戶空間進程。它在沒有任何系統調用或等待的情況下運行一個無限的while(1)循環。它與特定的CPU相關聯,比如說:1.Linux用戶空間和內核空間調度

在內核空間中,我有一個內核線程,它也使用默認調度參數策略:SCHED_NORMAL(0)和優先級120)。它進入睡眠狀態調用wait_event_interruptible()。一個irq線程以1ms的週期發生,喚醒內核線程。內核線程沒有綁定到任何CPU。

在內核線程與用戶空間進程在同一CPU上進行調度的情況下,雖然喚醒調用完成,但它不會喚醒。如果內核線程安排在其他免費的CPU上,它會被喚醒。只有當內核定時器中斷髮生並且ksoftirq線程被調度並且在退出時才調度內核線程。因此,內核線程不會按預期在1ms內喚醒一次。

我希望通過搶佔用戶空間進程來喚醒內核線程。這沒有發生。有人可以幫我解決這裏發生的事情嗎?

順便說一句,如果我將內核線程的調度更改爲SCHED_FIFO並給予RT優先級,它工作正常。

回答

0

我希望通過搶佔用戶空間進程來喚醒內核線程。有人可以幫我解決這裏發生的事情嗎?

首先,SCHED_OTHERSCHED_NORMAL的別名。其次,調度程序不區分內核線程和用戶空間線程(除非通過涉及的CGroups進行分層調度)。

允許睡眠者線程搶佔CPU綁定線程的唯一機會是,如果它在CPU上花費的時間更少(通過vruntime跟蹤),但1ms似乎太小以至於不會使此效果顯着計算CFS時間片的基礎是6ms(sysctl_sched_latency)。

您可能會嘗試使用cfstrace.stp腳本(需要SystemTap)來跟蹤調度程序狀態,並嘗試瞭解爲什麼會發生這種情況(它會轉儲CFS的內部狀態,包括vruntime值)。

我將內核線程的調度更改爲SCHED_FIFO並給予RT優先級,它工作正常。

是的,如果你需要 「實時」,你需要使用SCHED_FIFOSCHED_DEADLINE

相關問題