WINDOWS核心程式設計學習心得 執行緒排程

2021-06-21 11:33:49 字數 3170 閱讀 6708



執行緒的主要有五種狀態

1.新建狀態:新建立了乙個執行緒物件。

2.就緒狀態:執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。

3.執行狀態:就緒狀態的執行緒獲取了cpu,執行程式**。

4.阻塞狀態:阻塞狀態是執行緒因為某種原因放棄cpu使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。

5.掛起狀態:一般是指被掛起,因為同一時刻,需要「同步」執行的執行緒不止他乙個,所以基於時間片輪轉的原則,他在獨佔了一段時間的cpu後,被掛起,執行緒環境被壓棧。

下面就掛起和阻塞進行以下說明:

1.掛起是一種主動行為,因此恢復也應該要主動完成,而阻塞則是一種被動行為,是在等待事件或資源時任務的表現,你不知道他什麼時候被阻塞(pend),也就不能確切 的知道他什麼時候恢復阻塞。而且掛起佇列在作業系統裡可以看成乙個,而阻塞佇列則是不同的事件或資源(如訊號量)就有自己的佇列。

2.阻塞(pend)就是任務釋放cpu,其他任務可以執行,一般在等待某種資源或訊號量的時候出現。掛起(suspend)不釋放cpu,如果任務優先順序高就永遠輪不到其他任務執行,一般掛起用於程式除錯中的條件中斷,當出現某個條件的情況下掛起,然後進行單步除錯。

3.pend是task主動去等乙個事件,或訊息.suspend是直接懸掛task,以後這個task和你沒任何關係,任何task間的通訊或者同步都和這個suspended task沒任何關係了,除非你resume task;

4.任務排程是作業系統來實現的,任務排程時,直接忽略掛起狀態的任務,但是會顧及處於pend下的任務,當pend下的任務等待的資源就緒後,就可以轉為ready了。ready只需要等待cpu時間,當然,任務排程也占用開銷,但是不大,可以忽略。可以這樣理解,只要是掛起狀態,作業系統就不在管理這個任務了。

5.掛起是主動的,一般需要用掛起函式進行操作,若沒有resume的動作,則此任務一直不會ready。而阻塞是因為資源被其他任務搶占而處於休眠態。兩者的表現方式都是從就緒態裡「清掉」,即對應標誌位清零,只不過實現方式不一樣。

這些術語是針對執行緒或程序來說的,比如有種叫法「程序三態」什麼的,但是不同的作業系統,或者同種作業系統不同版本見也存在狀態管理方式上的不同,比如還有什麼「程序五態」、「程序七態」的,我們可以把作業系統對程序的控制形象地比作僱人打工。

1、睡眠態:雇主對雇工說:「你睡覺去吧,某時某刻回來報道,接著幹活!」

2、掛起態:雇主對雇工說:「你睡覺去吧,用得著你的時候,我會去叫你的,接著幹活!」

3、就緒態:雇工的掃帚(指cpu)被別的雇工搶了,自己只能按照規定的方式參與競爭(比如linux中是按時間片輪轉的方式),搶到就是自己的,然後接著幹活!

4、阻塞態:雇工的抹布(指非cpu的其他資源)被別的雇工搶了,自己只能幹等著,等到了抹布,就進入就緒態,繼續參與到搶掃帚的競賽中。

這裡可以想象,睡眠和掛起應該是差不多的,睡眠應該是掛起多長時間後回來,但是他們都是一直佔著cpu的。

windows不是實時作業系統,是搶占式的多執行緒作業系統,系統可以在任何時候停止乙個執行緒呼叫另外的執行緒。

乙個執行緒可以被掛起多次,suspendthread多少次就要resumethread多少次,除了被別人呼叫suspendthread掛起外,執行緒也可以告訴系統在一段時間內,可以將自己掛起,不需要排程。這可以呼叫sleep實現。

1

voidsleep(dworddwmilliseconds);

這裡引數是表示執行緒要掛起多長時間,但是windows不是實時作業系統,不能保證到時候準時醒來,當為其傳入0時,表示主調執行緒主動放棄本次時間片的剩餘部分。注意是本次。

當計算執行緒執行某任務所需的時間的時候,很多人習慣使用gettickcount64

1

2

3

ulongstart=gettickcount64();

//do something.

ulongend=gettickcount64();

這個函式可能會由於執行緒中途被掛起而變得不準確,windows提供了乙個函式可以返回乙個執行緒以獲得cpu時間

1

2

3

4

5

6

boolgetthreadtime(

handlehthread,

pfiletime pftcreationtime,

pfiletime pftexittime,

pfiletime pftkerneltime,

pfiletime pftusertime);

第乙個引數為想獲得的執行緒控制代碼。

第二個引數返回(執行緒建立時間-2023年1月1日0:00)的秒數。單位是100ns。

第三個表示退出時間-2023年1月1日0:00的秒數。單位是100ns。

第四個表示執行緒執行核心模式下的時間的絕對值。單位是100ns。

第五個表示執行緒執行使用者模式**的時間的絕對值。單位是100ns。

類似的,getprocesstime可以返回程序中所有執行緒的時間之和。

在進行高精度的計算時上述函式仍然不夠。此時windows提供了以下函式:

1

2

boolqueryperformancefrequency(large_integer *plifrequency)

boolqueryperformancecounter(large_integer *plicount);

這兩個函式假設正在執行的執行緒不會被搶占。它們都是針對生命期很短的**塊。getcpufrequencyinmhz可以獲得cpu頻率。

網路程式設計學習心得

unix struct in addr 32為的位址結構,是網路位元組序 struct sockaddr in s un b struct s un w u long s addr s un in addr,pin addr,far lpin addr union的作用是將大括號裡所有的東西的記憶體...

學習心得 python學習心得

自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...

迴圈結構程式設計學習心得

迴圈結構的一些知識點 1 明確了迴圈條件和迴圈體,選擇while語句實現迴圈。2 迴圈結構四要素 迴圈初始化,迴圈條件,迴圈體,迴圈變數修改。3 可以把for語句改寫成while語句,for語句和while語句都能實現迴圈。for語句和while語句都是在迴圈前先判斷條件,只有條件滿足才會進入迴圈。...