Linux-Kernel

是否建議在創建執行緒期間在 Linux FIFO 中使用 param.sched_priority?

  • August 18, 2018

在我的嵌入式設備中,我使用我們使用的協議吸收了奇怪的行為,有時使用 FIFO 通過串列設備發送數據需要一段時間。

我懷疑 Linux 不是實時作業系統,為什麼他們有這樣的實時模擬功能,例如pthread_setschedparam?並且在隊列中具有這樣的優先級會導致另一個程序餓死,因為它需要花費大量時間來檢測從設備。

我只想知道是否建議使用 param.sched_priority = 40; 在 Linux 中?我試圖調整這個參數,但這個問題很難在現場重現。

這是程式碼

if (1)
{
   int policy;
   int r;
   struct sched_param param;

   policy = SCHED_FIFO;
   param.sched_priority = 40;
   r = pthread_setschedparam(cc_state->ser_thread, policy, &param);
   printf("%s: pthread_setschedparam %d", __func__, r);
}

Linux實時不是仿真,有系統呼叫影響調度。見man sched(7)。從您的問題中不清楚您要做什麼以及您的確切問題是什麼。的值sched_priority僅與其他執行緒的優先級相關。例如,如果只有一個執行緒的優先級 > 0,那麼優先級是 1 還是 40 都沒有關係;較高的值不會給執行緒帶來額外的“提升”。您必須確定執行緒所需的相對優先級並相應地為其分配優先級值。

請注意,沒有與SCHED_FIFO執行緒相關的時間片。執行緒一直執行直到發生以下情況之一:SCHED_FIFO執行緒因為等待 I/O 而被阻塞,更高優先級的執行緒準備好執行,或者執行緒自願讓出處理器。如果您有多個具有相同優先級的執行緒,則必須考慮到這一點,否則一個執行緒可能會佔用其他執行緒的 CPU。在多處理器機器上,多個執行緒當然可以在各自的 CPU 上同時執行。

引用自:https://unix.stackexchange.com/questions/463124