2012-05-12 119 views
6

我正在試驗SCHED_FIFO,我看到一些意外的行爲。我使用的服務器有12個禁用超線程的內核。所有可配置中斷已設置爲在CPU 0上運行。實時使用Linux實時調度優先級(SCHED_FIFO和SCHED_RR)?

我的程序啓動時使用pthreads庫創建一個線程,用於執行較低優先級的任務,而不更改CPU關聯設置爲核心0的調度策略。然後,父線程將其CPU使用sched_setscheduler()與pid零和優先級1,然後開始運行非阻塞循環,將核心3與其自己的調度策略關聯到SCHED_FIFO

程序本身運行良好。但是,如果我在程序運行期間嘗試再次登錄服務器,終端無響應,直到我停止執行程序。這就像調度器試圖在與實時過程相同的核心上運行其他進程。

  1. 我錯過了什麼?
  2. 調度程序是否仍會嘗試在運行實時進程的內核上運行其他進程?如果是這樣,有沒有辦法來防止這種情況?
  3. 將在父級中將調度策略設置爲sched_setscheduler()是否會更改以前創建的子級的行爲?

在此先感謝。

回答

5

sched_setscheduler設置進程的調度程序,而不是線程。請參閱:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html

如果你想設置調度程序的線程,則需要在創建之前使用pthread_attr_setschedpolicypthread_attr_setschedparam功能屬性對象的新線程。

我不知道Linux下如何符合的是履行這些要求,但你至少應該開始了通過確保您的代碼是正確的規範,那麼其調整需要...

+0

感謝回覆。你說得對,文檔說sched_setscheduler()爲進程設置調度策略,而不是線程。但是,在閱讀此回覆之後,我使用ps運行了一些測試,併爲線程正確設置了策略。這促使我運行一些進一步的測試。最明顯的問題之一是程序運行時登錄需要很長時間。它絕對看起來像新登錄的bash會話最初設置爲運行實時進程的cpu。 – digby280