1. 程式人生 > >多程序與多執行緒(四)--NPTL(轉)

多程序與多執行緒(四)--NPTL(轉)

Native POSIX Thread LibraryNPTL)是一個能夠使使用POSIX Threads編寫的程式在Linux核心上更有效地執行的軟體。

測試表明,NPTL能夠成功地在IA-32平臺上在兩秒種內生成100,000個執行緒;相應的沒有NPTL的核心將耗費15分鐘左右。

歷史

Linux核心2.6出現之前程序是(最小)可排程的物件,當時的Linux不真正支援執行緒。但是Linux核心有一個系統呼叫指令clone(),這個指令產生一個呼叫呼叫的程序的復件,而且這個復件與原程序使用同一地址空間。LinuxThreads計劃使用這個系統呼叫來提供一個核心級的執行緒支援。但是這個解決方法與真正的POSIX

標準有一些不相容的地方,尤其是在訊號處理、程序排程和程序間同步原語方面。

要提高LinuxThreads的效應很明顯需要提供核心支援以及必須重寫執行緒函式庫。為了解決這個問題出現了兩個互相競爭的專案:一個IBM的組的專案叫做NGPTNext Generation POSIX Threads,下一代POSIX執行緒),另一個組是由Red Hat程式設計師組成的。2003年中NGPT被放棄,幾乎與此同時NPTL公佈了。

NPTL首次是隨Red Hat Linux 9發表的。此前老式的Linux POSIX執行緒偶爾會發生系統無法產生執行緒的毛病,這個毛病的原因是因為在新執行緒開始的時候系統沒有藉機先佔。當時的Windows

系統對這個問題的解決比較好。Red Hat在關於Red Hat Linux 9上的Java的網頁上發表了一篇文章稱NPTL解決了這個問題。

從第3版開始NPTLRed Hat Enterprise Linux的一部分,從Linux核心2.6開始它被納入核心。目前它完全被結合入GNU C 函式庫。

設計

NPTL的解決方法與LinuxThreads類似,核心看到的首要抽象依然是一個程序,新執行緒是通過clone()系統呼叫產生的。但是NPTL需要特殊的核心支援來解決同步的原始型別之間互相競爭的狀況。在這種情況下執行緒必須能夠入眠和再復甦。用來完成這個任務的原始型別叫做futex

NPTL是一個所謂的1×1執行緒函式庫。使用者產生的執行緒與核心能夠分配的物件之間的聯絡是一對一的。這是所有執行緒程式中最簡單的。