第八週 進程的切換和系統的通常執行過程
1、進程切換的關鍵代碼switch_to分析
1.進程調度與進程調度的時機分析linux
不一樣類型的進程有不一樣的調度需求算法
第一種分類:shell
- I/O-bound:頻繁進行I/O,花費很長時間等待I/O
- CPU-bound:計算密集型,須要大量CPU時間進行計算
第二種分類:架構
- 批處理進程:沒必要交互、很快響應
- 實時進程:要求響應時間短
- 交互式進程(shell)
調度策略:是一組規則,它們決定何時以怎樣的方式選擇一個新進程運行。函數
- Linux的進程根據優先級排隊
- Linux中進程的優先級是動態的
操做系統原理中介紹了大量進程調度算法,這些算法從實現的角度看僅僅是從運行隊列中選擇一個新進程,選擇的過程當中運用了不一樣的策略而已。操作系統
2.進程調度的時機:線程
- 中斷處理過程(包括時鐘中斷、I/O中斷、系統調用和異常)中,直接調用schedule(),或者返回用戶態時根據need_resched標記調用schedule();
- 內核線程(只有內核態沒有用戶態的特殊進程)能夠直接調用schedule()進行進程切換,也能夠在中斷處理過程當中進行調度,也就是說內核線程做爲一類的特殊的進程能夠主動調度,也能夠被動調度;
- 用戶態進程沒法實現主動調度,只能被動調度,僅能經過陷入內核態後的某個時機點進行調度,即在中斷處理過程當中進行調度。
3.進程的切換rest
- 爲了控制進程的執行,內核必須有能力掛起正在CPU上執行的進程,並恢復之前掛起的某個進程的執行,這叫作進程切換、任務切換、上下文切換;
- 掛起正在CPU上執行的進程,與中斷時保存現場是不一樣的,中斷先後是在同一個進程上下文中,只是由用戶態轉向內核態執行;
- 進程上下文包含了進程執行須要的全部信息
- 用戶地址空間:包括程序代碼,數據,用戶堆棧等
- 控制信息:進程描述符,內核堆棧等
- 硬件上下文(注意中斷也要保存硬件上下文只是保存的方法不一樣)
- schedule()函數選擇一個新的進程來運行,並調用
context_switch
進行上下文的切換,這個宏調用switch_to
來進行關鍵上下文切換
- next = pick_ next_task(rq, prev);//進程調度算法都封裝這個函數內部
- context_switch(rq, prev, next);//進程上下文切換
- switch_to利用了prev和next兩個參數:prev指向當前進程,next指向被調度的進程
2、Linux系統的通常執行過程
3、Linux系統架構和執行過程概覽
實驗:
1.和上一個實驗同樣,下載新的menu
2.設置斷點
3.單步追蹤