進程調度的時機
- 中斷處理過程(包括時鐘中斷嗓蘑、I/O中斷塘砸、系統(tǒng)調用和異常)中扼倘,直接調用schedule()遇绞,或者返回用戶態(tài)時根據(jù)need_resched標記調用schedule()嗓奢;
- 內核線程可以直接調用schedule()進行進程切換讼撒,也可以在中斷處理過程中進行調度,也就是說內核線程作為一類的特殊的進程可以主動調度股耽,也可以被動調度根盒;
- 用戶態(tài)進程無法實現(xiàn)主動調度,僅能通過陷入內核態(tài)后的某個時機點進行調度物蝙,即在中斷處理過程中進行調度
scheduel()函數(shù)分析
首先找到schedule()函數(shù)
在scheduel()中調用了_scheduel()
略過檢查炎滞、統(tǒng)計、上鎖等操作
直接看最關鍵部分的代碼
2824行 從隊列中取出下一個可運行的進程
接下來調用context_switch來進行實際的上下文切換诬乞。它是理解進程的切換的核心册赛。它又調用switch_to來進行關鍵上下文切換。
找到switch_to 的代碼
仔細閱讀可以發(fā)現(xiàn)這和我們之前My_kernel實驗中的代碼十分相似
接下來用gdb跟蹤schedule
跟蹤過程中發(fā)生了一個意料之外的事情震嫉,進去_schedule中時森瘪,代碼會先跳到context_switch 那里按n后又在__schedule開頭處開始執(zhí)行。
老師提供了一個ls的例子對于理解Linux的一般執(zhí)行過程很有幫助