天天看點

Operating System-Thread(3)使用者空間和核心空間實作線程

作業系統使用者空間和核心空間簡介

在使用者空間實作線程

在核心空間實作線程

使用者空間和核心空間線程混合使用

一、使用者空間和核心空間簡介

使用者空間:User space,核心空間:Kernel Space。這兩個是作業系統的重要概念之一,今天為了線程做一下簡單的介紹:

核心空間用于運作作業系統核心元件,比如記憶體管理元件,IO互動元件,檔案管理、中斷管理元件等,同時驅動程式(Driver)也運作在核心空間。

使用者空間,用于運作普通應用程式。

示意圖:

二,在使用者空間實作線程

使用者空間的線程由程序通過一些已有的Library進行建立,非系統調用(system call)核心對此毫無知曉。實作如下圖所示。

在使用者空間實作線程,線程運作在運作時系統中(run-time system)。核心對此一無所知,對于核心來說,它這是在處理一個單線程的程序而已。在使用者空間實作線程時,每一個程序針對自己的線程維護了一個線程表(Thread Table),該表儲存了線程運作的各種變量,比如寄存器,PC,狀态等等,線程表用程序的運作時系統來維護,當一個線程被block,她的目前運作狀态會被儲存線上程表中,當再次啟動時,也會讀取線程表中已經儲存的狀态,從該狀态進行再次運作。

2.1 優勢

線程的建立有run-Time system通過調用現有的Library的Procedure完成,建立和銷毀程序的開銷非常小。

因為核心對線程沒有感覺,使用者空間的線程可以運作在不支援線程的作業系統中

因為線程由同一個運作時進行維護,在同一個程序内部,線程的切換沒有必要和核心大交道,是以線程之間的切換的開銷非常小,沒有Context Switch,也沒有記憶體緩存的重新整理重置。

使用者空間的線程可以自定義排程算法,程式員完全可以自己寫一套針對自己程式的線程排程算法

2.2 劣勢

因為對于核心來說,不管程序裡面有多少個線程,核心任然按照單線程程序來處理這個程序,是以統一時間一個程序裡面隻能有一個線程運作,就算有多個cpu空閑,也隻能有一個線程運作,是以無法最大限度的使用資源

當然由于隻能有一個線程運作,當某一個線程被block後,整個程序都會被block。

對于單程序的系統,使用者态的線程如果有一個啟動,就會永遠運作,無法被切換到另外一個線程,這裡還是與第一條有關,對于CPU來說,這個程序就隻有一個線程,另外因為是單程序,也就不會有中斷(trap、Interrupt)讓cpu切換到其他程序的請求。當然這個問題使用者可以實作自己的算法進行排程和改善(在run-time system中實作)

三、在核心空間實作線程

核心空間的線程全部有作業系統核心建立,實作如下圖所示。

核心線程同樣有線程表(Thread table),不過這個線程表是儲存在核心中,其功能和使用者空間線程表的功能一樣,都是用于儲存線程的資料。線程的排程由作業系統核心來實作。

核心線程和使用者空間線程基本從性能各方面來說基本是相反地

3.1 優勢

線程表包含所有程序的線程,所有一個程序的可能有多個線程同時在多個cpu上同時運作

一個線程被block不會導緻整個程序被block,CPU會看是不是有其他線程可以運作。

3.2 劣勢

  1。建立線程消耗非常大,需要在使用者空間和核心之間切換。

  2。當然發生線程的Context切換時,程式也要從使用者态和核心态之間互相切換,開銷大

四、使用者空間和核心空間線程混合使用

上面的兩種線程的實作方式都有明顯的優缺點,最好的方案其實就是将兩者結合,一個程式可以既有使用者空間的線程,也可以用核心空間的線程。

具體實作方式是,核心線程可以在其之上有一部分使用者空間的線程。核心隻排程核心的線程。

至于什麼樣的比例,怎麼實作。 又回到程式=資料結構+算法這個話題了。。。

------------------越是喧嚣的世界,越需要甯靜的思考------------------

合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。

積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。

繼續閱讀