CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)
CPU寄存器,與程序計(jì)數(shù)器(存儲(chǔ)CPU正在執(zhí)行的指令位置,或者即將執(zhí)行的下一條指令的位置)共同組成CPU上下文。
CPU上下文切換指的是:把前一個(gè)任務(wù)的CPU上下文保存起來(lái),然后加載新任務(wù)的上下文到這些寄存器和程序計(jì)數(shù)器上,最后再跳轉(zhuǎn)到程序計(jì)數(shù)器所指的新位置,運(yùn)行新的任務(wù)。被保存下來(lái)的上下文會(huì)存儲(chǔ)在系統(tǒng)內(nèi)核中,等任務(wù)重新調(diào)度執(zhí)行時(shí)再次加載進(jìn)來(lái)。
根據(jù)任務(wù)的不同,CPU的上下文切換可以分為幾個(gè)不同場(chǎng)景(進(jìn)程上下文切換、線程上下文切換、中斷上下文切換)
進(jìn)程上下文切換
系統(tǒng)調(diào)用:
已知進(jìn)程運(yùn)行空間分為內(nèi)核空間和用戶(hù)空間。內(nèi)核空間可以訪問(wèn)所有資源,用戶(hù)空間只能訪問(wèn)受限資源,不能訪問(wèn)內(nèi)存等硬件設(shè)備。
從用戶(hù)態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變需要通過(guò)系統(tǒng)調(diào)用來(lái)完成。如open、read、write、close等對(duì)于文件的操作都屬于系統(tǒng)調(diào)用。
系統(tǒng)調(diào)用的過(guò)程中會(huì)發(fā)生CPU上下文切換,先切換到內(nèi)核態(tài),執(zhí)行內(nèi)核態(tài)代碼,再跳轉(zhuǎn)回用戶(hù)態(tài)代碼。所以一次系統(tǒng)調(diào)用會(huì)發(fā)生兩次CPU上下文切換,又稱(chēng)特權(quán)模式切換,不過(guò)仍然是同一個(gè)進(jìn)程在運(yùn)行。
進(jìn)程上下文切換性能問(wèn)題:
進(jìn)程由內(nèi)核管理和調(diào)度,進(jìn)程的切換只能發(fā)生在內(nèi)核態(tài),進(jìn)程上下文不僅包括虛擬內(nèi)存、棧、全局變量等用戶(hù)空間資源,還包括內(nèi)核堆棧、寄存器等內(nèi)核空間狀態(tài)。每次進(jìn)程上下文切換需要幾十納秒到數(shù)微秒的CPU時(shí)間。
并且Linux通過(guò)TLB來(lái)管理虛擬內(nèi)存到物理內(nèi)存之間的映射,當(dāng)虛擬內(nèi)存更新后,TLB也需要刷新,內(nèi)存的訪問(wèn)也會(huì)隨之變慢。特別在多處理器系統(tǒng)上,緩存被多個(gè)處理器共享,刷新緩存不僅會(huì)影響當(dāng)前處理器的進(jìn)程,還會(huì)影響共享緩存的其他處理器的進(jìn)程。
進(jìn)程上下文切換發(fā)生的時(shí)機(jī):
在進(jìn)程調(diào)度的時(shí)候,需要進(jìn)行切換上下文。Linux為每個(gè)CPU維護(hù)一個(gè)就緒隊(duì)列,將活躍進(jìn)程(正在運(yùn)行和正在等待CPU的進(jìn)程)
按照優(yōu)先級(jí)和等待CPU的時(shí)間來(lái)排序,然后選擇最需要CPU的進(jìn)程運(yùn)行。(優(yōu)先級(jí)高和等待時(shí)間長(zhǎng)的進(jìn)程)
1、CPU時(shí)間被劃分為一段段時(shí)間片,當(dāng)某個(gè)進(jìn)程的時(shí)間片耗盡,就會(huì)被系統(tǒng)掛起,切換到其他正在等待的進(jìn)程
2、進(jìn)程在系統(tǒng)資源不足時(shí),要等到資源滿(mǎn)足后才可以運(yùn)行,此時(shí)這個(gè)進(jìn)程也會(huì)被掛起,CPU讓給其他進(jìn)程
3、進(jìn)程通過(guò)sleep睡眠函數(shù)主動(dòng)掛起,CPU讓給其他進(jìn)程
4、當(dāng)有優(yōu)先級(jí)更高的進(jìn)程運(yùn)行,當(dāng)前進(jìn)程會(huì)被掛起
5、發(fā)生硬件中斷,CPU進(jìn)程會(huì)被中斷掛起,執(zhí)行內(nèi)核中的中斷服務(wù)程序
進(jìn)程上下文切換
線程是調(diào)度的基本單位,而進(jìn)程是資源擁有的基本單位。當(dāng)進(jìn)程中只有一個(gè)線程時(shí),可以認(rèn)為進(jìn)程就等于線程。
當(dāng)進(jìn)程擁有多個(gè)線程時(shí),這些線程會(huì)共享相同的虛擬內(nèi)存和全局變量等資源。
線程主要就是私有數(shù)據(jù)、棧和寄存器等資源。
線程上下文切換分為兩種情況:
1、兩個(gè)線程屬于不同線程,資源不共享,所以等同于進(jìn)程上下文切換
2、兩個(gè)線程屬于同一個(gè)進(jìn)程,只需要切換私有數(shù)據(jù)、寄存器等不共享的數(shù)據(jù)
中斷上下文切換
與系統(tǒng)調(diào)用不同,中斷上下文切換不涉及進(jìn)程的用戶(hù)態(tài)。所以中斷過(guò)程打斷了一個(gè)正處于用戶(hù)態(tài)的進(jìn)程,也不需要保存和恢復(fù)這個(gè)進(jìn)程的虛擬內(nèi)存、全局變量等用戶(hù)資源。它只包括內(nèi)核態(tài)中斷服務(wù)程序執(zhí)行所必須的狀態(tài):CPU寄存器、內(nèi)核堆棧、硬件中斷參數(shù)
總結(jié)
以上是生活随笔為你收集整理的CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从uptime、stress、mpsta
- 下一篇: 求妖精的尾巴补丁。就是后面一个翅膀。一飞