在m:1執行緒實現中,關乎執行緒建立、排程以及同步(互斥量的鎖定,條件變數的等待等)的所有的細節全部由程序內使用者空間(user-space)的執行緒庫來處理。對於程序中存在的多個執行緒,核心一無所知。m:1實現的優勢不多,其中最大的有點在於,許多執行緒操作(例如執行緒的建立和終止、執行緒上下文間的切換、互斥量以及條件變數操作)速度都很快,因為無需切換到核心模式。此外,由於執行緒庫無需核心支援,所以m:1實現在系統間的移植相對要容易一些。
不過,m:1實現也存在一些嚴重缺陷。
在1:1執行緒實現中,每一線程對映乙個單獨的kse。核心分別對每個執行緒做排程處理。執行緒同步操作通過核心系統呼叫實現。
1:1實現消除了m:1實現的種種弊端。遭阻塞的系統呼叫不會導致程序的所有執行緒被阻塞,在多處理器硬體平台上,核心還可以將程序中的多個執行緒排程到不同的cpu上。
不過,因為需要切換到核心模式,所以諸如執行緒建立,上下文切換以及同步操作就要滿一些。另外,為每個執行緒分別維護乙個kse也需要開銷,如果應用程式包含大量執行緒,則可能對核心排程器造成嚴重的負擔,降低系統的整體效能。
儘管有這些缺點,1:1實現通常更勝於m:1實現。linuxthreads和nptl都採用1:1模型。
m:n實現旨在結合1:1和m:1模型的優點,避免二者的缺點。
在m:n模型中,每個程序都可擁有多個與之相關的kse,並且也可以把多個執行緒對映到乙個kse。這種設計允許核心將同一應用的執行緒排程到不同的cpu上執行,同時也解決了隨執行緒數量而放大的效能問題。
m:n模型的最大問題是過於複雜。執行緒排程任務由核心及使用者空間的執行緒庫共同承擔,二者之間勢必要進行分工協作和資訊交換。在m:n模型下,按照susv3標準要求來管理訊號也極為複雜。
六 執行緒的實現方式 多執行緒模型
1.執行緒分為使用者級執行緒和核心級執行緒 2.使用者級執行緒由應用程式通過執行緒庫實現,所有的執行緒管理工作都由應用程式負責 包括執行緒切換 3.使用者級執行緒中,執行緒切換可以在使用者態下即可完成,無需作業系統干預。4.在使用者看來,是有多個執行緒,但是在作業系統的核心來看,並不意識到執行緒的存...
Linux2 6執行緒模型NPTL實現
全選 937 struct task struct pid,從字面上是process id,但其實是thread id。tgid,從字面上,應該是thread group id,也就是真正的process id。這一點,可以從系統呼叫getpid和gettid中看出來 位於kernel timer....
NIO實現Reactor單執行緒模型
寫這個模型需要提前了解selector以及channel,之前記錄過filechannel,除此之外還有以下幾種channel serversocketchannel 用於監聽新的tcp連線的通道,負責讀取 響應,通常用於服務端的實現。socketchannel 用於發起tcp連線,讀寫網路中的資料...