程序詳細剖析(二)

2022-02-03 22:43:31 字數 2763 閱讀 8784

摘自《c++多核高階程式設計》

5.6.3  程序狀態

在程序執行期間,它的狀態會發生改變。程序的狀態時指程序的當前狀況。在posix相容的環境中,程序可以處於以下狀態:

1)執行(running)

2)就緒(runnable, ready)

3)僵死(zombied)

4)等待(waiting, blocked)

5)停止(stopped)

程序的當前狀況取決於程序或作業系統所創造的境況(circumstance)。當特定境況出現時,程序將改變它的狀態。狀態轉換(state transition)是程序改變其狀態的境況。下圖時程序的狀態圖,狀態圖由節點以及節點之間的有向邊組成。每個節點代表程序的狀態,節點之間的有向邊時狀態轉換。表5-4列出了狀態轉換以及簡要描述。如下圖和下表所以,狀態之間只能發生特定轉換。例如,在就緒和執行之間存在轉換,但是在休眠和執行之間不存在轉換。這意味著有一些境況能夠導致乙個程序從就緒狀態轉到執行狀態,但是沒有哪個境況能夠使得程序從休眠狀態轉到執行狀態。

當建立了乙個程序後,它就已經準備好執行它的指令了,但是它首先必須等待,直到處理器可用。每個程序只允許使用處理器一小段時間,被稱作時間片(time slice)。等待使用處理器的程序處於就緒佇列中,只要就緒佇列中的程序會被排程器選中來使用處理器。就緒佇列中的程序時可執行的(runnable)。當處理器可用時,會由分派器(dispatcher)指派乙個可執行的程序給處理器。當時間片用完之後,無論它是否執行完它的全部指令,程序都將被從處理器上移除。程序會被放回到就緒佇列中,等待下一次輪到它使用處理器。從就緒佇列中選出乙個新的程序並給它時間片來執行。系統程序是非搶占式的,當它們占用處理器後,會一直執行到結束。如果時間片沒有用完,程序如果因為等待某個事件的發生而不能夠繼續處理,會主動放棄處理器。程序也可能通過發起系統呼叫來發出訪問i/o裝置的請求,或者可能需要等待乙個同步變數被釋放。由於等待事件發生而不能夠繼續執行的程序會處於休眠狀態,它會同其他休眠程序一同被放入乙個佇列中。當事件發生之後,會從該佇列中將它們刪除,病放回到就緒佇列中。在時間片被用完之前,程序鎖使用的處理器可能被搶奪走,這發生在有更高優先順序的程序可執行時,如系統程序。被強佔的程序仍然是可執行的,因此會被放到就緒佇列中。

執行中的程序可能會收到乙個停止訊號。停止狀態同休眠狀態是不同的,程序的時間片沒有用完,而程序也沒有發起任何系統請求。程序可能會接收到停止訊號,是因為它正在被除錯,或者在系統中發生了某種情況。程序接收到訊號後,會進行從執行狀態到停止狀態的轉換,稍後程序可能會被喚醒,或者可能被銷毀。

當程序執行完所有的指令後,它會退出系統。程序會從程序表中被刪除,pcb將被銷毀,它的所有 資源將被釋放並退回到系統可用資源池中。不能夠繼續執行但也不能夠退出系統的程序的狀態被稱為僵死狀態。僵死程序不使用任何系統資源,但是仍然在程序表中占用乙個條目。當程序表中包含過多的僵死程序時,會影響系統的效能,甚至可能導致系統重新啟動。

5.6.4 程序是如何被排程的

當乙個就緒佇列包含多個程序時,排程器必須決定首先將哪個程序指派給處理器。排程器維護使得它可以以高效的方式排程程序的資料結構。每個程序將被賦予乙個優先級別,並同其他有著相同優先順序別的可執行程序放置在同乙個優先順序佇列中。存在多個優先順序佇列,每個佇列代表系統所使用的不同的優先級別。這些優先級別佇列時分不同等級的,而且被放置在乙個名為多優先順序佇列(multilevel priority queue)的分派陣列(dispatcg arrat)中。下圖描述了多個優先順序佇列。陣列中的每個元素指向乙個優先順序佇列。排程器將位於非空最高優先順序佇列頭部的程序指派給處理器。

優先順序可以時動態的或靜態的。一旦程序的靜態優先順序被設定,則不能夠改變它,而動態優先順序是可以改變的。有著最高優先順序的程序可以壟斷對處理器的使用。如果乙個程序的優先順序時動態的,最初的優先順序可以被調整為更合適的值。程序會被放置到有著更改優先順序的優先順序佇列。還可以給壟斷處理器的程序設定較低的優先順序,或者把其他程序的優先順序設定得更高一些。當您為使用者程序設定優先順序時,需要考慮程序多數時間是做什麼型別的工作。有些程序是cpu密集型的,這些程序在整個時間片內部都使用處理器,有些程序將多數時間用於等待i/o或一些其他事件的發生。當這樣的乙個程序準備好使用處理器時,應當立即將處理器交給它使用,這樣它能夠處理下乙個i/o請求。互動程序可能會要求高優先順序來保證良好的響應時間。系統程序的優先順序高於使用者程序。

程序是根據排程策略放置在優先順序佇列中的,在posix api中使用的兩個主要排程策略是fifo(first-in, first-out, 先進先出)和rr(round robin, 輪詢)策略。

1)下圖顯示了fifo排程策略。使用fifo排程策略時,程序時根據到達佇列的時間被指派給處理器的。當正在執行的程序的時間片耗盡時,它會被放置到優先順序的頭部。當乙個休眠程序變為可執行時,它將被放置在優先順序佇列的尾部。程序可以發起系統呼叫並放棄處理器,將處理器交給有著相同優先順序等級的另乙個程序,然後這個程序會被放置到優先順序佇列的尾部。

2)在輪詢排程策略下,所有程序都被同等對待。下圖描述了rr排程策略。rr排程和fifo的區別在於:當時間片耗盡時,程序被放置到佇列的後端,同時佇列中的下乙個程序被指派給處理器。除了這一點之外,rr和fifo相同。

上圖顯示了fifo和rr排程策略的行為。fifo排程策略根據程序到達佇列的時間將它們指派到處理器,程序將一直執行,直到結束。rr排程策略使用fifo排程指派執行緒,但是當時間片耗盡時,程序將被放置到就緒佇列的尾部。

詳細剖析Linux程序排程時機

linux在眾多程序中是怎麼進行排程的,這個牽涉到linux程序排程時機的概念,由linux核心中schedule 的函式來決定是否要進行程序的切換,如果要切換的話,切換到哪個程序等等。linux程序排程時機主要有 1 程序狀態轉換的時刻 程序終止 程序睡眠 2 當前程序的時間片用完時 curren...

Linux程序剖析

linux系統下程式所處的環境 a 執行於使用者空間,執行使用者程序。b 執行於核心空間,處於程序上下文中,代表某個特定的程序執行。c 執行於核心空間,處於中斷上下文中,與任何程序無關,代表硬體執行於核心空間,處理某個特定的中斷。通過系統呼叫,使用者空間的應用程式就會進入核心空間,由核心代表該程序執...

執行緒詳細剖析(四)

摘自 c 多核程式設計 6.3 設定執行緒屬性 存在一些可用來確定執行緒上下文的關於執行緒的資訊。這些資訊用於重建執行緒的環境。令對等執行緒相互之間產生區別的是id 定義執行緒狀態的暫存器組 優先順序和它的棧。這些屬性使得執行緒有了自己的身份。posix執行緒庫定義了執行緒屬性物件 attribut...