5.3.5程序排程的實現
排程程式在核心中就是乙個函式,為了討論方便,我們同樣對其進行了簡化,略其對smp的實現部分。
asmlinkage void schedule(void)
release_kernel_lock(prev, this_cpu); /*釋放全域性核心鎖,
並開this_cpu的中斷*/
spin_lock_irq(&runqueue_lock); /*鎖住執行佇列,並且同時關中斷*/
if (prev->policy == sched_rr) /*將乙個時間片用完的sched_rr實時
goto move_rr_last; 程序放到佇列的末尾 */
move_rr_back:
switch (prev->state)
default: /*如果為可中斷的等待狀態或僵死狀態*/
del_from_runqueue(prev); /*從執行佇列中刪除*/
case task_running:;/*如果為可執行狀態,繼續處理*/
}prev->need_resched = 0;
/*下面是排程程式的正文 */
repeat_schedule: /*真正開始選擇值得執行的程序*/
next = idle_task(this_cpu); /*預設選擇空閒程序*/
c = -1000;
if (prev->state == task_running)
goto still_running;
still_running_back:
list_for_each(tmp, &runqueue_head)
} /* 如果c為0,說明執行佇列中所有程序的權值都為0,也就是分配給各個程序的
時間片都已用完,需重新計算各個程序的時間片 */
if (!c)
spin_unlock_irq(&runqueue_lock);/*對執行佇列解鎖,並開中斷*/
if (prev == next)
/* 下面開始進行程序切換*/
kstat.context_swtch++; /*統計上下文切換的次數*/
else
if (!prev->mm)
}switch_to(prev, next, prev); /*程序的真正切換,即堆疊的切換*/
__schedule_tail(prev); /*置prev->policy的sched_yield為0 */
same_process:
reacquire_kernel_lock(current);/*針對smp*/
if (current->need_resched) /*如果排程標誌被置位*/
goto need_resched_back; /*重新開始排程*/
return;
}以上就是排程程式的主要內容,為了對該程式形成乙個清晰的思路,我們對其再給出進一步的解釋:
· 如果當前程序既沒有自己的位址空間,也沒有向別的程序借用位址空間,那肯定出錯。另外, 如果schedule()在中斷服務程式內部執行,那也出錯.
· 對當前程序做相關處理,為選擇下乙個程序做好準備。當前程序就是正在執行著的程序,可是,當進入schedule()時,其狀態卻不一定是task_runnig,例如,在exit()系統呼叫中,當前程序的狀態可能已被改為task_zombe;又例如,在wait4()系統呼叫中,當前程序的狀態可能被置為task_interruptible。因此,如果當前程序處於這些狀態中的一種,就要把它從執行佇列中刪除。
· 從執行佇列中選擇最值得執行的程序,也就是權值最大的程序。
· 如果已經選擇的程序其權值為0,說明執行佇列中所有程序的時間片都用完了(佇列中肯定沒有實時程序,因為其最小權值為1000),因此,重新計算所有程序的時間片,其中巨集操作nice_to_ticks就是把優先順序nice轉換為時鐘滴答。
· 程序位址空間的切換。如果新程序有自己的使用者空間,也就是說,如果next->mm與next->active_mm相同,那麼,switch_mm( )函式就把該程序從核心空間切換到使用者空間,也就是載入next的頁目錄。如果新程序無使用者空間(next->mm為空),也就是說,如果它是乙個核心執行緒,那它就要在核心空間執行,因此,需要借用前乙個程序(prev)的位址空間,因為所有程序的核心空間都是共享的,因此,這種借用是有效的。
· 用巨集switch_to()進行真正的程序切換,後面將詳細描述。
程序管理和排程 排程器的實現
2.5 排程器的實現 記憶體中儲存了對每個程序的唯一描述,並通過若干結構域其他程序鏈結起來。排程器面對的情形就是這樣,器任務是在程式之間共享cpu時間,創造並行執行的錯覺。正如以上的討論,改任務分為兩個不同部分 乙個設計排程策略,另乙個設計上下文切換 2.5.1 概觀 核心必須提供一種方法,在各個程...
程序排程 模擬程序排程的過程
通過這次實驗,理解程序排程的過程,進一步掌握程序狀態的轉變 程序排程的策略,進一步體會多道程式併發執行的特點,並分析具體的排程演算法的特點,掌握對系統效能的評價方法。編寫程式模擬實現程序的輪轉法排程過程,模擬程式只對pcb進行相應的排程模擬操作,不需要實際程式。假設初始狀態為 有n個程序處於就緒狀態...
程序排程實現 C語言
程序排程實現 c語言 本程式主要來自但是鏈結裡的短程序優先排程演算法有些錯誤實現不了,這是我修改後的程式,裡面也有c 語言。去部落格設定頁面,選擇一款你喜歡的 片高亮樣式,下面展示同樣高亮的 片.include include include using namespace std struct n...