各個行程之間是共享 CPU 資源的,在不同的時候行程之間需要切換,讓不同的行程可以在 CPU 執行,那么這個一個行程切換到另一個行程運行,稱為行程的背景關系切換,
行程是由內核管理和調度的,所以行程的切換只能發生在內核態,
所以,行程的背景關系切換不僅包含了虛擬記憶體、堆疊、全域變數等用戶空間的資源,還包括了內核堆疊、暫存器等內核空間的資源,
大家需要注意,行程的背景關系開銷是很關鍵的,我們希望它的開銷越小越好,這樣可以使得行程可以把更多時間花費在執行程式上,而不是耗費在背景關系切換,
發生行程背景關系切換有哪些場景?
1. 為了保證所有行程可以得到公平調度,CPU 時間被劃分為一段段的時間片,這些時間片再被輪流分配給各個行程,這樣,當某個行程的時間片耗盡了,就會被系統掛起,切換到其它正在等待 CPU 的行程運行;
2. 行程在系統資源不足(比如記憶體不足)時,要等到資源滿足后才可以運行,這個時候行程也會被掛起,并由系統調度其他行程運行;
3. 當行程通過睡眠函式 sleep 這樣的方法將自己主動掛起時,自然也會重新調度;
4. 當有優先級更高的行程運行時,為了保證高優先級行程的運行,當前行程會被掛起,由高優先級行程來運行;
5. 發生硬體中斷時,CPU 上的行程會被中斷掛起,轉而執行內核中的中斷服務程式;
下面這個行程是php運行的其中存在sleep函式
查看到的行程切換如下
pidstat -w -p 行程PID 1 10
cswch/s 每秒有10次的主動切換 , 耗費資源比較多

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/6577.html
標籤:PHP
上一篇:laravel 資料庫遷移時報錯
