各個程序之間是共享 CPU 資源的,在不同的時候程序之間需要切換,讓不同的程序可以在 CPU 執行,那麼這個一個程序切換到另一個程序運作,稱為程序的上下文切換。
程序是由核心管理和排程的,是以程序的切換隻能發生在核心态。
是以,程序的上下文切換不僅包含了虛拟記憶體、棧、全局變量等使用者空間的資源,還包括了核心堆棧、寄存器等核心空間的資源。
大家需要注意,程序的上下文開銷是很關鍵的,我們希望它的開銷越小越好,這樣可以使得程序可以把更多時間花費在執行程式上,而不是耗費在上下文切換。
發生程序上下文切換有哪些場景?
1. 為了保證所有程序可以得到公平排程,CPU 時間被劃分為一段段的時間片,這些時間片再被輪流配置設定給各個程序。這樣,當某個程序的時間片耗盡了,就會被系統挂起,切換到其它正在等待 CPU 的程序運作;
2. 程序在系統資源不足(比如記憶體不足)時,要等到資源滿足後才可以運作,這個時候程序也會被挂起,并由系統排程其他程序運作;
3. 當程序通過睡眠函數 sleep 這樣的方法将自己主動挂起時,自然也會重新排程;
4. 當有優先級更高的程序運作時,為了保證高優先級程序的運作,目前程序會被挂起,由高優先級程序來運作;
5. 發生硬體中斷時,CPU 上的程序會被中斷挂起,轉而執行核心中的中斷服務程式;
下面這個程序是php運作的其中存在sleep函數
檢視到的程序切換如下
pidstat -w -p 程序PID 1 10