多執行緒(一) 程序 執行緒與核心物件介紹

2022-08-22 15:30:13 字數 3918 閱讀 7329

作業系統核心物件:

核心物件是由核心擁有的,而不是由程序擁有。

如果你的程序建立了乙個核心物件的控制代碼,然後你的程序中止執行,那麼,核心物件不一定會被銷毀。

核心物件的存在時間可以比建立該核心物件的程序長很多。 核心需要知道多少個程序正在使用某個核心物件,所以核心物件有乙個使用計數。使用計數是核心物件常用的資料成員

createthread的返回值handle是乙個核心物件(kernel objects)。handle是乙個指標,指向作業系統記憶體空間的乙個物件,此物件不允許直接取得,為的是維護系統的完整性與安全性。

win32系統中包括如下核心物件: (1)程序(processes)、(2)執行緒(threads)、(3)檔案(files)、(4)事件(events)、(5)訊號量(semaphores)、(6)互斥器(mutexes)、(7)管道(pipes) 核心物件保持了乙個引用計數,一旦引用計數降至0,核心物件便自動消毀。

控制代碼:

當呼叫乙個建立核心物件的函式時,該函式返回乙個控制代碼,用來標誌這個核心物件。

這個控制代碼值是和程序密切相關的,只能在這個程序中使用,如果在其他的程序中使用這個控制代碼值操作控制代碼,會失敗。

在這個程序中的其他執行緒,可以使用這個控制代碼值

當乙個程序初始化的時候,系統為他分配乙個控制代碼表。核心物件的控制代碼實際上是在控制代碼表中的乙個索引值。

event物件:

win32中最具彈性的同步機制就是event物件了。event物件是一種核心物件,它的唯一目的就是成為激發狀態或未激發狀態,這兩種狀態完全由程式來控制,不會成為wait…的***。

為了產生乙個event物件,必須呼叫createevent();

程序:

程序通常被定義為乙個正在執行的程式的例項,程序是不活潑,程序只是執行緒的容器,乙個程序可以包括多個執行緒,從不執行任何東西。

執行緒:

執行緒總是在某個程序環境中建立的,執行緒在它的程序位址空間中執行**,並且在程序的位址空間中對資料進行操作。

執行緒狀態:

新建狀態:沒有呼叫start方法之前

執行(running)態(執行run方法):占有處理器正在執行

就緒(ready)態(呼叫start方法之後,等待cup分配執行權):指具備執行條件,等待系統分配處理器以便執行

等待(wait)態(wait、sleep、鎖資源被其他執行緒搶占等):又稱為阻塞(blocked)態或睡眠(sleep)態,指不具備執行條件,正在等待某個事件的完成 

執行態—→等待態:等待使用資源;如等待外設傳輸;等待人工干預

等待態—→就緒態:資源得到滿足;如外設傳輸結束;人工干預完成

就緒態—→執行態:cpu空閒時選擇乙個就緒執行緒。

執行態—→就緒態:執行時間片到;出現有更高優先權執行緒。

使用多執行緒比使用多程序的好處:

1、執行緒廉價

2、啟動比較快,退出比較快

3、對系統資源的衝擊比較小

4、執行緒彼此分享了大部分核心物件的擁有權

多執行緒程式的風險:

1、多執行緒程式無法預期,即每次執行結果不同

2、 執行次序無法保證,即執行緒間的執行順序隨機

3、執行緒並不總是立刻啟動

注意事項:

各執行緒的資料要分離開來,避免使用全域性變數 確定知道執行緒的狀態,不要徑自結束程式而不等待它們的結束。

執行緒狀態切換(也稱為執行緒上下文切換):

硬體計時器發現執行時間過長,就會發出乙個中斷,作業系統會從cpu中取出該執行緒的當前狀態(資料暫存器內容)儲存到堆疊中,再拷貝到乙個context結構,以備後用

多執行緒狀態切換導致**執行結果的隨機性

單cup的機器上,多執行緒不能提高程式的效能,但能提高cup效率

執行緒種類:

使用者執行緒(非守護執行緒):新建立的執行緒,當主線程掛掉時,不受影響

守護執行緒:當所有使用者執行緒和主線程都停止,守護執行緒自動停止。在start之前呼叫setdeamon(true)方法設定為守護執行緒。

子執行緒:主線程中建立的執行緒

保證執行緒安全的方式:

執行緒鎖、臨界區(critical sections)、分模組使執行緒之間盡量不共用**

執行緒間通訊方式:

event(核心物件:事件)、靜態變數(比如事件佇列)、條件變數、互斥鎖、wait方法等

執行緒間通訊的兩個基本問題:同步與互斥

執行緒同步

執行緒之間所具有的一種制約關係,乙個執行緒的執行依賴另乙個執行緒的訊息,當它沒有得到另乙個執行緒的訊息時應等待,直到訊息到達時才被喚醒

執行緒互斥

各執行緒排它訪問共享的作業系統資源。當有若干個執行緒都要使用某一共享資源時,任何時刻最多隻允許乙個執行緒去使用,其它要使用該資源的執行緒必須等待,直到占用資源者釋放該資源 執行緒互斥是一種特殊的執行緒同步

mutex和critical section區別:

鎖住乙個未被擁有的mutex比鎖住乙個未被擁有的critical section,需要花費幾乎100倍的時間。因為critical section不需要進入作業系統核心。

mutex可以跨程序使用,critical section則只能在下個執行緒中使用。

等待乙個mutex時,可以指定「結束等待」的時間長度,但對於critical section則不行。

解決死鎖 ---- 打破四個條件:

通過強行規定任務獲得資源的方式防止死鎖:幾個任務要訪問資源a,b和c,任務以同樣的次序獲得和釋放資源

任務一次性請求所需要的資源,或要求被拒絕使用某一資源的任務,立即釋放它所持有的所有其它資源,然後重新獲得。

執行緒中止的幾種方法:執行緒的退出應該盡可能的使用第一種方式,讓執行緒自己正常的退出

執行緒的入口函式返回

在同乙個程序的其他執行緒中呼叫terminatethread函式,終了指定執行緒。

包含執行緒的程序中止執行

一 程序執行緒

1.程序的3種狀態 執行 阻塞 就緒 其中不存在的狀態轉換 阻塞 執行 就緒 阻塞 2.作業系統用於維護程序記錄的結構 程序表或程序控制權 pcb 3.程式使用cpu的3種方式 cpu導向 io導向 平衡型程式 4.程序排程目標 極小化平均時間 級大化系統吞吐量 保持系統各個功能部分均處於繁忙狀態和...

執行緒 程序 多執行緒核心概念

執行緒就是獨立的執行路徑 在程式執行時,即使沒有自己建立執行緒,後台也會有多個執行緒,如主線程,gc執行緒 main 稱之為主線程,為系統的入口,用於執行整個程式 在乙個程序中,如果開闢了多個執行緒,執行緒的執行由排程器安排排程,排程器是與作業系統緊密相關的,先後順序是不能人為的干預的。對同乙份資源...

程序 執行緒 協程(一 程序環境)

本來這個程序 執行緒 協程是在9月份看完了,可惜9月份墮落了很就,就推到了11月份,為什麼不10月份呢?因為國慶要回家,總不能拿這麼厚的書回家把,所以就選了一本nginx,比較薄的書,接下來一段時間內,我們專供程序 執行緒 協程 我們從開始學c語言開始就一直寫main函式,我們也知道c程式總是從ma...