下载麻将游戏免费|手机麻将游戏

內核級線程, 用戶級線程和混合型線程

飛來科技  發布時間:2019-08-23 15:02:13

本文關鍵詞:用戶級線程

用戶級線程_四線程和八線程的區別_線程與線程池

程序一般通過輕量級進程(light weight process, lwp)來使用內核線程,輕量級進程即一般含義上的輪詢。很多文獻中都認為輕量級進程就是線程用戶級線程,實際上這種表述并不完全恰當,從后面的預測中可以發現,只有在用戶線程完全由輕量級進程構成時,才可以說輕量級進程就是線程。apache 的 mod_proxy_balancer 模塊的分發性能不高,比 nginx 或者 haproxy 都相差很多,另外,apache 目前并不支持 event(事件)模型,它僅支持 prefork(進程)模式和 worker(線程)模式,每處理一個鏈接,就應該建立一個進程或輪詢,而一些輕量級 web 服務器如 nginx 和 lighttpd,則都很高地運用內核的事件體系提升功耗,極大減少線程或進程數目,降低平臺負載。

線程在進程的地址空間中,一個進程的中可執行多個線程,每個線程是一個控制流(負責一件事情),多線程的控制步驟可以大量并存,操作系統會在各線程之間調度和切換,就像在多個進程之間調度和切換一樣。在采用輪詢的操作系統中,線程是進程中的一個實體,是被平臺獨立調度和分派的基本單位。線程是進程的一個實體,是cpu調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有平臺資源。

根據操作系統內核是否對泛型可認知,可以把句柄分為內核線程和用戶輪詢

名稱描述

用戶級線程(User-LevelThread, ULT)

由應用程序所支持的輪詢實現, 內核意識不到用戶級線程的推動

內核級線程(Kemel-LevelThread, KLT)

內核級線程又稱為內核支持的輪詢

在多線程操作系統中,各個系統的實現方法并不相同,在有的平臺中推動了用戶級線程,有的系統中謀求了內核級線程

有些情況下,也把內核級線程叫做輕量級進程(LWP), 但是這個是一個不準備的表述, 其實LWP的詞匯是借自于SVR4/MP和Solaris 2.x系統中, 有些系統將LWP稱為虛擬處理器, 將之稱為輕量級進程的理由可能是, 在內核線程的支持下,LWP是獨立的調度單元,就像普通的進程一樣。所以LWP的最大特點還是每個LWP都有一個內核線程支持

用戶級線程中,

有關線程管理的所有工作都由應用程序完成,內核意識不到線程的存在. 應用程序可以借助使用線程庫設計成多線程程序. 通常,應用程序從單線程起始,在該句柄中開始運行,在其運行的任何時刻,可以借助讀取線程庫中的派生例程創建一個在相同進程中運行的新線程。

用戶級線程僅存在于客戶空間中,此類線程的建立、撤銷、線程之間的同步與通訊用途,都無須利用平臺讀取來推動。用戶進程運用線程庫來控制用戶輪詢。由于線程在進程內切換的規則遠比進程調度和切換的規則簡潔,不需要用戶態/核心態切換,所以切換速度快。由于這里的處理器時間片分配是以進程為基本單位,所以每個線程執行的時間相對增加為了在操作系統中加入線程支持,采用了在客戶空間減少運行庫來推動線程,這些運行庫被稱為“線程包”,用戶輪詢是不能被操作系統所認知的。用戶線程多見于一些歷史悠久的操作系統,例如Unix操作系統

用戶級線程_四線程和八線程的區別_線程與線程池

用戶級線程駐留在客戶空間或方式。運行時庫管理很多線程,它也位于客戶空間。它們針對操作系統是不可見的,因此能夠被調度到處理器內核。每個線程并不具有自身的輪詢上下文。因此,就線程的同時執行而言,任意給定時刻每個進程只能夠有一個線程在運行,而且只有一個處理器內核會被分配給該進程。對于一個進程,可能有成千上萬個用戶級線程,但是它們對平臺資源沒有影響。運行時庫調度并分派很多線程。

下圖說明了用戶級線程的實現模式,

用戶級線程的實現方式,

如同在圖中發現的那樣,庫調度器從進程的多個線程中選擇一個線程,然后該泛型和該進程允許的一個內核線程關聯起來。內核線程將被操作系統調度器指派到處理器內核。用戶級線程是一種”多對一”的線程映射

內核對線程包一無所知。從內核角度考量,就是按正常的方法管理,即單線程進程(存在運行時平臺)

用戶線程的缺點主要有

可以在不支持線程的操作系統中推動。

狹義上的用戶線程指完全確立在用戶空間的泛型庫上,線程從建立到銷毀不需要內核的幫助,不需要切換到內核態。在linux平臺中,posix線程可以“看做”為一種輕量級的進程,pthread_create創建句柄和fork創建進程都是在內核中讀取__clone函數構建的,只不過創建句柄或進程的之后選項不同,比如是否共享虛擬地址空間、文件描述符等。servlet事件器的登錄和讀取過程都是由web容器自動完成的,當出現被對象被建立,修改,銷毀等事件時,web容器將讀取與之相關的servlet事件器對象的相應步驟(所到的對象如果在建立、修改、銷毀事件觸發的之后就會讀取這些器這就相當于面向事件編程的概念),用戶在很多技巧中編寫的事件處理代碼(相當于js中的事件響應)即被執行。

允許每個進程定制自己的調度算法,線程管理比較靈活。這就是必須自己寫管理程序,與內核線程的區分

線程能夠運用的表空間和堆棧空間比內核級線程多

不需要陷阱,不需要上下文切換,也不需要對硬盤高速緩存進行刷新,使得線程讀取非常便捷

線程的調度不需要內核直接參與,控制簡單。

用戶線程的特點主要有

線程與線程池_用戶級線程_四線程和八線程的區別

線程出現I/O或頁面故障導致的堵塞時,如果讀取阻塞系統讀入則內核由于不知道有多線程的存在,而會阻塞整個進程能夠阻塞所有線程, 因此同一進程中只能同時有一個線程在運行

頁面失效也會造成類似的弊端。

一個單獨的進程外部,沒有時鐘中斷,所以不可能用輪轉調度的方法調度線程

資源調度依據進程進行,多個處理機下,同一個進程中的輪詢只能在同一個處理機下分時復用

補充

用戶級線程中,每個進程里的輪詢表由運行時平臺管控。當一個線程轉換到就緒狀態或阻塞狀況時,在該線程表中放置重新啟動該線程所需的信息,與內核在進程表中保存的進程的信息完全一樣

在內核級線程中,

內核線程創建和銷毀都是由操作系統負責、通過平臺讀取完成的。在內核的支持下運行,無論是用戶進程的輪詢,或者是平臺進程的句柄,他們的構建、撤銷、切換都是依靠內核實現的。

內核為進程及其外部的每個句柄維護上下文信息,調度也是在內核基于句柄架構的基礎上完成。內核線程實現的優缺點:由于內核線程的支持,每個輕量級進程都作為一個獨立的調度單元,即使有一個輕量級進程在平臺調用中阻塞 ,也不會影響整個進程繼續工作。上圖(n:1模型)是最初的一個用戶線程模型,從中可以看出,進程中包括泛型,用戶輪詢在用戶空間中推動,內核并沒有直接對客戶線程進程調度,內核的調度對象和傳統進程一樣,還是進程本身,內核并不知道用戶輪詢的存在。

內核線程駐留在內核空間,它們是內核對象。有了內核線程,每個客戶線程被映射或綁定到一個內核線程。用戶輪詢在其生命期內就會綁定到該內核線程。一旦客戶線程中止,兩個線程都將離開平臺。這被稱作””線程映射,

線程的構建、撤銷和切換等,都應該內核直接推動,即內核知道每一個作為可調度實體的輪詢

這些句柄可以在全平臺內進行資源的競爭

答:用戶級線程是在客戶空間中的推動的,運行在“運行時平臺”與“內核控制句柄”的中。內核級線程:切換由內核控制,當句柄進行切換的之后,由用戶態轉化為內核態。在用戶級線程中,有關線程管理的所有工作都由應用程序完成,內核意識不到線程的存在。

四線程和八線程的區別_線程與線程池_用戶級線程

如圖所示,即內核級線程的實現方法, 每個客戶線程都直接與一個內核線程相關聯.

內核級線程的實現方式

并發度控制著用戶級線程可以映射的內核線程或進程的數量,如果操作系統的推動在內核級的線程和用戶級的線程之間保持。其實也是各自的真實pid,但由結構隱藏了,對外的pid為主進程的pid5)線程對操作系統來說就是進程,因此對信號的處理是以進程為單位分發的6)線程數量受限于平臺進程數7)系統管控線程的難題:所有線程由管理線程管理8)線程之間的調度是由內核調度器來處理的9)由于計算線程本地數據的方式是基于堆棧地址的位置。在采用輪詢的操作系統中,線程是進程中的一個實體,是被平臺獨立調度和分派的基本單位。

當某個線程希望建立一個新線程或撤銷一個已有線程時,它進行一個系統讀取

內核線程的優點:

多處理器系統中,內核無法并行執行同一進程內的多個線程

如果進程中的一個線程被阻塞,能夠切換同一進程內的其他線程繼續執行(用戶級線程的一個缺點)

所有無法阻塞線程的讀取都以平臺調用的方式謀求,代價可觀

當一個線程阻塞時,內核根據選擇可以運行另一個進程的輪詢,而客戶空間推動的句柄中,運行時平臺依舊運行自己進程中的輪詢

linux給每一個進程和輕量級進程都分配一個pid,程序員希望向進程發送信號時,此信號可以制約進程及進程造成的輕量級進程,因此形成了線程組(可以理解為輕量級進程組)的概念,程組內,每個句柄都使用此泛型組內第一個線程的pid,并將此值存入tgid。互斥量(mutex),信號燈(semaphore),事件(event)都可以被跨越進程使用來進行同步數據操作,而其他的對象與數據同步操作無關,但針對進程和線程來講,如果進程和線程在運行狀況則為無信號狀態,在退出后為有信號狀況。2. 互斥量(mutex),信號燈(semaphore),事件(event)都可以被跨越進程使用來進行同步數據操作,而其他的對象與數據同步操作無關,但針對進程和線程來講,如果進程和線程在運行狀況則為無信號狀態,在退出后為有信號狀況。

1) 多對一模型將多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成。將多個用戶級線程映射到一個內核級線程,線程管理在客戶空間完成。用戶級與內核級的多路復用用戶級線程,內核同一調度內核線程,每個內核線程對應n個用戶輪詢。

下圖說明了用戶級與內核級的組合實現方法, 在這種建模中,每個內核級線程有一個可以輪流使用的用戶級線程集合

用戶級與內核級的組合實現方式

用戶級線程_線程與線程池_四線程和八線程的區別

1) 多對一模型將多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成。linux支持內核級的輪詢,但它將泛型定義為進程的另一個“執行上下文”,從而簡化了進程/線程之間的關系和調度程序的設計,它的線程庫提供了和posix兼容的線程同步機制。而這里的用戶輪詢指的是完全構建在客戶空間的線程庫,用戶輪詢的構建,同步,銷毀,調度完全在用戶空間完成,不需要內核的幫助。

1) 多對一模型將多個用戶級線程映射到一個內核級線程,線程管理在客戶空間完成。多對一模型將多個用戶輪詢映射到一個內核線程上,線程之間的切換由用戶態的代碼來進行,因而絕對模型,多對一模型的輪詢切換速度要快很多。用戶級線程的程序實體是運行在用戶態下的程序,而內核支持泛型的程序實體則是可以運行在任何狀況下的程序。

內核級線程創建時先設定線程屬性PTHREAD_SCOPE_SYSTEM,代碼如下,:

<span style="color:#000000"><code class="language-c">pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); <span style="color:#880000">//設置內核級的線程,以獲取較高的響應速度</span>
<span style="color:#880000">//創建線程</span>
ret = pthread_create(&iAcceptThreadId, &attr, AcceptThread, NULL);</code></span>

POSIX的標準中定義了兩個值:

: pthread_scope_system和pthread_scope_process,前者表示與平臺中所有線程一起競爭cpu時間,后者表示僅與同進程中的輪詢競爭cpu。: pthread_scope_system和pthread_scope_process,前者表示與平臺中所有線程一起競爭cpu時間,后者表示僅與同 進程中的輪詢競爭cpu。:pthread_scope_system和pthread_scope_process,前者表示與平臺中所有線程一起競爭cpu時間,。

默認為PTHREAD_SCOPE_PROCESS。目前LinuxThreads僅實現了PTHREAD_SCOPE_SYSTEM一值。

關于線程的綁定,牽涉到另外一個概念:輕進程(LWP:Light Weight Process)。輕進程可以理解為內核線程,它位于用戶層和平臺層之間。系統對線程資源的分配、對線程的控制是借助輕進程來推動的,一個輕進程可以控制一個或多個線程。默認情況下,啟動多少輕進程、哪些輕進程來控制哪些線程是由平臺來控制的,這種情況即稱為非綁定的。綁定狀態下,則顧名思義,即某個線程固定的”綁”在一個輕進程之上。被綁定的線程具有較高的響應速率,這是因為CPU時間片的調度是面向輕進程的,綁定的輪詢可以確保在應該的之后它總有一個輕進程可用。通過修改被綁定的輕進程的優先級和調度級可以促使綁定的輪詢滿足諸如實時反應之類的要求。

設置線程綁定狀態的變量為pthread_attr_setscope,它有兩個參數,第一個是指向屬性結構的指針,第二個是綁定類型,它有兩個取值:pthread_scope_system(綁定的)和pthread_scope_process(非綁定的)。設置線程綁定狀態的變量為 pthread_attr_setscope,它有兩個參數,第一個是指向屬性結構的指針,第二個是綁定類型,它有兩個取值: pthread_scope_system(綁定的)和pthread_scope_process(非綁定的)。設置線程綁定狀態的變量為pthread_attr_setscope,它有兩個參數,第一個是指向屬性結構的指針,第二個是綁定類型,它有兩個取值。

內核支持線程是OS內核可認知的,而用戶級線程是OS內核不可感知的。

用戶級線程的構建、撤消和調度不需要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持協程的構建、撤消和調度都需OS內核提供支持,而且與進程的構建、撤消和調度大體是相同的。

用戶級線程執行平臺讀取指令時將促使其所屬進程被中止,而內核支持泛型執行系統讀取指令時,只導致該句柄被中止。

4、進程是帶有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是平臺進行資源分配和調 度的一個獨立單位. 線程是進程的一個實體,是cpu調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程 自己基本上不擁有平臺資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧)但是 它可與同屬一個進程的其他的線程共享進程所擁有的全部資源. 一個線程可以建立和撤銷另一個線程。而 m:n 模型下,多個用戶輪詢對應于內核中的多個內核線程,用戶輪詢調度僅限于在本進程范圍內進行,而對應的內核線程則交由內核進行調度。當線程在平臺內運行時,線程的調度具有一定的透明性,程序一般能夠精確控制線程的輪換執行,但我們可以借助一些措施來確保線程協調運行,也就是處理線程之間的通信。

用戶級線程的程序實體是運行在用戶態下的程序,而內核支持泛型的程序實體則是可以運行在任何狀況下的程序。

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

    相關閱讀
    下载麻将游戏免费 黑龙江时时时间 qq麻将手机版 最新公式规律贴吧 即时比分 不倒翁对冲的投注法 彩九app下载 欧冠赛程 时时彩计划定位胆 北京pk10软件手机软件 为什么lg赛车一下大就输