學os的時候經常講到處理機(即cpu)的排程也即任務的排程,現如今與linux的核心**聯絡起來。
理解處理機排程要回答3個問題:
1> 排程的時機
2> 排程的策略
3> 排程的實現
高階排程: 為任務建立pcb,裝入記憶體
中級排程: 為提高吞吐量和利用率,將任務臨時換出記憶體(swap)
低階排程: 程序排程,為程序分配cpu
考慮的因素:
公平 資源利用率 響應時間 周轉時間 吞吐量
排程的策略:
fifo, 時間片輪轉, 優先權排程(可搶占/不可搶占), 多級反饋帶優先順序的時間片輪轉, 實時排程
程序的狀態
running (ready or running on cpu)
blocked (interruptable or uninterruptable)
stopped
程序排程的時機
1. 程序退出(正常退出或者因錯退出)
2. 程序blocked(等待資源,呼叫訊號量等都是設定為interruptable 或 uninterruptable, 然後主動呼叫schedule。程序被喚醒時只更新running佇列,不進行排程)
3. 時間片到(實質也是中斷程式返回時呼叫schedule)
4. 新建立高優先順序程序(本質為系統呼叫返回)
5. 程序呼叫sleep睡眠(設定為task_uninterruptible,然後schedule)
從中斷、異常以及系統呼叫返回時呼叫ret_from_sys_call,會檢測排程標識決定是否要排程。因為核心態和使用者態之間的切換需要開銷,所以返回前把可以做的都做掉。
任務結構中對應排程的字段為:
need_resched:如果schedule()函式需要在下次喚醒,則設定本欄位。
counter:到下次執行排程時間片剩餘的時間嘀噠,由定時器遞減。當這個欄位的值小於或者等於零時,它被重置為零,同時設定p->need_resched。由於這個可以被程序自身修改,有時也稱之為「動態優先順序」。
priority:程序的靜態優先順序,僅能被系統呼叫如nice函式,posix.1b 的sched_setparam函式,4.4bsd/svr4 的setpriority函式修改。
rt_priority:實時優先權。
policy: 排程策略,指定任務所屬的排程種類,任務可以通過呼叫sched_setscheduler函式修改它。有效的值為 sched_other (傳統unix程序),sched_fifo (posix.1b的fifo 實時程序)和sched_rr (posix迴圈實時程序)。如果要標識程序繫結到某個cpu,則可以將sched_yield與其他任何值「或」操作。
什麼時候設定need_resched呢?乙個主要地方是在時鐘中斷中。時鐘中斷中會呼叫update_process_times,會設定程序的need_sched標識。時鐘中斷不會呼叫schedule,而是中斷返回的時候統一呼叫。
程序排程之schedule
遮蔽了具體的排程演算法,具體的排程演算法在冰山之下 schedule preempt disable cpu smp processor id rq cpu rq cpu rcu sched qs cpu prev rq curr switch count prev nivcsw if prev s...
程序 執行緒 排程 schedule
預備知識 在併發體系中,i o幾乎是不消耗cpu資源的。當i o完成之後會通過dma direct memory access 通知cpu。這個時候cpu完成上下文切換,執行接下來的程序。由於cpu的發展比磁碟的改進快很多,所以接下來的程序會越來越傾向於i o密集型。兩種排程演算法 非搶占式演算法挑...
oracle排程中使用schedule管理排程
開始前,先說一句 作為dba應該禁止所有應用使用dbms job。dbms scheduler非常複雜,oracle在兩本書中專門花費不少章節描述,這兩本書分別是 oracle database pl sql packages and types reference oracle database ...