linux2 4執行緒實現機制分析

2021-05-27 18:09:46 字數 1447 閱讀 2855

一.基礎知識:執行緒和程序

按照教科書上的定義,程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是更好的支援smp以及減小(程序/執行緒)上下文切換開銷。

無論按照怎樣的分法,乙個程序至少需要乙個執行緒作為它的指令執行體,程序管理著資源(比如cpu、記憶體、檔案等等),而將執行緒分配到某個cpu上執行。乙個程序當然可以擁有多個執行緒,此時,如果程序執行在smp機器上,它就可以同時使用多個cpu來執行各個執行緒,達到最大程度的並行,以提高效率;同時,即使是在單cpu的機器上,採用多執行緒模型來設計程式,正如當年採用多程序模型代替單程序模型一樣,使設計更簡潔、功能更完備,程式的執行效率也更高,例如採用多個執行緒響應多個輸入,而此時多執行緒模型所實現的功能實際上也可以用多程序模型來實現,而與後者相比,執行緒的上下文切換開銷就比程序要小多了,從語義上來說,同時響應多個輸入這樣的功能,實際上就是共享了除cpu以外的所有資源的。

針對執行緒模型的兩大意義,分別開發出了核心級執行緒和使用者級執行緒兩種執行緒模型,分類的標準主要是執行緒的排程者在核內還是在核外。前者更利於併發使用多處理器的資源,而後者則更多考慮的是上下文切換開銷。在目前的商用系統中,通常都將兩者結合起來使用,既提供核心執行緒以滿足smp系統的需要,也支援用執行緒庫的方式在使用者態實現另一套執行緒機制,此時乙個核心執行緒同時成為多個使用者態執行緒的排程者。正如很多技術一樣,"混合"通常都能帶來更高的效率,但同時也帶來更大的實現難度,出於"簡單"的設計思路,linux從一開始就沒有實現混合模型的計畫,但它在實現上採用了另一種思路的"混合"。

當核內既支援程序也支援執行緒時,就可以實現執行緒-程序的"多對多"模型,即乙個程序的某個執行緒由核內排程,而同時它也可以作為使用者級執行緒池的排程者,選擇合適的使用者級執行緒在其空間中執行。這就是前面提到的"混合"執行緒模型,既可滿足多處理機系統的需要,也可以最大限度的減小排程開銷。絕大多數商業作業系統(如digital unix、solaris、irix)都採用的這種能夠完全實現posix1003.1c標準的執行緒模型。在核外實現的執行緒又可以分為"一對一"、"多對一"兩種模型,前者用乙個核心程序(也許是輕量程序)對應乙個執行緒,將執行緒排程等同於程序排程,交給核心完成,而後者則完全在核外實現多執行緒,排程也在使用者態完成。後者就是前面提到的單純的使用者級執行緒模型的實現方式,顯然,這種核外的執行緒排程器實際上只需要完成執行緒執行棧的切換,排程開銷非常小,但同時因為核心訊號(無論是同步的還是非同步的)都是以程序為單位的,因而無法定位到執行緒,所以這種實現方式不能用於多處理器系統,而這個需求正變得越來越大,因此,在現實中,純使用者級執行緒的實現,除演算法研究目的以外,幾乎已經消失了。

linux核心只提供了輕量程序的支援,限制了更高效的執行緒模型的實現,但linux著重優化了程序的排程開銷,一定程度上也彌補了這一缺陷。目前最流行的執行緒機制linuxthreads所採用的就是執行緒-程序"一對一"模型,排程交給核心,而在使用者級實現乙個包括訊號處理在內的執行緒管理機制。linux-linuxthreads的執行機制正是本文的描述重點。

(建立執行緒通過clone程序共享來實現)

其餘部分見:

linux2 4核心 path walk流程簡析

這裡以path walk解析 usr lib glibc為例 int path walk const char name,struct nameidata nd while c c 計算每個分量的長度 this.len name const char this.name this.hash end ...

Linux 2 4 核心學習筆記 訊號

版權申明 0 31 這 32 個訊號稱為標準訊號。從 32 到 63 之間的 32 個訊號稱為實時訊號。可以通過 man 7 signal 檢視對 標準訊號 和 實時訊號 詳細的描述。每個程序擁有乙個訊號等待佇列。在 task struct 中有乙個 struct sigpending pendin...

linux2 4到linux2 6核心排程(1)

本文從 linux 2.4 排程系統的缺陷入手,詳細分析了 linux 2.6 排程系統的原理和實現細節,並對與排程系統相關的負載平衡 numa 結構以及實時效能進行了分析和評價。文末,作者從排程系統的發展和實現出發,對 linux 的發展特點和方向提出了自己的看法。1 前言 linux 的市場非常...