作業系統核心物件:
核心物件是由核心擁有的,而不是由程序擁有。
如果你的程序建立了乙個核心物件的控制代碼,然後你的程序中止執行,那麼,核心物件不一定會被銷毀。
核心物件的存在時間可以比建立該核心物件的程序長很多。 核心需要知道多少個程序正在使用某個核心物件,所以核心物件有乙個使用計數。使用計數是核心物件常用的資料成員
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...