2011-02-13 91 views
8

內核線程和用戶線程有什麼區別?內核線程是在內核模式下調度和執行的嗎?什麼是用於創建內核線程的技術?內核線程和用戶線程有什麼區別?

是用戶線程調度,在用戶模式下執行嗎?內核是否不參與執行/調度用戶線程?當執行用戶線程發生中斷時,誰來處理呢?

每當創建線程時都爲每個線程創建一個TCB。現在遇到用戶級線程 這個TCB是在用戶的地址空間創建的嗎?

如果在處理上下文切換的兩個用戶級別線程之間切換?

還有多線程模型的概念:

  1. 多對一
  2. 一對一
  3. 多對多。

這些模型是什麼?這些模型如何被實際使用?

讀了有關這個話題的幾篇文章,但仍是一頭霧水
想清除的概念..提前

感謝, Tazim

+0

標題'操作系統'並不真正符合你的要求。 – 2011-02-13 16:03:27

回答

5

內核線程和用戶線程有什麼區別?

內核線程有特權,可以訪問用戶模式線程的禁區。看看維基百科上的「Ring (Computer Security)」。在Windows上,用戶模式對應於Ring 3,而內核模式對應於Ring 0.

什麼是用於創建內核線程的技術?

這非常依賴操作系統。

現在遇到用戶級別的線程這個TCB是在用戶地址空間創建的嗎?

TCB記錄了內核在運行該線程時使用的線程信息,對不對?所以如果它被分配在用戶空間中,用戶模式線程可能會修改或損壞它,這似乎不是一個好主意。那麼,你不認爲它是在內核空間中創建的嗎?

這些模型是什麼?這些模型如何被實際使用?

Wikipedia看起來很清楚。

+1

「內核線程」通常用於指代「內核預定線程」,而不是內核空間中運行的線程。更重要的是,程序的正常線程在調用內核中的函數時可以通過上下文切換訪問內核數據等,從而使得您的答案大多無關緊要。 – MaHuJa 2011-08-09 14:32:19

+0

@MaHuJa請詳細說明我的答案中的任何內容是無意義的。 – Jeff 2011-08-11 18:20:53

0

本質上用戶線程在用戶與合適的特權級例如上下文中運行用戶線程肯定無法訪問內核級內存/數據結構/例程等。而內核線程在OS內核的上下文中運行,因此給予他們執行代碼的權限,這些代碼可以訪問低級內核例程/內存/數據結構。

1

內核線程表示內核負責調度的線程。這意味着,除其他外,內核能夠同時在不同的cpu /內核上安排每個線程。

如何使用它們改變了很多的編程語言和線程API,但作爲一個簡單的例子,

void task_a(); 
void task_b(); 
int main() { 
    new_thread(task_a); 
    new_thread(task_b); 
    // possibly do something else in the main thread 
    // wait for the threads to complete their work 
} 

在我所熟悉的每一個實現,內核可在任何時間暫停。 (「先發制人」)

用戶線程或「用戶調度線程」使程序本身負責在它們之間進行切換。有很多方法可以做到這一點,相應地,它們有各種各樣的名稱。

一方面你有「綠色線索」;基本上和內核線程做同樣的事情。因此,您可以通過真正的線程保留編程的所有複雜性。

在另一端,你有「光纖」,這是需要在任何其他光纖運行之前屈服。這意味着

  • 纖維按順序運行。沒有平行的性能收益。
  • 纖維之間的相互作用是非常明確的。其他代碼只在您產生的確切點上運行。其他代碼在您處理它們時不會改變變量。
  • 大多數低級複雜程序員在多線程中苦苦掙扎,如緩存一致性(查看本網站上的MT問題,大多數人都沒有這樣做)並不是一個因素。

正如我能想到的纖維最簡單的例子:

while(tasks_not_done) { 
    do_part_of_a(); 
    do_part_of_b(); 
} 

其中每個做了一些工作,那麼當這部分完成返回。請注意,這些是在相同的「硬件線程」中順序完成的,這意味着您不會從並行性中獲得性能提升。另一方面,它們之間的相互作用是非常明確的,所以你沒有競爭條件。每個功能的實際工作可能會有所不同。它們也可以是來自某個vector/array的「用戶線程對象」。

相關問題