日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux線程比較:LinuxThreads 和NPTL( 三 )


Ulrich Drepper 和 Ingo Molnar 是 Red Hat 參與 NPTL 設計的兩名員工 。他們的總體設計目標如下:
這個新線程庫應該兼容 POSIX 標準 。
;這個線程實現(xiàn)應該在具有很多處理器的系統(tǒng)上也能很好地工作 。
;為一小段任務創(chuàng)建新線程應該具有很低的啟動成本 。
;NPTL 線程庫應該與 LinuxThreads 是二進制兼容的 。注意,為此我們可以使用 LD_ASSUME_KERNEL,這會在本文稍后進行討論 。
;這個新線程庫應該可以利用 NUMA 支持的優(yōu)點 。NPTL 的優(yōu)點
與 LinuxThreads 相比,NPTL 具有很多優(yōu)點:
NPTL 沒有使用管理線程 。管理線程的一些需求,例如向作為進程一部分的所有線程發(fā)送終止信號,是并不需要的;因為內(nèi)核本身就可以實現(xiàn)這些功能 。內(nèi)核還會處理每個線程堆棧所使用的內(nèi)存的回收工作 。它甚至還通過在清除父線程之前進行等待,從而實現(xiàn)對所有線程結(jié)束的管理,這樣可以避免僵尸進程的問題 。
;由于 NPTL 沒有使用管理線程,因此其線程模型在 NUMA 和 SMP 系統(tǒng)上具有更好的可伸縮性和同步機制 。
;使用 NPTL 線程庫與新內(nèi)核實現(xiàn),就可以避免使用信號來對線程進行同步了 。為了這個目的,NPTL 引入了一種名為 futex 的新機制 。futex 在共享內(nèi)存區(qū)域上進行工作,因此可以在進程之間進行共享,這樣就可以提供進程間 POSIX 同步機制 。我們也可以在進程之間共享一個 futex 。這種行為使得進程間同步成為可能 。實際上,NPTL 包含了一個 PTHREAD_PROCESS_SHARED 宏,使得開發(fā)人員可以讓用戶級進程在不同進程的線程之間共享互斥鎖 。
;由于 NPTL 是 POSIX 兼容的,因此它對信號的處理是按照每進程的原則進行的;getpid() 會為所有的線程返回相同的進程 ID 。例如,如果發(fā)送了 SIGSTOP 信號,那么整個進程都會停止;使用 LinuxThreads,只有接收到這個信號的線程才會停止 。這樣可以在基于 NPTL 的應用程序上更好地利用調(diào)試器,例如 GDB 。
;由于在 NPTL 中所有線程都具有一個父進程,因此對父進程匯報的資源使用情況(例如 CPU 和內(nèi)存百分比)都是對整個進程進行統(tǒng)計的,而不是對一個線程進行統(tǒng)計的 。
;NPTL 線程庫所引入的一個實現(xiàn)特性是對 ABI(應用程序二進制接口)的支持 。這幫助實現(xiàn)了與 LinuxThreads 的向后兼容性 。這個特性是通過使用 LD_ASSUME_KERNEL 實現(xiàn)的,下面就來介紹這個特性 。LD_ASSUME_KERNEL 環(huán)境變量
正如上面介紹的一樣,ABI 的引入使得可以同時支持 NPTL 和 LinuxThreads 模型 ?;旧蟻碚f,這是通過 ld (一個動態(tài)鏈接器/加載器)來進行處理的,它會決定動態(tài)鏈接到哪個運行時線程庫上 。
舉例來說,下面是 WebSphere?Application Server 對這個變量所使用的一些通用設置;您可以根據(jù)自己的需要進行適當?shù)脑O置:
LD_ASSUME_KERNEL=2.4.19:這會覆蓋 NPTL 的實現(xiàn) 。這種實現(xiàn)通常都表示使用標準的 LinuxThreads 模型,并啟用浮動堆棧的特性 。LD_ASSUME_KERNEL=2.2.5:這會覆蓋 NPTL 的實現(xiàn) 。這種實現(xiàn)通常都表示使用 LinuxThreads 模型,同時使用固定堆棧大小 。我們可以使用下面的命令來設置這個變量:
export LD_ASSUME_KERNEL=2.4.19
注意,對于任何 LD_ASSUME_KERNEL 設置的支持都取決于目前所支持的線程庫的 ABI 版本 。例如,如果線程庫并不支持 2.2.5 版本的 ABI,那么用戶就不能將 LD_ASSUME_KERNEL 設置為 2.2.5 。通常,NPTL 需要 2.4.20,而 LinuxThreads 則需要 2.4.1 。
如果您正運行的是一個啟用了 NPTL 的 Linux 發(fā)行版,但是應用程序卻是基于 LinuxThreads 模型來設計的,那么所有這些設置通常都可以使用 。
GNU_LIBPTHREAD_VERSION 宏
大部分現(xiàn)代 Linux 發(fā)行版都預裝了 LinuxThreads 和 NPTL,因此它們提供了一種機制來在二者之間進行切換 。要查看您的系統(tǒng)上正在使用的是哪個線程庫,請運行下面的命令:

推薦閱讀