20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
第八周 進程的切換和系統的一般執行過程
一、進程切換關鍵代碼switch_to
1.不同類型進程有不同調度需求——兩種分類
2.調度策略——規則
- Linux中進程優先級是動態的,周期性調整。
3.時機
schedule()函數負責調度。
中斷處理過程(包括時鐘中斷、I/O中斷、系統調用和異常)中,直接調用schedule(),或者返回用戶態時根據need_resched標記調用schedule();
內核線程可以直接調用schedule()進行進程切換,也可以在中斷處理過程中進行調度,也就是說內核線程作為一類的特殊的進程可以主動調度,也可以被動調度;
用戶態進程無法實現主動調度,僅能通過陷入內核態后的某個時機點進行調度,即在中斷處理過程中進行調度。
4.進程上下文包含了進程執行需要的所有信息
用戶地址空間:包括程序代碼,數據,用戶堆棧等
控制信息:進程描述符,內核堆棧等
硬件上下文(與中斷保存硬件上下文的方法不同)
5.switch_to 切換寄存器的狀態
schedule()函數選擇一個新的進程來運行,調用switch_to來進行關鍵上下文切換
schedule() --> context_switch() --> switch_to --> __switch_to()當schedule()需要暫停X進程的執行而繼續Y進程的執行時,就發生了進程之間的切換。
- 進程切換主要有兩部分:1、切換全局頁表項;2、切換內核堆棧和硬件上下文。
switch_to時請注意:這是一個宏,不是函數。
- 不是通過普通的call來實現,而是直接jmp,函數參數也并不是通過堆棧來傳遞,而是通過寄存器來傳遞。
二、Linux系統的一般執行過程
1.從正在運行的用戶態進程X到Y
X正在運行--->發生中斷,可能陷入內核,CPU自動保存加載--->SAVE_ALL保存現場--->調用schedule,switch_to進程上下文切換--->標號1之后運行Y(之前有進行準備動作)--->restore_all恢復現場--->iret- pop cs:eip/ss:esp/eflags from kernel stack--->繼續運行用戶態進程Y2.特殊情況
通過中斷處理過程中的調度時機,用戶態進程與內核線程之間互相切換和內核線程之間互相切換,與最一般的情況非常類似,只是內核線程運行過程中發生中斷沒有進程用戶態和內核態的轉換;
內核線程主動調用schedule(),只有進程上下文的切換,沒有發生中斷上下文的切換,與最一般的情況略簡略;
創建子進程的系統調用在子進程中的執行起點及返回用戶態,如fork;
加載一個新的可執行程序后返回到用戶態的情況,如execve;
3.內核——Taxi
- 內核地址空間的4G中3G以上是內核態可以訪問的——是所有進程共享的。
三、Linux系統架構和執行過程
1.執行ls命令
- 涉及中斷、終端控制臺設備驅動的概念。
過程:
shell分析-->調用系統調用fork生成一個shell本身拷貝-->調用exec系統調用將ls可執行文件裝入內存-->從系統調用返回
四、實踐
schedule()函數選擇一個新的進程來運行,并調用context_switch進行上下文的切換,context_switch是一個宏,這個宏調用switch_to()函數來進行關鍵上下文切換
next = pick_next_task(rq, prev); //進程調度算法都封裝這個函數內部
context_switch(rq, prev, next); //進程上下文切換
switch_to利用了prev和next兩個參數:prev指向當前進程,next指向被調度的進程
總結
linux系統的一般執行過程
X正在運行--->發生中斷,可能陷入內核,CPU自動保存加載--->SAVE_ALL保存現場--->調用schedule,switch_to進程上下文切換--->標號1之后運行Y(之前有進行準備動作)--->restore_all恢復現場--->iret- pop cs:eip/ss:esp/eflags from kernel stack--->繼續運行用戶態進程Y轉載于:https://www.cnblogs.com/zzzz5/p/5381424.html
總結
以上是生活随笔為你收集整理的20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 期中界面设计小作业
- 下一篇: linux 其他常用命令