執行緒概念
執行緒是作業系統能夠排程和執行的基本單位,在Linux中也被稱之為輕量級程序。從定義中可以看出,執行緒它是作業系統的概念,在不同的作業系統中的實現是不同的。
對於Linux作業系統而言,它對Thread的實現方式比較特殊。在Linux核心中,其實是沒有執行緒的概念的,它把所有的執行緒當做標準的程序來實現,也就是說Linux核心,並沒有為執行緒提供任何特殊的排程語義,也沒有為執行緒實現特定的資料結構。取而代之的是,執行緒只是一個與其他程序共享某些資源的程序。每一個執行緒擁有一個唯一的task_struct結構,Linux核心它僅僅把執行緒當做一個正常的程序,或者說是輕量級程序,LWP(Lightweight processes)。
資源共享
Linux執行緒與程序的區別,主要體現在資源共享、排程、效能幾個方面,首先看一下資源共享方面。上面也提到,執行緒其實是共享了某一個程序的資源,這些資源包括:
哪些是執行緒獨自擁有的呢?
排程
說到排程,就得提到程序的上下文切換。上下文切換也被稱作為程序排程或者任務切換,簡單的來說是把CPU從一個程序或者執行緒切換到另一個執行。概括的來說,執行緒的上下文切換,要比程序更加快速,因為本質上,執行緒很多資源都是共享程序的,所以切換時,需要儲存和切換的項是很少的。
執行緒上線文切換時,虛擬地址空間是不變的,但是程序上下文切換時,是需要重新對映虛擬地址空間。程序切換上下文時,進出OS核心&暫存器切換,是最大的時間支出。更模糊的代價是上下文切換時,會干擾處理器的快取機制。當上下文切換時,處理器需要重新cache一些記憶體。
這裡更大的一個區別時,當更改虛擬地址空間時,CPU 的 TLB 等也會被重新整理,導致接下來的記憶體訪問更加耗時,所以相對執行緒切換來說,程序的切換耗時更大。
效能
從效能方面,來檢視一下執行緒與程序的對比。由於執行緒更加輕量,導致執行緒的建立速度、切換速度都要高於程序。這裡就有一個疑問了,從上面提到的各個方面來看,好像執行緒都要優於程序,那麼有沒有啥缺點呢?
執行緒同樣也有缺點,最大的缺點是執行緒的不安全性,缺乏保護機制。就是上面提到的黑科技,因為執行緒間共享資料,一個執行緒可以重寫另外一個執行緒的堆疊,導致出現一些異常的情況。除此之外,執行緒還有以下缺點:
Linux執行緒是程序資源共享的一種方式,執行緒在建立的時候,會共享程序的虛擬地址空間、開啟的檔案列表、大部分資料,所以在建立和銷燬的時候,比程序做的事情要少很多。
執行緒概念
執行緒是作業系統能夠排程和執行的基本單位,在Linux中也被稱之為輕量級程序。從定義中可以看出,執行緒它是作業系統的概念,在不同的作業系統中的實現是不同的。
對於Linux作業系統而言,它對Thread的實現方式比較特殊。在Linux核心中,其實是沒有執行緒的概念的,它把所有的執行緒當做標準的程序來實現,也就是說Linux核心,並沒有為執行緒提供任何特殊的排程語義,也沒有為執行緒實現特定的資料結構。取而代之的是,執行緒只是一個與其他程序共享某些資源的程序。每一個執行緒擁有一個唯一的task_struct結構,Linux核心它僅僅把執行緒當做一個正常的程序,或者說是輕量級程序,LWP(Lightweight processes)。
程序與執行緒的區別資源共享
Linux執行緒與程序的區別,主要體現在資源共享、排程、效能幾個方面,首先看一下資源共享方面。上面也提到,執行緒其實是共享了某一個程序的資源,這些資源包括:
記憶體地址空間程序基礎資訊大部分資料開啟的檔案訊號處理當前工作目錄使用者和使用者組屬性等等哪些是執行緒獨自擁有的呢?
執行緒ID一系列的暫存器棧的區域性變數和返回地址錯誤碼 errno訊號掩碼優先順序等等排程
說到排程,就得提到程序的上下文切換。上下文切換也被稱作為程序排程或者任務切換,簡單的來說是把CPU從一個程序或者執行緒切換到另一個執行。概括的來說,執行緒的上下文切換,要比程序更加快速,因為本質上,執行緒很多資源都是共享程序的,所以切換時,需要儲存和切換的項是很少的。
執行緒上線文切換時,虛擬地址空間是不變的,但是程序上下文切換時,是需要重新對映虛擬地址空間。程序切換上下文時,進出OS核心&暫存器切換,是最大的時間支出。更模糊的代價是上下文切換時,會干擾處理器的快取機制。當上下文切換時,處理器需要重新cache一些記憶體。
這裡更大的一個區別時,當更改虛擬地址空間時,CPU 的 TLB 等也會被重新整理,導致接下來的記憶體訪問更加耗時,所以相對執行緒切換來說,程序的切換耗時更大。
效能
從效能方面,來檢視一下執行緒與程序的對比。由於執行緒更加輕量,導致執行緒的建立速度、切換速度都要高於程序。這裡就有一個疑問了,從上面提到的各個方面來看,好像執行緒都要優於程序,那麼有沒有啥缺點呢?
執行緒缺點執行緒同樣也有缺點,最大的缺點是執行緒的不安全性,缺乏保護機制。就是上面提到的黑科技,因為執行緒間共享資料,一個執行緒可以重寫另外一個執行緒的堆疊,導致出現一些異常的情況。除此之外,執行緒還有以下缺點:
共享屬性:全域性變數是在所有執行緒間共享的,訪問時是需要同步加鎖。很多庫函式是執行緒非安全的,多執行緒程式設計時,需要注意這一點。執行緒的健壯性不強,如果一個執行緒crash了,那麼整個應用程式就跪了。總結Linux執行緒是程序資源共享的一種方式,執行緒在建立的時候,會共享程序的虛擬地址空間、開啟的檔案列表、大部分資料,所以在建立和銷燬的時候,比程序做的事情要少很多。