歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 本地POSIX線程庫(NPTL)

本地POSIX線程庫(NPTL)

日期:2017/3/1 9:52:10   编辑:Linux編程

在Linux操作系統中,本地POSIX線程庫(NPTL)是一種軟件特性,它可讓Linux的內核,高效地運行那些使用POSIX風格的線程所編寫的程序。

測試中,NPTL在一個IA-32處理器上,成功地同時跑了10萬個線程,啟動這些線程只用了不到2秒。比較起來,在不支持NPTL的內核上,這個測試花費了大約15分鐘。

以前(也就是在2.6內核以前),Linux把進程當作其調度實體,內核並不真正支持線程。可是,它提供了一個clone()系統調用——創建一個調用進程的拷貝,這個拷貝與調用者共享地址空間。LinuxThreads項目就是利用這個系統調用,完全在用戶級模擬了線程;不幸的是,它與真正的POSIX標准在一致性上面存在大量的問題,在信號處理,任務調度,以及進程間同步原語方面尤為突出。

要改進LinuxThreads,顯然需要一些內核方面的支持,並重寫線程庫。針對於這一需求的兩個競爭項目啟動了——NGPT,或稱下一代POSIX線程,由包括來自IBM的開發者在內的一個團隊進行開發;NPTL是由Red Hat的開發者來開發的,兩者同時進行。但是,NGPT已在2003年年中就被放棄了。

NPTL的使用與LinuxThreads極為相似,這是由於,其主要的抽象依然被內核認為是一個進程,而且新線程的創建,使用的還是clone()系統調用(來自NPTL的調用)。可是,NPTL需要專有的內核支持來實現在競爭情況下可使線程睡眠或被再喚醒的同步原語。用在這兒的原語,被認為是一個Futex(不要與mutex相混淆)。

NPTL號稱是1x1的線程庫,這是由於用戶所創建的線程(通過pthread_create()庫函數)與內核的調度實體(在Linux內是進程)1-1對應。這是最簡單的合理線程實現了。一個備選方案是m x n的,就是說用戶級線程要多於調度實體,如果以這種方式實現的話,由線程庫負責在可用的調度實體上調度用戶線程。這會使得線程上下文切換非常的快,因為它避免了系統調用,但是它也增加了復雜性和優先級反轉的可能性。

NPTL的第一版發布在Red Hat 9.0中。老式的POSIX線程庫眾所周知的問題是有些時候線程會拒絕向系統讓出控制權,因為這種事情發生時,它得不到讓出控制權的機會。還有些事情Windows會做得更好。Red Hat在Java的站點上的一篇關於Java在Red Hat 9上的文章中聲稱NPTL已經解決了這些問題。

自從Red Hat Enterprise Linux第3版開始,NPTL就已經成為它的一部分,現在它已經完全的集成到Glibc中了。

Copyright © Linux教程網 All Rights Reserved