普通程序
小結**展示執行緒
普通程序通過nice值來設定優先順序
執行緒是核心排程的最小單元,每乙個執行緒建立都會在核心例項出乙個thread_info結構體,結構體中有乙個task_struct結構體。這兩個結構體描述著執行緒的資訊。當中斷觸發排程時,schedule函式開始在幾種不同型別的執行緒之間進行排程選擇,在相同型別的執行緒之間進行排程演算法選擇。task_struct中描述著執行緒的型別,和排程方法,等各種資訊。
詳細可參考:
執行緒的優先順序決定著執行緒執行的順序,不同的執行緒優先順序與排程演算法不同。
實時排程演算法sched_fifo和sched_rr。使用top命令,如果pr列的值為rt,則說明該程序採用的是實時策略,即排程策略是sched_fifo或者為sched_rr,而對於非實時排程策略(比如sched_other)的程序,該列的值是ni+20,以供linux核心使用。我們可以通過命令:
ps -eo state,uid,pid,ppid,rtprio,time,comm
來檢視程序對應的實時優先順序(位於rtprio列下),如果有程序對應的列顯示「-」,則說明它不是實時程序。注意任何實時策略程序的優先順序都高於普通的程序,也就說實時優先順序和nice優先順序處於互不相交的兩個範疇。
先入先出排程策略(first in-first out scheduling)。該策略簡單的說就是一旦執行緒占用cpu則一直執行,一直執行直到有更高優先順序任務到達或自己放棄。
時間片輪轉排程(round-robin scheduling)。該策略是sched_fifo基礎上改進來的,他給每個執行緒增加了乙個時間片限制,當時間片用完後,系統將把該執行緒置於佇列末尾。放在佇列尾保證了所有具有相同優先順序的rr任務的排程公平。此排程會比普通程序的時間片要長。
大多數的普通程序,用的就是cfs演算法
實時執行緒的優先順序肯定高於普通執行緒。排程演算法會在執行佇列中先調取實時程序來執行,而後才輪到普通程序。我們可根據任務的型別選擇索要開創的執行緒是sched_fifo還是sched_rr或是乙個普通執行緒。
c語言**。c++的話可以自己去封裝乙個執行緒類
#include
#include
#include
#include
#include
#include
#include
void
*threadfun
(void*)
while(1
)return
nullptr;}
intmain()
while(1
)}
程式輸出(程式執行時要加 sudo)
the main init scheduler =
0// 主線程初始為乙個普通執行緒
get sched_priority is 99
the main scheduler =
0 the thread init scheduler =
2// 執行緒被我們以sched_rr策略建立
the thread scheduler =
1// 執行緒自己動態修改排程策略sched_fifo
the thread scheduler =
1 the main scheduler =
0 the thread scheduler =
1 the main scheduler =
0 the thread scheduler =
1
輸入ps -l 如下
ps命令各個引數的含有詳情可自己搜尋這裡只簡單介紹。此實驗使用
ps -l -p (檢視指定執行緒的資訊)
uid:啟動這些程序的使用者。
pid:程序的程序id。
ppid:父程序的程序號(圖中的終端就是bash,在此終端執行的程式的ppid都是他的pid:5644)。
c:程序生命週期中的cpu利用率。
stime:程序啟動時的系統時間。
tty:程序啟動時的終端裝置。
time:執行程序需要的累計cpu時間。
cmd:啟動的程式名稱。
f:核心分配給程序的系統標記。
s:程序的狀態(o代表正在執行;s代表在休眠;r代表可執行,正等待執行;z代表僵化,程序已結束但父程序已不存在;t代表停止)。
pri:程序的優先順序(越大的數字代表越低的優先順序)。
ni:謙讓度值用來參與決定優先順序。
addr:程序的記憶體位址。
sz:假如程序被換出,所需交換空間的大致大小。
wchan:程序休眠的核心函式的位址。
在linux系統中,nice值的範圍從-20到+19(不同系統的值範圍是不一樣的),正值表示低優先順序,負值表示高優先順序,值為零則表示不會調整該程序的優先順序。具有最高優先順序的程式,其nice值最低,所以在linux系統中,值-20使得一項任務變得非常重要;與之相反,如果任務的nice為+19,則表示它是乙個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的cpu時間的更大使用份額,這也就是nice的名稱的來意。
int
main()
// 暫停住程式
printf
("修改執行緒為實時執行緒\n");
getchar()
;// 修改 nice 值 -6
system
(comd2.
c_str()
);printf
("修改實時執行緒nice值為-6\n");
while
(true);
}
程式執行(必須有系統許可權):
程式輸出:
由此可看出,普通程序的nice值,過**中系統呼叫修改後可改變優先順序pri,但是實時程序修改nice值不改變。原因是因為程序不同優先順序演算法不同
使用者空間實現執行緒 核心實現執行緒 執行緒的排程
1 在使用者空間中實現執行緒 1 特點 把整個執行緒包放在使用者空間,核心對執行緒包一無所知。從核心角度考慮,就是按正常的方式管理,即單執行緒程序 存在執行時系統 2 優點 1 使用者級執行緒包可以在不支援執行緒的作業系統上實現。2 進而,它 可以呼叫執行緒排程程式來選擇另乙個要執行的執行緒 儲存該...
Linux核心執行緒實時獲取排程狀態的方法
最近在做專案中,需要執行緒實時的知道自身被sched out 和sched in.檢視了schedule 函式實現,發現核心提供了對應的notifier機制.schedule schedule context switch prepare task switch fire sched out pre...
linux核心排程演算法(3) 多核系統的負載均衡
多核cpu現在很常見,那麼問題來了,乙個程式在執行時,只在乙個cpu核上執行?還是交替在多個cpu核上執行呢?linux核心是如何在多核間排程程序的呢?又是核心又是cpu核,兩個核有點繞,下面稱cpu處理器來代替cpu核。實際上,如果你沒有對你的程序做過特殊處理的話,linux核心是有可能把它放到多...