七(1 5) 執行緒的排程 優先順序和關聯性

2021-06-25 10:04:02 字數 1780 閱讀 2112

基本概念:   

windows為搶占式系統,必須使用某種演算法確定何時應該呼叫哪些執行緒以及需要分配多少時間等。

系統使用context結構記住執行緒狀態,在下一次獲得cpu時間時就可以從上一次停止處繼續。context結構是唯一乙個特定於cpu的資料結構(cpu上的每乙個暫存器都對應乙個資料成員,因此context的資料成員與cpu有關)。

上下文切換:大約每過20ms,windows就會檢視當前存在的執行緒,並從可以排程的執行緒中選擇乙個,將上次儲存 的cpu上下文值載入到cpu暫存器中。 這一過程即為上下文切換。      windows將記錄每個執行緒執行的次數,大約每過20ms(getsystemtimeadjustment()的第二個引數的返回值)就進行一次上下文切換,這個過程一直重複,知道系統關閉。   這就是windows的多執行緒的排程方式:搶占式(系統可能在任何時刻停止當前執行緒轉而執行另一線程,我們可以對此進行一些控制,但是餘地不大)

除了被掛起的執行緒外還有很多其他的執行緒不能被排程(因為他們在等待某事件的發生)。

7.1  執行緒的掛起和恢復

乙個執行緒可以被多次掛起,除了在建立時,還可以用suspendthread(handle hthread);實現(任何執行緒都可以通過該函式來掛起另一線程)。執行緒可以將自己掛起,但是不能自己恢復。 乙個執行緒最多被掛起maximum_suspend_count次。

注意: 在使用suspendthread(handle hthread)函式掛起另一線程時必須小心,因為我們無法知道此時被掛起執行緒正在做什麼。例如:掛起乙個正在分配堆中記憶體的執行緒,該執行緒將鎖定堆,從而其他執行緒訪問堆的行為將被中止,直到該執行緒被恢復。

7.2 程序的掛起和恢復

windows中並沒有掛起恢復程序的概念,因為不會給程序排程cpu時間。這裡是指 掛起或恢復乙個程序中的所有執行緒。

我們可以自己實現suspend_process函式:列舉該程序中的所有執行緒,對每個執行緒一次呼叫suspend_thread和resume_thread函式來實現。 

注意:由於在列舉執行緒集合時,程序中可能有新的執行緒被建立或執行緒被銷毀!!

7.3  睡眠

void sleep(dword dwmilliseconds);使執行緒被掛起大約dwmilliseconds毫秒長的時間(sleep函式告訴系統該執行緒在一段時間內不再需要排程)

注意:1、sleep使執行緒自願放棄屬於它的時間片剩餘部分

2、睡眠時間「大約「為dwmilliseconds毫秒,具體時間取決於其他執行緒的排程(windows不是實時系統)。

3、給sleep傳入引數0,告訴系統放棄了時間片剩餘部分。但是當沒有相同或較高優先順序的可排程執行緒時,系統還會排程該執行緒。

7.4  切換到另乙個執行緒

如果存在另乙個可排程執行緒,系統會讓執行緒執行bool switchtothread函式,此時系統檢視是否有繼續cpu時間的飢餓線程,如果沒有,該函式立即返回,如果有,switchtothread函式排程該飢餓線程(該執行緒可能比主調執行緒優先順序低)。飢餓線程執行乙個時間量後,系統排程程式恢復正常執行。(switchtothread函式為手動切換?)

7.5  在超執行緒cpu上切換到另一線程

超執行緒處理器晶元,有多個邏輯cpu,每個都可以執行乙個執行緒。當乙個執行緒中止時,cpu自動執行另個執行緒,不需要系統干預。

第七章 執行緒排程 優先順序和關聯性

一 resumethread 1 喚醒執行緒,將掛起計數減一。2 無法自己喚醒自己 二 suspendthread 1 掛起執行緒,將掛起計數加一。2 可以自己掛起自己。3 它是非同步的。4 需要防止產生鎖。三 sleep 1 讓乙個執行緒睡眠一段時間。2 傳入infinite 讓執行緒永遠睡眠。3...

運算子優先順序和關聯性

c 語言包括所有 c 運算子並新增多個新的運算子。運算子指定對下列項之一執行計算 運算子遵循嚴格的優先順序,該優先順序定義了包含這些運算子的表示式的計算順序。運算子與其左側或右側的表示式關聯 這稱為 關聯性 下表顯示 c 運算子的優先順序和關聯性 從最高優先順序到最低優先順序 表的同一段中的運算子具...

Java多執行緒 執行緒的排程 優先順序

與執行緒休眠類似,執行緒的優先順序仍然無法保障線程的執行次序。只不過,優先順序高的執行緒獲取cpu資源的概率較大,優先順序低的並非沒機會執行。執行緒的優先順序用1 10之間的整數表示,數值越大優先順序越高,預設的優先順序為5。在乙個執行緒中開啟另外乙個新執行緒,則新開執行緒稱為該執行緒的子執行緒,子...