2011-05-24 48 views
6

通過另一個問題的討論,參見Debugging strange error that depends on the selected scheduler,我遇到了我的線程的調度一些問題。我在Linux 2.6.x上,使用root權限運行,並使用pthreads在用C/C++編寫的時序關鍵應用程序中執行並行操作。瞭解Linux的調度時並行線程參與

我會盡力給予一些短期的,歸結,片段來解釋我的問題:

在主我在某個地方開始做:

struct sched_param sp; 
memset(&sp, 0, sizeof(sched_param)); 
sp.sched_priority = 99; 
sched_setscheduler(getpid(), SCHED_RR, &sp); 

我明白這是代碼將我的程序切換到使用RR-Scheduler,最大運行時間。優先。

當開始並行線程,我做的:

sched_param param; 
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
pthread_attr_getschedparam(&attr, &param); 
param.sched_priority = priority; 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
pthread_attr_setschedparam(&attr, &param); 

我明白這一點,是交換機,會是用「優先」給予優先開始RR-調度,線程的代碼。 如果主要不是切換調度程序,那麼這是否等同工作?

我不明白的是,如果有必要調用主代碼? (主要功能不會做任何事情,除了開始一切,然後阻止鍵盤輸入。) 我在哪裏可以找到如何工作的精確文檔。我認爲manpages在解釋背景方面做得不錯。

在此先感謝。

+0

另一個問題是,會發生什麼,如果單獨的多線程進程並行運行?處理器時間如何在這些處理器之間分配? – user761451 2011-05-24 11:04:11

回答

3

Linux的默認狀態下,使用實施ntpl (Native POSIX Thread Library)它參考一個線程作爲光weigth過程,所以調度器調度的線程與其他進程。

在FreeBSD上,你有「原始」 pthread實現,它允許你指定線程調度策略,但線程不被安排作爲默認進程(除非PTHREAD_SCOPE_SYSTEM參數設置)

所以,在你的榜樣,你的線程按照高優先級安排爲標準進程,因此它將與優先級相同的所有其他進程競爭,也是您的主進程。

如果你的時間關鍵的東西在你的線程中,避免給予你的主要過程高優先級,它會減少與你的實時東西競爭的過程。

我發現並行線程和NTPL here之間的比較。

+0

因此,在Linux系統上將主任務切換到RR調度器沒有任何意義,假設主任務沒有做任何有用的事情,並且僅切換線程就足夠了。甚至沒有關於運行多個多線程程序? – user761451 2011-05-24 13:23:18

+0

在NTPL實現中,是的,你的線程被認爲是系統中的任何其他進程,沒有優先級繼承;) – 2011-05-24 13:32:18

+1

'getconf GNU_LIBPTHREAD_VERSION'講述了線程實現。 – user761451 2011-05-24 13:51:11

0

的NPTL實現是1:1模型;用戶空間中的線程和內核空間中稱爲LWP的進程。 內核調度的LWP具有PTHREAD_SCOPE_SYSTEM的內容範圍。