2013-07-07 52 views
3

線程在用戶模式下運行並在內核模式下運行時,我們指的是什麼?這是否與來自用戶模式的線程執行指令和來自內核模式的線程執行指令相關?請詳細說明。 另外,如果一個線程在用戶模式下執行被置於掛起狀態,那麼它可能會開始在內核模式下執行?如果是,那怎麼可能?到目前爲止,我只知道一個線程如果被掛起將會被完全掛起,即上下文切換將由CPU進行以調度另一個線程。用戶和內核模式中的線程

+2

不幸的是,術語「用戶模式線程」或「內核模式線程」在多個上下文中有多個定義。例如,「用戶模式線程」可能表示由用戶空間調度程序調度的線程,也可能表示在用戶空間中運行的線程。 –

+0

在這種情況下,我的問題是這兩種模式是什麼?它們如何不同以及它們包含什麼? –

回答

2

線程在用戶模式下運行並在內核模式下運行是什麼意思?

沒有辦法知道一個人沒有語境的短語是什麼意思。如果我不得不猜測,我會說他們正在討論線程是由用戶空間調度程序還是由內核調度程序調度的。但也有可能他們實際上在詢問線程是否正在運行用戶代碼或內核代碼。

這是與來自用戶模式的線程執行指令和來自內核模式的線程執行指令有關嗎?請詳細說明。

它可能是。它也可能不是。沒有辦法通過沒有語境的短語知道一個人的意思。

另外,如果一個線程在用戶模式下執行被置於掛起狀態,那麼它可能開始在內核模式下執行?如果是,那怎麼可能?

對於內核調度線程的實現,調度器正在內核空間中運行。實際掛起線程的代碼通常也運行在內核空間中,因爲它必須將線程添加到各種內核調度程序數據結構中。因此,恢復線程的線程也將在內核空間中運行。在更高級別的視圖中,相同的執行線程可以「成爲」內核調度程序,選擇要執行的用戶空間線程,然後「變爲」該線程。

到目前爲止,我只知道一個線程(如果掛起)將被完全掛起,即上下文切換將由CPU執行以調度另一個線程。

對,這是內核代碼。因此,相同的核心運行用戶空間代碼,然後運行內核代碼,然後運行另一個線程的用戶空間代碼。

+0

感謝大衛的迴應。我很抱歉這個懸掛的情況。 現在,閱讀你的回覆後,我的問題是這兩種模式是什麼?它們如何不同以及它們包含什麼? 考慮到我的上下文與用戶模式同步和內核模式同步有關。爲什麼會這樣,因爲有些博客說當在用戶模式下執行它的速度比內核模式更快,並且在切換這些模式時需要一些時間。 所以問題是,爲什麼這兩種模式,它們包含什麼以及地址空間中的哪兩部分代碼被加載。 –

0

現代操作系統具有將用戶代碼與內核代碼分離的硬件支持。在x86架構上,您可以設置普通用戶代碼無法訪問的內存頁面,並且會觸發頁面錯誤,以便操作系統能夠在發生故障的程序中存活。

在內核模式下運行的代碼具有更高的權限,但也有更多的責任,因爲並非所有的東西都像用戶空間那樣容易訪問。如果用戶代碼卡住了,那麼操作系統可以清理它。如果內核模式代碼掛起,可能並不那麼容易,具體取決於特權級別有多高。

+0

但我仍然對兩個代碼的切換感到困惑...請參考我的問題的第二部分... –

+0

正如我所說的,細節是硬件特定的。對於X86架構,通常內核應該運行在擁有最高權限的環0中。用戶代碼在環3中運行。在Windows AFAIK環1,2中未使用IMO。保護通過具有控制結構來實施,該結構告訴CPU允許哪個特權級別。這可能包括禁止各種指令以及內存保護。有關如何打開X86架構的詳細說明,您應該使用Google進行「保護模式切換」或參閱英特爾編程人員手冊。 – Devolus

+0

嗨Devolus, 感謝您的解釋。但混亂仍然存在。 –

相關問題