重要的是要認識到POSIX線程(pthreads)是在一個標準中規定的,該標準對實現提出了一些最低要求,但也使它們有相當的餘地。
pthreads的概念是Thread Scheduling Contention Scope。 pthreads實現必須支持調度競爭範圍中的至少一個PTHREAD_SCOPE_SYSTEM
和PTHREAD_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_FIFO
或SCHED_RR
)之外,還可以通過在您需要的內存中使用mlockall(MCL_CURRENT | MCL_FUTURE);
和預先錯誤來鎖定進程內存來獲得更多確定性延遲。
來源
2015-10-07 06:15:50
caf