3

什麼是用戶線程?下面的解釋說,他們是由用戶空間管理...請解釋如何?什麼是用戶線程?

線程有時在用戶空間庫中實現,因此稱爲用戶線程。內核不知道它們,所以它們在用戶空間中進行管理和調度。

+0

看來,這是更多的http://www.superuser.com一個問題,因爲有一個在這個問題沒有直接的聯繫,以編程的任何地方。 – Darhuuk 2011-04-21 13:48:37

+1

用戶不處理庫,線程或內核;聽起來像是一個架構問題! – 2011-04-21 13:50:28

回答

4

如今,每個現代服務器或臺式機操作系統以及所有主要的移動操作系統都有一個本地線程庫,所以這個問題不再相關。但基本上,在這種情況出現之前,有一些圖書館 - 最着名的是「綠色線程庫」 - 它實現了協作 - 多任務線程作爲用戶庫。這種「協作式多任務」部分是重要的部分:通常,只有當線程調用某種允許切換髮生的方法(「睡眠」,「良率」等)時,這種庫才從一個線程切換到另一個線程。用戶庫一般不能做搶先時間切片;這是必須在操作系統級別完成的。

+1

「用戶庫通常不能搶佔時間片」 - 雖然字節碼解釋器可以在一定數量的指令之後產生,或者JIT可以將良率調用插入到其發出的代碼中,以給予先佔權和防止佔用CPU的計算密集線程。 – 2011-04-21 14:01:38

+0

事實上 - 然後每個字節碼實際上是那些可能產生函數調用之一。 – 2011-04-21 14:03:59

+1

是的,代碼沒有選擇*不*合作多任務。我只是提到它,因爲它意味着綠色線程可以比人們可能聽說過的關於合作多任務的恐怖故事更好地工作。至少在虛擬機使用的本地庫需要很長時間才能完成的地方。 – 2011-04-21 14:04:46

0

內核線程(也稱爲輕量級進程)由系統handeled 。它們提供了一些有趣的好處,主要的好處是可以在兩個不同的處理器上安排兩個線程,希望這會減少進程的執行時間。

但是線程經常被用作編程模型。一個典型的例子是一個多客戶端網絡服務器,它等待傳入連接並同時與其連接的客戶端交換數據。在這種情況下,程序員可能希望創建一個線程批次,並在其間快速切換。系統線程不太適應這一點。內核線程的數量是有限的(很少有未讀),任何基本操作(創建銷燬切換鎖定)都是昂貴的,因爲它必須在內核空間中執行。

另一方面,用戶線程可以在用戶庫內使用set_jmp()long_jmp()來實現。由於它們不涉及內核,因此應用程序可以非常高效地創建/銷燬並在用戶線程之間切換。

正如Ernest所說,用戶線程不再是很常見,但是存在可以利用兩個世界的混合解決方案。

http://en.wikipedia.org/wiki/Thread_(computer_science)#N:M_.28Hybrid_threading.29

+1

單獨使用SJLJ不能實現用戶線程,因爲它們只能在單個堆棧上工作。你至少需要一些機器特定的代碼(或醜陋的'基於sigaltstack'的黑客)來設置新的堆棧。 – 2011-04-25 13:37:20