嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!

所有學嵌入式Linux系統的看過來了,以下內容是每一位想學習Linux嵌入式系統想要了解的內容,真的很想要分享給大家! 本文分享的內容主要如下幾個方面:(

很難找到的精品資料,建議先轉發到主頁以後再看

51 多線程理論

52 線程操作

53 進程和線程

線程的創建

使用互斥體保護 job-queue 隊列


5.1.1 多線程

多線程是指操作系統支持在一個進程中執行多個線程的能力。每個進程中只有一個線程在執行的傳統方法(還沒有明確線程的概念)稱為單線程方法(single-threaded approach)。

圖 5-1 左半部分的兩排都是單線程方法。MS-DOS 是一個支持單用戶進程和單線程的操作系統例子。其他操作系統,如各種版本的 UNIX,支持多用戶進程,但只支持每個進程一個線程。圖 3-17 的右半部分描述了多線程方法。Java 運行環境是單進程多線程的一個例子。本節所關心的是使用多進程,且每個進程支持多線程的情況 Windows、Solaris、Mach 和 0S/2 等都採用了這種方法。


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!

本節給出一個對多線程的通用描述,本章後面的部分將討論Windows、Solaris 和 Linux 中的相關細節。

在多線程環境中,進程被定義成資源分配的單位和保護的單位。與進程相關聯的有:

存放進程映像的虛擬地址空間

受保護的訪問處理器、其他進程(用於進程間通信)、文件和 I/0 資源(設備和通道)。

一個進程中,可能有一個或多個線程,每個線程有:

線程執行狀態(運行、就緒等)。

在未運行時保存的線程上下文;可以把線程看成是進程中一個獨立的程序計數器在操作。

一個執行棧

用於每個線程局部變量的靜態存儲空間

對所屬進程的內存和資源的訪問,並與該進程中的其他線程共享這些資源。

圖 5-2 從進程管理的角度說明了線程和進程的區別。在單線程進程模型中(也就是說,並沒有清楚明確的線程概念),進程的表示包括它的進程控制塊和用戶地址空間,以及在進程執行中管理調用/返回行為的用戶棧和內核棧。當進程正在運行時,處理器寄存器將被該進程所控制;當進程不運行時,這些處理器寄存器中的內容將被保存。在多線程環境中,仍然有與進程相關聯的進程控制塊和用戶地址空間,但是每個線程都有一個獨立的棧,還有獨立的控制塊用於包含寄存器值、優先級和其他與線程相關的狀態信息。


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


因此,進程中的所有線程共享該進程的狀態和資源,它們駐留在同一塊地址空間中,

並且可以訪問到相同的數據。當一個線程改變了存儲器中的一個數據項時,其他線程在

訪問這一數據項時能夠看到變化後的結果。如果一個線程為讀操作打開一個文件,那麼

同一個進程中的其他線程也能夠從這個文件中讀取數據。從性能比較可以看出線程的重

要優點如下:

在一個已有進程中創建一個新線程比創建一個全新進程所需的時間要少許多。Mach開發者的研究表明,其線程創建要比在 UNIX 中進程創建快 l0 倍。

終止一個線程比終止一個進程花費的時間少

同一進程內線程問切換比進程間切換花費的時間少

線程提高了不同的執行程序間通信的效率。在大多數操作系統中,獨立進程問的通信需要內核的介入,以提供保護和通信所需要的機制。但是,由於在同一個進程中的線程共享內存和文件,它們無需調用內核就可以互相通信。

因此,如果應用程序或函數應該被實現為一組相關聯的執行單位時,那麼用一組線程比用一組獨立的進程更有效。

使用線程的一個應用程序例子是文件服務器。當每個新文件請求到達時,則為文件管理程序產生一個新線程。由於服務器將會處理到很多請求,所以將會在短期內創建和銷燬許多線程。如果服務器運行在多處理器機器上,那麼在同一個進程中的多個線程就可以同時在不同的處理器上執行。此外,由於文件服務程序中的進程或線程必須共享文件數據,因此需要協調它們的活動,此時使用線程和共享存儲空間比使用進程和信息傳遞要快。

在單處理器中,對於簡化在邏輯上完成不同功能的程序,構造線程有時也是很有用的。

[LETW88]給出了在單用戶多處理系統中使用線程的四個例子-:

前臺和後臺操作:例如,在電子表格程序中,一個線程可以顯示菜單並讀取用戶輸入,而另一個線程執行用戶命令並更新電子表格。這種方案允許程序在前一條命令完成前提示輸入下一條命令,因而常常會使用戶感覺到應用程序的響應速度有所提高。

異步處理:程序中的異步部分可以用線程實現。例如,為避免掉電帶來的損失,往往把文字處理器設計成每隔一分鐘將隨機存取存儲器(RAM)緩衝區中的數據寫入磁盤一次。可以創建一個線程,其任務是週期性地進行備份,並且直接由操作系統調度該線程;這樣,在主程序中就不需要特別的代碼來提供時間檢查或者協調輸入和輸出。

加速執行:一個多線程進程在計算這批數據的同時可以從設備讀取下一批數據。在多處理器系統中;同一個進程中的多個線程可以同時執行。這樣,即便一個線程在讀取數據時由於 I/O 操作被阻塞,另外一個線程仍然可以繼續運行。

模塊化程序結構:涉及到多種活動、多種資源和多個輸入輸出目標的程序更易於用線程設計和實現。

在支持線程的操作系統中,調度和分派是在線程基礎上完成的;因此大多數與執行相關的信息可以保存在線程級的數據結構中。但是,有些活動影響著進程中的所有線程,操作系統必須在進程一級對它們進行管理。掛起涉及到把一個進程的地址空間換出主存併為其他進程的地址空間騰出位置。因為一個進程中的所有線程共享同一個地址空間,所以它們都會同時被掛起。類似地,進程的終止會導致進程中所有線程的終止。

5.1.2 線程功能特性

和進程一樣,線程具有執行狀態,且可以與另一個線程同步。下面依次考慮線程兩方面的功能特性。

1 、線程狀態

和進程一樣,線程的主要狀態有運行態、就緒態和阻塞態。一般來說,掛起態對線程沒有什麼意義,這是由於此類狀態是一個進程級的概念。特別地,如果一個進程被換出,由於它的所有線程都共享該進程的地址空間,因此它們必須都被換出。

與線程狀態變化相關的有四種基本操作[ANDE97]:

派生:在典型情況下,當產生一個新進程時,同時也為該進程產生了一個線程。隨後,進程中的線程可以在同一個進程中產生另一個線程,併為新線程提供指令指針和參數;新線程擁有自己的寄存器上下文和棧空間,被放置在就緒隊列中。

阻塞 :當線程需要等待一個事件時,它將被阻塞(保存它的用戶寄存器、程序計數器和棧指針),此時處理器轉而執行另一個處於同一進程中或不同進程中的就緒線程。

解除阻塞:當阻塞一個線程的事件發生時,該線程被轉移到就緒隊列中。

結束:當一個線程完成時,其寄存器上下文和棧都被釋放。

一個重要的問題是,一個線程的阻塞是否會導致整個進程的阻塞。換言之,如果進程中的一個線程被阻塞,這是否會阻止進程中其他線程的運行,即使這些線程處於就緒狀態? 顯然,如果一個被阻塞的線程阻塞了整個進程,就會喪失線程的某些靈活性和能力。

隨後會在討論用戶級線程和內核級線程中再回到這個問題,但現在先考慮一下線程不會阻塞整個進程的情況下的性能獲益。圖 5-3(基於[KLEl96]中的圖)顯示了一個執行了兩個遠程過程調用(RPC)的程序,這兩個調用分別涉及兩個不同的主機,用於獲得一個組合的結果。

在單線程程序中,其結果是按順序獲得的,因此程序必須依次等待來自每個服務器的響應。

重寫這個程序,為每個 RPC 使用一個獨立的線程,可以使速度得到實質性的提高。注意,如果這個程序在單處理器上運行,那麼必須順序地產生請求並且順序地處理結果,但是程序可以同時等待兩個回答。

在單處理器中,多道程序設計使得在多個進程中的多個線程可以交替執行。在圖 5-4 所示的例子中,兩個進程中的三個線程在處理器中交替執行。在當前正在運行的線程阻塞時或者當時間片用完時,執行傳遞到另一個線程。

2、線程同步

嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


嵌入式Linux系統編程——你真的懂線程嗎,linux大神進修課!


分享到:


相關文章: