2015-05-21 28 views
1

我想在一個帶有嵌入式Linux系統的單獨核心上運行一個低延遲任務(對於音頻,ALSA/JACK)。刪除調度程序和其他中斷可能是這裏的關鍵。嵌入式Linux在單核上的低延遲處理

到目前爲止,我發現了幾種方法,例如, cpusets和2009年的離線調度程序(很不幸不支持用戶空間任務)。

有沒有更新/更方便的方法來實現這一目標?

Offline scheduler

+0

看看'renice'&'ionice'命令 –

回答

1

你正在尋找的題目就叫"CPU affinity"。 CPU關聯有兩個主要方面:進程的關聯性和中斷的關聯性。

在我(誠然限於)知識:

  • 中的處理,使用taskset命令分配給處理器。 (親和性由子進程繼承。)

  • 可以使用/proc/irq/<n>/smp_affinity來控制Linux上CPU分配的中斷。要驗證分配的有效性,請檢查/proc/interrupts以查看哪些CPU用於哪些中斷。 See here.

你的具體情況,要保留一個CPU(又名核)爲您的關鍵應用,例如CPU0。這意味着所有的進程和中斷應該被分配給除CPU0之外的所有進程和中斷,使用清除了比特0(== CPU0)的親和掩碼,例如, 0xfffffffe。而您的關鍵應用程序將具有0x1的親和性掩碼,這意味着它只能在CPU0上運行。

此外,您可能需要在應用程序中使用sched_setscheduler系統調用來將調度設置爲其中一個實時策略。這可能會改善您的應用程序的延遲(但也可能會變得更糟)。

請注意,調整CPU親和力不是一項簡單的努力,而且明確的解決方案很少見。您需要測試和試驗以確保配置能夠維持您所需的性能。例如,您的應用程序很可能會與其他進程進行通信。如果通信是同步的,而其他進程響應緩慢(因爲它們的CPU資源有限),這反過來會對關鍵應用程序的性能產生負面影響。這同樣適用於聲卡的中斷。

希望有所幫助。

+0

我不知道你可以很容易地處理中斷,太好了!是否仍然有可能異步使用函數鉤來實現其他內核上的音頻過濾器? – RootRaven

+0

親和性由OS調度程序實現,因此它需要一些OS對象,通常是一個進程。 Linux顯然也允許以編程方式改變線程的親和力 - 請參閱「man pthread_setaffinity_np」(儘管軟件開發人員通過交易,我必須在系統管理員能力中處理親和力)。 – Dummy00001