2015-10-06 34 views
0

我有一些Windows線程的經驗,我正在尋找pthreads。我有一個關於pthread調度的問題。在Windows上,您可以設置流程優先級,並在流程中設置流程優先級。 Windows調度程序始終執行具有最高進程優先級的進程,以及在循環進程中執行線程。C++:PThread調度與Windows線程

現在,您可以通過sched_setscheduler設置調度程序策略,併爲實時調制解調器設置優先級。一切,賴特到目前爲止?

問題:

1)如何並行線程安排在不同的進程?

2)實時線程在優先級較低的線程之前執行還是存在循環?

3)我怎樣才能獲得儘可能多的實時行爲(f.e.對於i/o -signals),我能得到多少?

回答

1

重要的是要認識到POSIX線程(pthreads)是在一個標準中規定的,該標準對實現提出了一些最低要求,但也使它們有相當的餘地。

pthreads的概念是Thread Scheduling Contention Scope。 pthreads實現必須支持調度競爭範圍中的至少一個PTHREAD_SCOPE_SYSTEMPTHREAD_SCOPE_PROCESS

如果一個線程按照PTHREAD_SCOPE_SYSTEM競爭範圍進行安排,它將與在系統上使用PTHREAD_SCOPE_SYSTEM的所有其他進程和線程進行同等競爭。

如果某個線程按照PTHREAD_SCOPE_PROCESS爭用範圍進行計劃,它只會在同一進程中直接與其他線程競爭使用PTHREAD_SCOPE_PROCESS。 POSIX並未指定那些線程組如何針對其他進程/線程進行調度,但通常在同一進程中使用PTHREAD_SCOPE_PROCESS的每個線程組都被視爲一個單一的PTHREAD_SCOPE_SYSTEM實體。

實現通常只支持其中之一 - 例如,Linux僅支持調度競爭範圍PTHREAD_SCOPE_SYSTEM

在pthreads下,可運行的優先級較高的線程總是優先於較低優先級的線程執行。使用相同優先級的線程,如果一個線程正在使用調度策略,那麼它將繼續運行,直到它阻止或產生;如果它正在使用調度策略,那麼在使用其時間量之後它也將被預先佔用。

我不相信POSIX對實時性能施加任何限制 - 畢竟實時延遲受底層硬件的強烈影響。除了設置實時調度策略(SCHED_FIFOSCHED_RR)之外,還可以通過在您需要的內存中使用mlockall(MCL_CURRENT | MCL_FUTURE);和預先錯誤來鎖定進程內存來獲得更多確定性延遲。