1、概述
check_preempt_tick的作用是根據當前程序已經執行的時間,判斷是否需要將程序thread info結構體的flag通過resched_curr設定為tif_need_resched。這樣在執行完本次時鐘中斷後(即從handle irq返回後),根據需要進行重新排程。
2、對該函式的理解
此函式共有4個返回的地方,從前到後依次說明:
(1)執行超時了,設定tif_need_resched。
實際執行時間大於理論執行時間,即delta_exec> ideal_runtime。
(2)在(1)不成立時,實際執行時間不大於理論執行時間,但是實際執行時間小於系統最小的執行時間,不設定tif_need_resched。
即delta_exec < sysctl_sched_min_granularity
(3)在(1)(2)不成立時,cfs_rq中沒有比當前程序vruntime更小的程序
即if (delta
< 0),我認為這裡寫成小於等於號更合適。
(4)在(1)(2)(3)不成立時,cfs_rq 中有比當前程序的vruntime更小的程序(有高優先順序的程序),兩個vruntime的差值如果大於當前程序的理論執行時間,設定tif_need_resched。這塊我也沒理解,以一種我可以理解的方式記錄一下吧。
舉例:假設當前程序的vruntime為8,因為 curr->vruntime - se->vruntime > 0,所以cfs_rq中必然存在乙個小於8的vruntime,假設為2
由於(1)不成立,所以delta_exec(實際執行時間) < ideal_runtime(理論執行時間),當前程序還想繼續執行一會兒。
ideal_runtime<8-2,則設定tif_need_resched,ideal_runtime >= (8-2), 則不設定tif_need_resched。
即: 8-ideal_runtime > 2,設定tif_need_resched。即當前程序的vruntime減去理論執行時間大於最小的vruntime,(有資料說,已經多執行了乙個週期)。
搶占式排程與非搶占式排程
資料 這是本人在作業系統期中考試前複習是碰到的問題,花了一些時間解決,現在記錄下來。在學習 cpu 排程的時候,關於搶占式 非搶占式排程方式有不理解的地方,想不到google一下就出來了很好的解釋,看來還是要多搜尋多思考。cpu 排程決策可以在如下四種環境下發生 對於第1和第4兩種情況,沒有選擇只有...
搶占程序排程的原則
1 時間片原則 各程序按系統分配給的乙個時間片執行,當該時間片用完或由於該程序等待某事件發生而被阻塞時,系統就停止該程序的執行而重新進行排程。2 優先順序原則 每個程序均賦於乙個排程優先順序,通常一些重要和緊急的程序賦於較高的優先順序。當乙個新的緊迫程序到達時,或者乙個優先順序高的程序從阻塞狀態變成...
執行緒的排程有搶占式或者非搶占
在乙個程序裡,執行緒的排程有搶占式或者非搶占的模式。在搶占模式下,作業系統負責分配 時間給各個程序,一旦當前的程序使用完分配給自己的 時間,作業系統將決定下乙個占用 時間的是哪乙個執行緒。因此作業系統將定期的中斷當前正在執行的執行緒,將 分配給在等待佇列的下乙個執行緒。所以任何乙個執行緒都不能獨佔 ...