2011-06-10 70 views
10

我有一個線程運行在Linux系統上,我需要像possbile一樣以精確的間隔執行。例如。每ms執行一次。Linux,需要精確的編程時序。調度程序喚醒程序

目前,這是通過創建與

timerfd_create(CLOCK_MONOTONIC, 0) 

定時器,然後使所期望的睡眠時間在一個結構與

timerfd_settime (fd, 0, &itval, NULL); 

一種阻塞讀呼叫所做的是在此計時器其停止執行線程執行並報告喚醒呼叫丟失。

問題是,在較高的頻率下,即使CPU使用率低於10%,系統也會開始丟失最後期限。我認爲這是由於調度程序沒有足夠頻繁地喚醒線程來檢查阻塞呼叫。有沒有一個命令可以用來告訴調度程序在可能的時間間隔內以特定間隔喚醒線程? 由於系統處理許多其他任務,忙等待是一個不好的選擇。

謝謝。

+1

你在實時調度器上運行這個嗎?根據我的經驗,只要你的內核沒有任何壞行爲的驅動程序,它應該足夠好,以便在毫秒量級的時間間隔內完成。 (當然,Linux不是專業的RTOS,並不能保證你永遠不會錯過最後期限。) – 2011-06-10 14:58:21

回答

5

您需要獲得RT linux *,然後增加要定期喚醒的進程的RT優先級。

除此之外,我沒有看到代碼中的問題,並且如果您的進程沒有被阻止,它應該可以正常工作。

(*)RT linux - 一個應用了一些實時調度補丁的操作系統。

+1

謝謝V Jo,我曾考慮過這個選項。此時此刻,我被鎖定到正常的香草版本,但我會進一步研究。另一方面,如果我運行一個RT Linux版本..我有什麼保證,調度程序將以準確的時間間隔喚醒此線程以檢查阻塞呼叫? - 必須有更安全的方式嗎? – 2011-06-10 14:00:39

+0

@K_scheduler取決於RT版本的好壞。你有硬性和軟性調度保證,這一切都取決於實施。我想在硬擔保錯誤是低於1毫秒(不確定壽) – 2011-06-10 14:07:04

+3

作爲一個例子,請檢查https://rt.wiki.kernel.org/index.php/CONFIG_PREEMPT_RT_Patch – stefaanv 2011-06-10 14:19:51

1

除非您在實際的「實時操作系統」上運行它,否則您將無法做到自己想做的事。

2

減少調度程序延遲的一種方法是使用實​​時調度程序(如SCHED_FIFO)運行您的進程。見sched_setscheduler

這通常會延長很多延遲,但仍然不能保證,爲了進一步減少延遲峯值,您需要遷移到linux的實時分支,或實時操作系統,如VxWorks,RTEMS或QNX。

1

如果這只是Linux for x86系統,我會選擇HPET定時器。我認爲所有現代PC都有這個硬件計時器,它非常非常準確。我允許你定義每毫秒會調用一次的回調函數,在這個回調函數中你可以進行計算(如果它們很簡單),或者使用一些同步對象(例如條件變量)來觸發其他線程的工作 這裏是一些示例使用此計時器http://blog.fpmurphy.com/2009/07/linux-hpet-support.html

+0

謝謝,但系統不能是x86特定的。 – 2011-06-11 12:28:42

0

除了其他建議(例如將調度類設置爲SCHED_FIFO)之外,還需要使用編譯的Linux內核具有足夠高的刻度以滿足截止日期。

例如,編譯爲CONFIG_HZ的100或250 Hz(每秒定時器中斷)的內核永遠不會對定時器事件的響應速度快於此速度。

您還必須設置定時器,只是一個比實際需要點點更快,因爲計時器被允許超越他們要求的時間,但從來沒有早到期,這會給你更好的結果。如果你需要1毫秒,那麼我建議要求999美元。

相關問題