2017-09-30 71 views
0

從我在我的搜索過程中瞭解到的情況來看,FIFO任務需要阻塞或自願產生,以釋放CPU並允許其他人在該CPU上運行。我無法確定的是3種特定情況:Linux調度策略:SCHED_FIFO對SCHED_RR

1)prio 99的(可運行)FIFO任務是否會用prio 90搶佔(運行)FIFO任務?

我相信答案是NO,請評論

2)會和PRIO 50(可運行)FIFO任務搶佔與PRIO 99(運行)RR任務(前的RR時間片結束)?

我相信答案是YES,請評論

3)會和PRIO 99(可運行)RR任務不斷搶佔PRIO 50的(運行)FIFO的任務嗎?

我相信答案是NO,請評論

假設一個最新的Linux內核的RedHat。

謝謝

亞歷

+0

爲什麼不嘗試這些看? –

+0

嗨,相信我,我想到了這一點,不僅僅是現在,而是對於過去的各種問題。有時候,你需要非常清楚你正在測試的內容,才能正確地進行測試,並提取正確的結論。我正在尋找回應這個理論的答案,並且基於經驗和對這個具體問題的知識。 – Sagi2313

回答

0

在linux下SCHED_FIFO和SCHED_RR分享其中至少從0到99(99爲最高),在用戶空間實時priorites。從現在開始,我假設你正在談論這些優先級(rt_priority)而不是內部prio字段。鑑於此信息在這裏您的情況應該工作如何:

  1. 因爲99是高會搶佔任務90的FIFO任務,除非搶佔由任務禁用。
  2. 沒有,因爲優先權50是少不應該是它能夠搶佔優先級的任務99
  3. 是再次的優先級99是高所以應該,如果你搶佔優先級的任務50

最後感到困惑PRIO之間,在這裏rt_prio是它們之間的關係,它可以在功能上可以找到normal_prio

/* 
* Calculate the expected normal priority: i.e. priority 
* without taking RT-inheritance into account. Might be 
* boosted by interactivity modifiers. Changes upon fork, 
* setprio syscalls, and whenever the interactivity 
* estimator recalculates. 
*/ 
static inline int normal_prio(struct task_struct *p) 
{ 
    int prio; 

    if (task_has_dl_policy(p)) 
      prio = MAX_DL_PRIO-1; 
    else if (task_has_rt_policy(p)) 
      prio = MAX_RT_PRIO-1 - p->rt_priority; // This is for FIFO/RR Tasks 
    else 
      prio = __normal_prio(p); 
    return prio; 
}