執行緒的執行
程序的狀態
核心排程
無特殊指明,本文基於linux
對linux系統來說,使用者建立程序後,cpu分配時間片的單位其實是按執行緒分的。假如你的程式裡沒有建立執行緒,你可以把它看成是乙個單執行緒程式,linux核心其實不區分程序和執行緒,核心把執行單元叫做任務(task)。執行緒則是最小的工作單元。對於有子程序的程式來說,當該程序剛被其父程序fork出來時,是平分其父程序的剩餘時間片的。這個時間片執行完後,就會根據它的初始優先順序來重新分配時間片
linux的時間片不能直接修改,可以通過修改程序的優先順序來間接修改。排程程式會根據優先順序動態調整時間片。可以通過系統呼叫(終端命令列輸入)nice()來修改程序優先順序,從而影響時間片。nice的取值範圍是-20到+19,-20優先順序最高,+19最低。
注意:只有超級使用者才能在呼叫它時使用負值。
根據優先順序不同分得到的時間片長度不同,優先順序為+19時最低,只分配最小時間片5ms,優先順序為0時是100ms,優先順序是-20時是最大時間片800ms。
注意:具體時間數字根據實際核心配置有差異
執行緒被建立好會被加入到核心的執行緒佇列中等待執行,每個執行緒執行自己所分配的時間片長度後切換上下文,執行下乙個執行緒。如期間執行緒優先順序變化,還會從新分配時間片長度。
1-99:實時優先順序;
100-139:靜態優先順序;
數字越小,優先順序越高;
nice值:
(-20,19)對應(100,139)
可通過nice值調整的優先順序範圍:100-139
分別對應於:-20, 19
程序啟動時,其nice值預設為0,其優先順序是120;
多執行緒的一種用途就是能同時做好幾件事情,以提高效率。但實際問題是,cpu的數量(核心數,下同)是有限的,而且並不多。如果你的cpu有8個cpu,並且整個系統中有8個執行緒的話,不考慮中斷等因素,每個執行緒理論上能一直執行下去。
然而多於8個執行緒以後,作業系統就必須進行排程,也就是分配時間片。具體的分配方案,或者說排程演算法有很多種。排程演算法需要考慮和優化的問題。比如執行緒和程序有優先順序,在搶占式的排程中,優先順序高的執行緒可以從優先順序低的執行緒那裡搶占cpu。
另外,在多cpu平台上,排程演算法還要考慮快取的關聯性等。如果乙個程序建立了很多執行緒的話,最多也只有8個能夠處於執行的狀態,其餘的執行緒必須等待排程。執行緒被排程的時候需要進行上下文切換,這個操作是一種額外的開銷。執行緒數量過多的時候,上下文切換產生的額外開銷會對系統的效率造成負面影響。
也可以是說是執行緒在執行時的狀態
執行(running)態:程序占有處理器正在執行。
就緒(ready)態:程序具備執行條件,等待系統分配處理器以便執行。
等待(wait)態:又稱為阻塞(blocked)態或睡眠(sleep)態,指程序不具備執行條件,正在等待某個事件的完成。
通常,乙個程序在建立後將處於就緒狀態。每個程序在執行過程中,任意時刻當且僅當處於上述三種狀態之一。
執行態 > 等待態:等待使用資源或某事件發生,如等待外設傳輸等
等待態 > 就緒態:資源得到滿足或某事件己經發生,如外設傳輸結束,睡眠時間結束
執行態 > 就緒態:執行時間片到,或出現有更高優先權程序(如windows的搶占時演算法)。
就緒態 > 執行態:cpu空閒時被排程選中乙個就緒程序執行。
pid_t pid; 程序識別符號
pid_t tgid; 執行緒組識別符號(thread group id)
其中pid表示程序識別符號,在預設情況下,pid的取值範圍是0~32767,即系統內程序最多有32767個。tgid表示的是執行緒組識別符號,在核心執行多程序/多執行緒任務時,對於乙個程序內的不同執行緒來說,每個執行緒都有不同的pid,但是有統一的tgid,執行緒組的領頭執行緒的pid與tgid相同。當我們使用getpid()函式獲取當前執行程序的程序號時,實際getpid()函式的返回值是tgid的值而不是pid的值。
執行緒的執行狀態
執行緒從建立 執行到結束總是處於5種狀態之一 分別是新建狀態,就緒狀態,執行狀態,阻塞狀態,死亡狀態。這5種狀態之間的轉換流程如圖 新建狀態 當成功建立乙個執行緒,但是還未呼叫start方法之前的狀態,例如 thread thread new thread new runnable catch in...
執行緒的執行狀態
1,建立 當建立好執行緒物件的時候,也就是new thread類或者是new thread子類的時候。此時稱為建立狀態 2,就緒 當執行緒物件呼叫了start 方法,開啟執行緒了的時候,此時的執行緒已經開啟了,隨時可能會被cpu執行,因為cpu一此只能執行乙個執行緒,當其他執行緒已經開起了,但還沒有...
執行緒的幾種可執行狀態
1.新建 new 新建立了乙個執行緒物件。2.可執行 runnable 執行緒被建立後,其他 執行緒 比如main執行緒 呼叫了該物件的的start 方法,該狀態的執行緒處於可執行的執行緒池中,等待被執行緒排程使用,獲取cpu的使用權 3.執行 running 可執行執行緒獲得了cpu時間片,執行程...