程序內線程切換會觸發核心態與使用者態的切換嗎

時間 2021-06-06 08:08:15

1樓:圍軍兒

首先要了解,執行緒就是程序,就是建構函式(clone)的標誌位不太一樣而已,只是叫法不一樣,用的資料結構都是程序描述符,其實就是乙個東西。就好像黑馬、白馬一樣,沒有生殖隔離。

程序內線程切換,本質上還是程序切換。只要程序切換,就必然已經進入了核心態。道理很簡單,只有核心才有權力進行程序排程,而且程序排程涉及到資料結構,例如可排程程序的紅黑樹、亦或是阻塞程序的佇列集,也只有核心才有資格訪問。

時間片用完導致程序切換,想一想,是誰在統計、計算每個程序的時間片?當然是核心了,準確的說是時鐘排程程式,時鐘排程程式由時鐘硬體以固定的頻率觸發,每次觸發,CPU都會轉入核心態去呼叫時鐘排程程式,來更新系統時間、更新程序時間片,如果當前程序時間片用完了,就會讓紅黑樹裡的下乙個程序上位。

到這裡就非常清楚了,執行緒執行中->收到時鐘硬體中斷(忽略硬中斷處理程式)->切入核心態->檢查時間片(軟中斷處理程式),執行緒繼續執行->又收到時鐘硬體中斷->切入核心態->檢查時間片(時間片用完了,切換執行緒)->下乙個執行緒開始執行

2樓:小白龍

任務排程是作業系統核心的基本功能之一,切換執行緒的操作必然在核心空間內完成。從乙個執行緒換到另乙個執行緒的中間過程處於核心態,而這一切是時鐘中斷控制的。

3樓:DearFuture

所謂「時間片用完」,其實是指時鐘中斷發生(以某個固定頻率發生,由硬體自動觸發),中斷處理程式檢查當前執行緒設定的時間片是否到期,如果到期就發生執行緒切換。

執行緒切換的實現一般放在核心,中斷處理程式也是放在核心。從這個角度來說,如果執行緒當前處於使用者態,若要發生執行緒切換,必然是要先要先進入核心態,發生狀態切換的。執行緒切換的原因還可能是其他型別的中斷,或者執行緒自身主動進入等待或者睡眠,這些情況無一例外都是要進入核心的。

但是,如果執行緒當前就處於核心態,也一樣可能遇到中斷,或者主動進入等待或者睡眠,這時也一樣會發生執行緒切換,但就沒有發生核心態和使用者態的狀態切換了

總而言之,執行緒切換和狀態切換並沒有直接關聯,只不過執行緒切換一般都放到核心實現而已。當然,也還有所謂的使用者級執行緒,也就是在使用者態直接切換執行緒的棧和暫存器而已,這也無需切換到核心態

4樓:kaka

無論是程序還是執行緒,它們的切換都和「核心態與使用者態」沒有任何邏輯關係。乙個程序或執行緒如果用到了系統呼叫,在不做任何切換的時候都需要進入核心態。最簡單的例子:

比如乙個使用者態的程序呼叫printf函式,那麼當你看到螢幕上出現列印字元的時候,其實就已經進入了核心態了,因為printf功能的底層實現就是在核心程式中。

5樓:

Windows會。屬於第一種情況。Windows下每個執行緒都有乙個位於核心空間的ETHREAD結構對應。執行緒切換的時候需要用到這個結構,所以會進核心態。Linux不了解。

核心態執行緒切換代價 vs 程序切換代價?

碼農的荒島求生 程序切換與執行緒切換的乙個最主要區別就在於程序切換涉及到虛擬位址空間的切換而執行緒切換則不會。因為每個程序都有自己的虛擬位址空間,而執行緒是共享所在程序的虛擬位址空間的,因此同乙個程序中的執行緒進行執行緒切換時不涉及虛擬位址空間的轉換。舉乙個不太恰當的例子,執行緒切換就好比你從主臥走...

程序切換是個什麼概念?

碼農的荒島求生 程序切換與執行緒切換的乙個最主要區別就在於程序切換涉及到虛擬位址空間的切換而執行緒切換則不會。因為每個程序都有自己的虛擬位址空間,而執行緒是共享所在程序的虛擬位址空間的,因此同乙個程序中的執行緒進行執行緒切換時不涉及虛擬位址空間的轉換。舉乙個不太恰當的例子,執行緒切換就好比你從主臥走...

為什麼協程切換的代價比執行緒切換低

艦長 我覺得這個問題得換個問法,結合實際使用場景 協程一般拿來撐併發用,也就是說大部分情況下系統執行的協程數量遠大於核數,在沒有協程的年代用生產者消費者模式,乙個協程相當於那個模式中的乙個task的概念,只是資料儲存在了棧上。這樣兩個模式對比是有意義的,在bthread的M N模型中,協程也有佇列的...