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