2011-09-23 48 views
2

有沒有一種方法可以在沒有調度程序的情況下使用pthreads,所以只有在線程明確產生或在mutex/cond上阻塞時纔會發生上下文切換?如果沒有,是否有辦法將調度開銷降至最低,以便強制上下文切換儘可能少發生?非搶先式線程?

這個問題涉及POSIX線程的Linux gcc/g ++實現。

+2

最小化上下文切換和進程/線程遷移通常是CPU調度程序的目標之一。你是否面臨特定的問題? – Mat

+0

具體問題是,在我正在開發的應用程序中,有一組線程顯式地產生,而執行任何其他上下文切換實際上是多餘的。 –

+2

您是否測量過無論發生什麼上下文切換都會對應用程序的吞吐量造成不利影響? – Mat

回答

4

您可以使用Pth(又名。GNU Portable Threads),一個非搶佔線程庫。使用--enable-pthread進行配置將爲pthreads創建插件替換。我只是在我的Mac上構建並測試了它,它對於簡單的pthreads程序來說工作正常。

自述:

Pth的是一個非常便攜POSIX/ANSI-C基爲Unix平臺 庫,其提供非搶佔基於優先級的調度多個 執行線程(又名`多線程」 )在事件驅動的 應用程序內部。所有線程都運行在服務器應用程序的相同地址空間中,但每個線程都有自己的程序計數器, 運行時棧,信號掩碼和errno變量。

線程調度本身是以合作的方式完成的,即線程由基於優先級和事件的非搶先調度器管理。其意圖是,通過這種方式,與搶先式調度相比,可以實現更好的可移植性和運行時性能。 事件工具允許線程等待,直到發生各種類型的事件,包括文件描述符上的未決I/O,異步 信號,已用定時器,消息端口上的未決I/O,線程和進程終止,甚至自定義回調函數。

此外,Pth爲POSIX.1c 線程(`Pthreads')提供了一個可選仿真API,可用於向後兼容現有的多線程應用程序。

0

如果你有一個進程在正常的用戶區運行,上下文切換自然會作爲系統操作的一部分發生 - 總有另一個進程需要CPU時間。您的線程之間的搶佔式上下文切換已經由操作系統進行了很好的優化,並且有時必然是必需的。

如果您真的碰巧遇到了過度的上下文切換問題,那麼您最好先調整Linux調度程序,這在這裏是無關緊要的。 pthread_setschedprio和pthread_setschedparam可以設置一些提示,但僅限於設置優先級,這些優先級的解釋是實現定義的,即直到Linux調度程序。