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

Linux線程比較:LinuxThreads 和NPTL

LinuxThreads 項(xiàng)目最初將多線程的概念引入了 Linux?,但是 LinuxThreads 并不遵守 POSIX 線程標(biāo)準(zhǔn) 。盡管更新的 Native POSIX Thread Library(NPTL)庫填補(bǔ)了一些空白,但是這仍然存在一些問題 。本文為那些需要將自己的應(yīng)用程序從 LinuxThreads 移植到 NPTL 上或者只是希望理解有何區(qū)別的開發(fā)人員介紹這兩種 Linux 線程模型之間的區(qū)別 。
當(dāng) Linux 最初開發(fā)時(shí),在內(nèi)核中并不能真正支持線程 。但是它的確可以通過 clone() 系統(tǒng)調(diào)用將進(jìn)程作為可調(diào)度的實(shí)體 。這個(gè)調(diào)用創(chuàng)建了調(diào)用進(jìn)程(calling process)的一個(gè)拷貝,這個(gè)拷貝與調(diào)用進(jìn)程共享相同的地址空間 。LinuxThreads 項(xiàng)目使用這個(gè)調(diào)用來完全在用戶空間模擬對線程的支持 。不幸的是,這種方法有一些缺點(diǎn),尤其是在信號(hào)處理、調(diào)度和進(jìn)程間同步原語方面都存在問題 。另外,這個(gè)線程模型也不符合 POSIX 的要求 。
要改進(jìn) LinuxThreads,非常明顯我們需要內(nèi)核的支持,并且需要重寫線程庫 。有兩個(gè)相互競爭的項(xiàng)目開始來滿足這些要求 。一個(gè)包括 IBM 的開發(fā)人員的團(tuán)隊(duì)開展了 NGPT(Next-Generation POSIX Threads)項(xiàng)目 。同時(shí),Red Hat 的一些開發(fā)人員開展了 NPTL 項(xiàng)目 。NGPT 在 2003 年中期被放棄了,把這個(gè)領(lǐng)域完全留給了 NPTL 。
盡管從 LinuxThreads 到 NPTL 看起來似乎是一個(gè)必然的過程,但是如果您正在為一個(gè)歷史悠久的 Linux 發(fā)行版維護(hù)一些應(yīng)用程序,并且計(jì)劃很快就要進(jìn)行升級(jí),那么如何遷移到 NPTL 上就會(huì)變成整個(gè)移植過程中重要的一個(gè)部分 。另外,我們可能會(huì)希望了解二者之間的區(qū)別,這樣就可以對自己的應(yīng)用程序進(jìn)行設(shè)計(jì),使其能夠更好地利用這兩種技術(shù) 。
本文詳細(xì)介紹了這些線程模型分別是在哪些發(fā)行版上實(shí)現(xiàn)的 。
LinuxThreads 設(shè)計(jì)細(xì)節(jié)
線程 將應(yīng)用程序劃分成一個(gè)或多個(gè)同時(shí)運(yùn)行的任務(wù) 。線程與傳統(tǒng)的多任務(wù)進(jìn)程 之間的區(qū)別在于:線程共享的是單個(gè)進(jìn)程的狀態(tài)信息,并會(huì)直接共享內(nèi)存和其他資源 。同一個(gè)進(jìn)程中線程之間的上下文切換通常要比進(jìn)程之間的上下文切換速度更快 。因此,多線程程序的優(yōu)點(diǎn)就是它可以比多進(jìn)程應(yīng)用程序的執(zhí)行速度更快 。另外,使用線程我們可以實(shí)現(xiàn)并行處理 。這些相對于基于進(jìn)程的方法所具有的優(yōu)點(diǎn)推動(dòng)了 LinuxThreads 的實(shí)現(xiàn) 。
LinuxThreads 最初的設(shè)計(jì)相信相關(guān)進(jìn)程之間的上下文切換速度很快,因此每個(gè)內(nèi)核線程足以處理很多相關(guān)的用戶級(jí)線程 。這就導(dǎo)致了一對一 線程模型的革命 。
讓我們來回顧一下 LinuxThreads 設(shè)計(jì)細(xì)節(jié)的一些基本理念:
LinuxThreads 非常出名的一個(gè)特性就是管理線程(manager thread) 。管理線程可以滿足以下要求:
系統(tǒng)必須能夠響應(yīng)終止信號(hào)并殺死整個(gè)進(jìn)程 。以堆棧形式使用的內(nèi)存回收必須在線程完成之后進(jìn)行 。因此,線程無法自行完成這個(gè)過程 。終止線程必須進(jìn)行等待,這樣它們才不會(huì)進(jìn)入僵尸狀態(tài) 。線程本地?cái)?shù)據(jù)的回收需要對所有線程進(jìn)行遍歷;這必須由管理線程來進(jìn)行 。如果主線程需要調(diào)用 pthread_exit(),那么這個(gè)線程就無法結(jié)束 。主線程要進(jìn)入睡眠狀態(tài),而管理線程的工作就是在所有線程都被殺死之后來喚醒這個(gè)主線程 。
;為了維護(hù)線程本地?cái)?shù)據(jù)和內(nèi)存,LinuxThreads 使用了進(jìn)程地址空間的高位內(nèi)存(就在堆棧地址之下) 。
;原語的同步是使用信號(hào) 來實(shí)現(xiàn)的 。例如,線程會(huì)一直阻塞,直到被信號(hào)喚醒為止 。
;在克隆系統(tǒng)的最初設(shè)計(jì)之下,LinuxThreads 將每個(gè)線程都是作為一個(gè)具有惟一進(jìn)程 ID 的進(jìn)程實(shí)現(xiàn)的 。
;終止信號(hào)可以殺死所有的線程 。LinuxThreads 接收到終止信號(hào)之后,管理線程就會(huì)使用相同的信號(hào)殺死所有其他線程(進(jìn)程) 。

推薦閱讀