Linux線程技術的概念與技術發展

Linux線程技術的概念與技術發展

 
Linux是一個多用戶、多任務的操作系統。多用戶是指多個用戶可以在同一時間使用計算機系統;多任務是指Linux可以同時執行幾個任務,它可以在還未執行完一個任務時又執行另一項任務。在操作系統設計上,從進程(Process)演化出線程(Thread),最主要的目的就是更好地支持多處理器,並且減小(進程/線程)上下文切換的開銷。


進程和線程的關係


根據操作系統的定義,進程是系統資源管理的最小單位,線程是程序執行的最小單位。線程和進程十分相似,不同的只是線程比進程小。

首先,線程採用了多個線程可共享資源的設計思想。例如,它們的操作大部分都是在同一地址空間進行的。其次,從一個線程切換到另一線程所花費的代價比進程低。再次,進程本身的信息在內存中佔用的空間比線程大。

因此,線程更能允分地利用內存。線程可以看作是在進程內部執行的指定序列。線程和進程的最大區別在於線程完全共享相同的地址空間,運行在同一地址上。


Linux線程的定義


線程是在共享內存空間中併發的多道執行路徑,它們共享一個進程的資源,如文件描述和信號處理。在兩個普通進程(非線程)間進行切換時,內核準備從一個進程的上下文切換到另一個進程的上下文要花費很大的開銷。

這裏上下文切換的主要任務是保存老進程CPU狀態,並加載新進程的保存狀態,用新進程的內存映像替換老進程的內存映像。線程允許進程在幾個正在運行的任務之間進行切換,而不必執行前面提到的完整的上下文。

在Unix類系統中,曾經出現過一些不同線程標準,它們都支持可移植操作系統接口標準POSIX(Portable Operating System Interface Standard)。

POSIX標準由IEEE制定,並由國際標準化組織接受爲國際標準。POSIX 1003.1c是一個用於線程(在一個程序中當前被執行的代碼段)的標準,以前是P1993.4或POSIX.4的一部分,這個標準已經在1995年被IEEE通過,歸入ISO/IEC 9945-1:1996。

本文介紹線程主要是針對POSIX線程,即Pthread,因爲Linux對它的支持最好。相對進程而言,線程是一個更加接近於執行體的概念,它可以與進程中的其它線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。在串行程序基礎上引入線程和進程是爲了提高程序的併發度,從而提高程序運行效率和響應時間。

也可以將線程和輕量級進程(LWP)視爲等同,但其實在不同的系統/實現中有不同的解釋。LWP更恰當的解釋可能爲一個虛擬CPU或內核的線程,它可以幫助用戶態線程實現一些特殊的功能。Pthread是一種標準化模型,它用來把一個程序分成一組能夠同時執行的任務。

那麼在什麼場合會使用Pthread呢?

◆在返回前阻塞的I/O任務能夠使用一個線程處理,同時繼續執行其它處理任務。

◆在有一個或多個任務受不確定性事件影響,比如網絡通信的可獲得性影響的場合,能夠使用線程處理這些異步事件,同時繼續執行正常的處理。

◆如果某些程序功能比其它的功能更重要,可以使用線程以保證所有功能都出現,但那些時間密集型的功能具有更高的優先級。

以上三點可以歸納爲在檢查程序中潛在的並行性時,也就是說找出能夠同時執行任務時使用Pthread。上面介紹了Linux進程模型已經提供了執行多個進程的能力,可以進行並行或併發編程,但是,線程對多個任務的控制程度要更好,使用資源更少。因爲一個單一的資源,如全局變量,可以由多個線程共享,而且,在擁有多個處理器的系統上多線程應用會由用多個進程實現的應用執行。


Linux進程和線程技術發展


線程技術早在20世紀60年代就被提出,但真正應用多線程到操作系統中還是在20世紀80年代中期。現在,多線程技術已經被許多操作系統所支持,包括Windows NT/2000和Linux。

在1999年1月發佈的Linux 2.2內核中,進程是通過系統調用fork創建的,新的進程是原來進程的子進程。需要說明的是,在Linux 2.2.x中,不存在真正意義上的線程,Linux中常用的線程Pthread實際上是通過進程來模擬的。

也就是說,Linux中的線程也是通過fork創建的,是“輕”進程。Linux 2.2缺省只允許4096個進程/線程同時運行,而高端系統同時要服務上千的用戶,所以這顯然是一個問題。它一度是阻礙Linux進入企業級市場的一大因素。

2001年1月發佈的Linux 2.4內核消除了這個限制,並且允許在系統運行中動態調整進程數上限。因此,進程數現在只受制於物理內存的多少。在高端服務器上,即使只安裝了512MB內存,現在也能輕而易舉地同時支持1.6萬個進程。

在Linux 2.5內核中,已經做了很多改進線程性能的工作。在Linux 2.6中改進的線程模型仍然是由Ingo Molnar 來完成的。它基於一個1:1的線程模型(一個內核線程對應一個用戶線程),包括內核內在的對新NPTL(Native Posix Threading Library)的支持,這個新的NPTL是由Molnar和Ulrich Drepper合作開發的。

2003年12月發佈的Linux 2.6內核,對進程調度經過重新編寫,去掉了以前版本中效率不高的算法。進程標識號(PID)的數目也從3.2萬升到10億。內核內部的大改變之一就是Linux的線程框架被重寫,以使NPTL可以運行其上。

Linux的另一種可選線程模型是IBM開發的NGPT(Next Generation Posix Threads for Linux),它是基於GNU Pth(GNU Portable Threads)項目而實現的M:N模型(M個用戶態線程對應N個核心態線程)。

NPTL的設計目標可歸納爲以下幾點:POSIX兼容性、SMP結構的利用、低啓動開銷、低鏈接開銷(即不使用線程的程序不應當受線程庫的影響)、與LinuxThreads應用的二進制兼容性、軟硬件的可擴展能力、多體系結構支持、NUMA支持,以及與C++集成等。

對於運行負荷繁重的線程應用Pentium Pro及更先進的處理器而言,這些是主要的性能提升,也是企業級應用中很多高端系統一直以來所期待的。線程框架的改變包含Linux線程空間中的許多新的概念,包括線程組、線程各自的本地存儲區、POSIX風格信號,以及其它改變。改進後的多線程和內存管理技術有助於更好地運行大型多媒體應用軟件。
 

 Linux線程實現方法

目前線程有用戶態線程和核心態線程兩種方法實現。

1.用戶態線程

用戶態線程是一個精細的軟件工具,允許多線程的程序運行時不需要特定的內核支持。如果一個進程中的某一個線程調用了一個阻塞的系統調用,則該進程就會被阻塞,該進程中的其它所有線程也同時被阻塞。因此,Unix使用了異步I/O機制。這種機制主要的缺點在於,在一個進程中的多個線程調度中無法發揮多處理器的優勢(如上述的阻塞情況)。

用戶態線程優點如下:

◆某些線程操作的系統消耗大大減少。比如,對屬於同一個進程的線程之間進行調度切換時,不需要調用系統調用,因此將減少額外的消耗,一個進程往往可以啓動上千個線程。

◆用戶態線程的實現方式可以被定製或修改,以適應特殊應用的要求。它對於多媒體實時過程等尤其有用。另外,用戶態線程可以比核心態線程實現方法默認情況支持更多的線程。

2.核心態線程

核心態線程的實現方法允許不同進程中的線程按照同一相對優先調度方法進行調度,這樣有利於發揮多處理器的併發優勢。

目前,線程主要的實現方法是用戶態線程。有幾個研究項目已經實現了一些核心態線程的形式,其中比較著名的是MACH分佈式操作系統。

通過允許用戶代碼對內核線程調度的參與,該系統將用戶態和核心態兩種線程實現方法的優點結合了起來。通過提供這樣一個兩級調度機制,內核在保留了對處理器時間分配控制的同時,也使一個進程可以充分利用多處理器的優勢。


Linux對超線程技術支持


超線程技術(Hyperthreading Technology)是Intel公司的創新設計。HT技術就是利用特殊的硬件指令,把兩個邏輯內核模擬成兩個物理芯片,讓單個處理器都能使用線程級並行計算,從而兼容多線程操作系統和軟件,並提高處理器的性能。

操作系統或應用軟件的多線程可以同時運行於一個處理器上,兩個邏輯處理器共享一組處理器執行單元,並行完成加、乘、負載等操作。在同一時間裏,應用程序可以使用芯片的不同部分。雖然單線程芯片每秒鐘能夠處理成千上萬條指令,但是在任一時刻只能夠對一條指令進行操作。

而HT技術可以使芯片同時進行多線程處理,當在支持多處理器的Windows XP或Linux等操作系統之下運行時,同時運行多個不同的軟件程序可以獲得更高的運行效率。這兩種方式都可使計算機用戶獲得更優異的性能和更短的等待時間。 
Linux是第一個把超線程特性引入市場的操作系統,它在發佈2.4.17內核時,就開始包含對Intel P4處理器的超線程的支持(Linux 2.4內核最初的發佈版本中不支持),它包括以下增強技術:

◆128字節鎖對齊。

◆螺旋等待循環優化。

◆基於非執行的延遲循環 。

◆檢測支持超線程的處理器,並啓動邏輯處理器,如同該機器是SMP(多處理器構架)。

◆MTRR和微碼更新(Microcode Update)驅動程序中的串行化,因爲它們影響共享狀態。

◆在邏輯處理器調度發生之前,當系統空閒時對物理處理器上的調度進行優先級排序時,對調度程序進行優化。

◆偏移用戶堆棧以避免64K混疊。

以上簡單介紹了Linux線程的屬性、與進程關係、線程的實現方法,以及Linux對超線程技術支持等,希望對大家瞭解Linux線程技術有所幫助。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章