java線程的五種狀態其實要真正高清,只需要明白計算機操作系統中進程的知識,原理都是相同的。
系統根據PCB結構中的狀態值控制進程。
單CPU系統中,任一時刻處於執行狀態的進程只有一個。
進程的五種狀態:初始態,執行態,等待態,就緒態,終止態。
執行狀態:一個進程獲得了必要資源,並且在CPU上執行時的狀態。
執行態進程因為等待某種事件的發生處於等待狀態。
執行態進程的時間片用完或在搶占式調度中有更高優先級的進程時變為就緒狀態。
阻塞原語:一個執行進程期待某一個事件的發生,但發生條件尚不具備,該進程自己調用阻塞原語阻塞自己。
過程:執行態進程——中斷處理機和保護該CPU現場——變為阻塞狀態——插入等待隊列——轉進程調度程序選就緒進程運行。
就緒狀態的進程經調度程序選中之後才可以進入執行狀態。
就緒狀態的進程已經獲得了除處理機以外的所有資源,一旦獲得處理機就可以立即執行的狀態
等待狀態的進程因為等待事件發生被喚醒後,不能立刻得到處理機而進入就緒狀態。
喚醒進程有兩種方法:系統進程喚醒和事件發生進程喚醒
就緒態與等待態的區別:當分配給該進程處理機時,該進程能否立即執行,能就是就緒態,否則就是等待態。
初始狀態:進程剛被創建時,由於其他進程正占有處理機而得不到執行,處於初始狀態。(被創建的進程最初處於初始狀態)
終止狀態:進程執行結束後,退出執行而被終止,處於終止狀態。
進程具有獨立性和異步性等並發特征。
進程控制是對系統中所有進程進行管理。其功能包括進程的創建,撤銷,阻塞,喚醒等。(題外話,這些功能是由操作系統內核來實現的)
進程控制是通過原語來實現的。
原語:由若干條機器指令構成的一段程序,用以完成特點的功能,這段程序在執行期間不可分割。原語的執行不能被中斷。
處理機三級調度
一個作業從提交開始直到完成要經歷三級調度。
1, 高級調度(作業調度)
根據一定原則從外存上處於後備狀態的作業中選擇一個或多個,給他們分配內存,輸出輸入等必要資源,並建立相應的進程,使該作業具有獲得競爭處理機的權利。作業調度運行頻率低,幾分鐘一次。
作業被選進內存時創建相應進程
作業調度的兩個問題:調度程序必須決定操作系統可以接納多少個作業,調度程序必須決定接納那些作業。
作業調度每次要接納多少個作業進入內存,取決於多道程序的並發程度,即允許有多少個作業同時在內存中運行。
將那些作業從外存調入內存,取決於調度算法。
先來先到算法:最早進入外存的作業最先調入內存。
短作業優先法:將外存上執行時間最短的作業最先調入內存。
2, 中級調度
將處於外存對換區中具備運行條件的進程調入內存,或將處於內存的暫時不能運行的進程交換到外存。
3, 低級調度(進程調度)
從就緒隊列中選擇一個進程,將處理機分配給他。
進程調度運行頻率高,幾十毫秒一次。
作業調度和進程調度的區別:作業調度的結果是為了創建進程,而進程調度的結果是進程被執行。
進程調度(重點)
為了實現進程調度,進程管理模塊必須將系統中各進程的執行情況和狀態特征記錄在各個進程的PCB中,根據各個進程的狀態特征和資源需求等信息將進程的PCB組織成相應的隊列
進程調度方式:當一個進程正在處理機上執行時,若某個更為重要的進程需要處理(優先級更高的進程進入就緒隊列),此時應該如何分配處理器。兩種方式:
搶占式:一個進程正在處理機上執行,若有某個優先級更高的進程進入就緒隊列,則立即暫停正在執行的進程,將處理機分配給新的進程。
非搶占式:一個進程正在處理機上執行,若有某個優先級更高的進程進入就緒隊列,仍然讓正在執行的進程繼續執行,直到該進程自動釋放處理機(時間片用完,進入阻塞,完成),才將處理機分配給新的進程。
調度算法
先來先服務(作業,進程調度)
按照作業或進程的請求順序進行調度。
注意,在進程調度中,一旦一個進程占用處理器,他就一直運行下去,直到該進程完成或變為等待狀態(這裡處理機沒有分時間片,不存在執行到就緒的轉換)。非搶占式。
短作業優先(作業,進程)
選擇能最快完成的作業或進程(會出現饑餓現象)
一直獨占處理機
優先級調度(作業,進程)
調用優先級最高的,一直獨占處理機
細分為搶占式和非搶占式
時間片輪轉法(進程)
每個進程不能一直占處理機直到完成,有執行到就緒的轉換
不允許多個並發進程交叉執行的一段程序(這段程序必須一次執行完,不能中斷,多線程同步代碼塊)稱為臨界部分。
進程同步與互斥
兩種制約關系
間接制約(互斥):某一個進程要求使用某種資源,而該資源正在被另一個進程使用,並且這一個資源不允許兩個進程同時使用,那麼該進程只能等待已占用資源的進程釋放後再使用。
互斥要求:
空閒讓進:沒有進程進入臨界部分時,可以允許一個請求進入臨界部分的進程立即進入臨界區。
忙則等待:已有進程進入臨界區,其他試圖進入臨界部分的進程必須等待。
有限等待:對要訪問臨界部分的進程,應保證在有限時間內進程臨界部分。
讓權等待:當一個進程因為某些原因不能進入臨界部分時,應釋放處理器給其他進程。
直接制約(同步):某一個進程若收不到另一進程給它提供的必要信息就不能繼續運行下去。
P,V原語
使用信號量來管理臨界區的公有資源。
信號量sem,sem>=0代表可供並發進程使用的資源實體數,sem<0代表正在等待使用臨界區的進程數。
P操作sem-1,V操作sem+1.
當某個進程正在臨界區執行時(處於執行狀態),其他進程執行P原語(這裡以前的疑惑是有進程在執行了,別的進程是不會執行的因為沒有占用處理機。其實呢,這樣考慮,進程執行臨界區時,沒有執行完,然後時間片用完,轉就緒狀態,然後其他進程在處理機執行P原語,發現無法進入臨界區,阻塞自己,當臨界區可以被執行後,從相同阻塞隊列中選一個被喚醒,轉就緒而被執行),則該進程會進入等待隊列等待其他做V原語操作釋放資源後,進入臨界區,這是P原語才結束。
P原語操作:
1, sem-1
2, 若sem-1後>=0,則P原語返回表示,該進程可以繼續執行。
3, 若sem-1後<0,則該進程被阻塞,進入對應阻塞隊列,轉進程調度,選擇就緒隊列一個進程進入執行狀態。
V原語操作
1, sem+1
2, 相加大於0,V原語停止執行,該進程返回調用出處,繼續執行
3, 相加<=0,從該信號等待隊列中選擇一個進程喚醒(因為負數代表等待進程數目,sem+1了,就說明等待進程少了一個),V原語停止執行,然後再返回原進程繼續執行。
死鎖四個條件
處理死鎖方法