?

Linux線程實現技術研究

2012-08-15 00:54范小鷗
吉林建筑大學學報 2012年3期
關鍵詞:內核線程進程

范小鷗

(吉林建筑工程學院計算機科學與工程學院,長春 130118)

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

1 線程簡析

線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但其可與同屬一個進程的其他線程共享進程所擁有的全部資源.一個線程可創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行.由于線程之間的相互制約,致使線程在運行中呈現出間斷性.線程也有就緒、阻塞和運行3種基本狀態[3].

在操作系統設計上,從進程演化出線程,目的是更好地支持SMP以及減小(進/線程)上下文切換開銷.線程與進程相比主要有以下優點[4]:

(1)線程和進程相比,它是一種非?!肮潈€”的多任務操作方式.在linux系統下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種“昂貴”的多任務工作方式.而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間;

(2)線程間方便的通信機制.對不同進程,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便.線程則不然,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其他線程所用,這不僅快捷,而且方便.當然,數據的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改;有的子程序中聲明為static的數據;更有可能給多線程程序帶來災難性的打擊,這些正是編寫多線程程序時最需要注意的地方;

(3)提高應用程序響應.這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況;

(4)使多CPU系統更加有效.操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上;

(5)改善程序結構.一個既長又復雜的進程,可考慮分為多個線程,成為幾個獨立或半獨立的運行部分,有利于程序的可讀性和可維護性.

2 LINUX線程的思想及特點

2.1 線程描述數據結構

線程機制Linux Threads定義了一個struct_pthread_descr_struct數據結構來描述線程,并使用全局數組變量_pthread_handles來描述和引用進程所轄線程.在_pthread_handles中的前兩項,Linux Threads定義了兩個全局的系統線程:_pthread_initial_thread和_pthread_manager_thread,并用_pthread_main_thread表征_pthread_ manager_thread的父線程(初始為_pthread_initial_thread).struct_pthread_descr_struct是一個雙環鏈表結構,_ pthread_manager_thread所在的鏈表僅包括它一個元素,實際上,_pthread_manager_thread是一個特殊線程,Linux Threads僅使用了其中的errno,p_pid,p_priority等3個域.而_pthread_main_thread所在的鏈則將進程中所有用戶線程串在了一起.

2.2 管理線程

Linux Threads所采用的是線程一進程“一對一”模型(用一個核心進程(也許是輕量進程)對應一個線程,將線程調度等同于進程調度,交給核心完成),調度交給核心,而在用戶級實現一個包括信號處理在內的線程管理機制.“一對一”模型的好處之一是線程的調度由核心完成了,而其他諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的.在Linux Threads中,專門為每一個進程構造了一個管理線程,負責處理線程相關的管理工作.當進程第一次調用pthread_create()創建一個線程的時候,就會創建(clone())并啟動管理線程.

在一個進程空間內,管理線程與其他線程之間通過一對“管理管道(manager_pipe)”來通訊,該管道在創建管理線程之前創建,在成功啟動了管理線程之后.管理管道的讀端和寫端分別賦給兩個全局變量pthread_ manager_reader和_pthread_manager_request之后,每個用戶線程都通過pthread_manager_request向管理線程發請求,但管理線程本身并沒有直接使用_pthread_manager_reader,管道的讀端(manager_pipe[0])是作為_ clone()的參數之一傳給管理線程的,管理線程的工作主要是監聽管道讀端,并對從中取出的請求作出反應.創建管理線程的流程為:

初始化結束后,在_pthread_manager_thread中,記錄了輕量級進程號(輕量級線程(LWP)是一種由內核支持的用戶線程.它是基于內核線程的高級抽象,因此只有先支持內核線程,才能有LWP),以及核外分配和管理的線程id,id=2*PTHREAD_THREADS_MAX+1這個數值不會與任何常規用戶線程id沖突.管理線程作為pthread_create()的調用者線程的子線程運行,而pthread_create()所創建的那個用戶線程則是由管理線程來調用clone()創建,因此實際上是管理線程的子線程(此處子線程的概念應該當作子進程來理解)._ pthread_manager()就是管理線程的主循環所在,在進行一系列初始化工作后,進入while(1)循環.在循環中,線程以2s為timeout查詢(_poll())管理管道的讀端.在處理請求前,檢查其父線程(也就是創建manager的主線程)是否已退出,如果已退出就退出整個進程.如果有退出的子線程需要清理,則調用pthread_reap_children()清理.然后才是讀取管道中的請求,根據請求類型執行相應操作(switch-case).

2.3 線程棧

在Linux Threads中,管理線程的棧和用戶線程的棧是分離的,管理線程在進程堆中通過malloc()分配一個THREAD_MANAGER_STACK_SIZE字節的區域作為自己的運行棧.用戶線程的棧分配辦法隨著體系結構的不同而不同,主要根據兩個宏定義來區分,一個是NEED_SEPARATE_REGISTER_STACK,這個屬性僅在IA64平臺上使用;另一個是FLOATING_STACK宏,在i386等少數平臺上使用,此時用戶線程棧由系統決定具體位置并提供保護.與此同時,用戶還可以通過線程屬性結構來指定使用用戶自定義的棧.

2.4 線程id和進程id

每個Linux Threads線程都同時具有線程id和進程id,其中進程id就是內核所維護的進程號,而線程id則由LinuxThreads分配和維護._pthread_initial_thread的線程id為PTHREAD_THREADS_MAX,_pthread_ manager_thread的是:2*PTHREAD_THREADS_MAX+1,第一個用戶線程的線程id為PTHREAD_THREADS _MAX+2,此后第n個用戶線程的線程id遵循以下公式:

tid=n*PTHREAD_THREADS_MAX+n+1

這種分配方式保證了進程中所有的線程(包括已經退出)都不會有相同的線程id,而線程id的類型pthread_t定義為無符號長整型(unsigned long int),也保證了有理由的運行時間內線程id不會重復.從線程id查找線程數據結構是在pthread_handle()函數中完成的,實際上只是將線程號按PTHREAD_THREADS_ MAX取模,得到的就是該線程在pthread_handles中的索引.

3 結語

雖然linux中線程實現機制日趨成熟且廣泛應用,但仍存在不足.比如說,由于計算線程本地數據的方法是基于堆棧地址的位置,因此,對于這些數據的訪問速度都很慢.由于Linux Threads是圍繞一個管理線程來設計的,因此會導致較多上下文切換的開銷,這可能妨礙系統的可伸縮性能.由于線程的管理方式及每個線程都使用了一個不同的進程ID,因此Linux Threads和其他與Posix相關的線程庫并不兼容.總之,隨著linux內核的發展,其中所使用的線程機制也將不斷改進與完善.

[1]李建軍,陳鴻星,張紅新,張 威.Linux線程庫的實現機制[J].計算機與現代化,2005(4):98-100.

[2]鄭燕飛,余海燕.Linux的多線程機制探討與實踐[J].計算機應用,2001(1):83-85.

[3]金惠芳,陶利民,張基溫.Linux下多線程技術分析及應用[J].計算機系統應用,2003(9):30-31.

[4]周 麗,焦程波,蘭巨龍.LINUX系統下多線程與多進程性能分析[J].微計算機信息,2005(17):123-124.

猜你喜歡
內核線程進程
強化『高新』內核 打造農業『硅谷』
債券市場對外開放的進程與展望
基于嵌入式Linux內核的自恢復設計
Linux內核mmap保護機制研究
淺談linux多線程協作
微生物內核 生態型農資
線程池技術在B/S網絡管理軟件架構中的應用
社會進程中的新聞學探尋
我國高等教育改革進程與反思
基于上下文定界的Fork/Join并行性的并發程序可達性分析*
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合