內(nèi)核線程(Kernel-Level Thread ,KLT)
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站設(shè)計、施甸網(wǎng)絡(luò)推廣、小程序定制開發(fā)、施甸網(wǎng)絡(luò)營銷、施甸企業(yè)策劃、施甸品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供施甸建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:jinyejixie.com
輕量級進程(Light Weight Process,LWP):輕量級進程就是我們通常意義上所講的線程,由于每個輕量級進程都由一個內(nèi)核線程支持,因此只有先支持內(nèi)核線程,才能有輕量級進程
用戶線程與系統(tǒng)線程一一對應(yīng),用戶線程執(zhí)行如lo操作的系統(tǒng)調(diào)用時,來回切換操作開銷相對比較大
多個用戶線程對應(yīng)一個內(nèi)核線程,當(dāng)內(nèi)核線程對應(yīng)的一個用戶線程被阻塞掛起時候,其他用戶線程也阻塞不能執(zhí)行了。
多對多模型是可以充分利用多核CPU提升運行效能的
go線程模型包含三個概念:內(nèi)核線程(M),goroutine(G),G的上下文環(huán)境(P);
GMP模型是goalng特有的。
P與M一般是一一對應(yīng)的。P(上下文)管理著一組G(goroutine)掛載在M(內(nèi)核線程)上運行,圖中左邊藍色為正在執(zhí)行狀態(tài)的goroutine,右邊為待執(zhí)行狀態(tài)的goroutiine隊列。P的數(shù)量由環(huán)境變量GOMAXPROCS的值或程序運行runtime.GOMAXPROCS()進行設(shè)置。
當(dāng)一個os線程在執(zhí)行M1一個G1發(fā)生阻塞時,調(diào)度器讓M1拋棄P,等待G1返回,然后另起一個M2接收P來執(zhí)行剩下的goroutine隊列(G2、G3...),這是golang調(diào)度器厲害的地方,可以保證有足夠的線程來運行剩下所有的goroutine。
當(dāng)G1結(jié)束后,M1會重新拿回P來完成,如果拿不到就丟到全局runqueue中,然后自己放到線程池或轉(zhuǎn)入休眠狀態(tài)??臻e的上下文P會周期性的檢查全局runqueue上的goroutine,并且執(zhí)行它。
另一種情況就是當(dāng)有些P1太閑而其他P2很忙碌的時候,會從其他上下文P2拿一些G來執(zhí)行。
詳細可以翻看下方第一個參考鏈接,寫得真好。
最后用大佬的總結(jié)來做最后的收尾————
Go語言運行時,通過核心元素G,M,P 和 自己的調(diào)度器,實現(xiàn)了自己的并發(fā)線程模型。調(diào)度器通過對G,M,P的調(diào)度實現(xiàn)了兩級線程模型中操作系統(tǒng)內(nèi)核之外的調(diào)度任務(wù)。整個調(diào)度過程中會在多種時機去觸發(fā)最核心的步驟 “一整輪調(diào)度”,而一整輪調(diào)度中最關(guān)鍵的部分在“全力查找可運行G”,它保證了M的高效運行(換句話說就是充分使用了計算機的物理資源),一整輪調(diào)度中還會涉及到M的啟用停止。最后別忘了,還有一個與Go程序生命周期相同的系統(tǒng)監(jiān)測任務(wù)來進行一些輔助性的工作。
淺析Golang的線程模型與調(diào)度器
Golang CSP并發(fā)模型
Golang線程模型
1、什么是線程池: java.util.concurrent.Executors提供了一個 java.util.concurrent.Executor接口的實現(xiàn)用于創(chuàng)建線程池
多線程技術(shù)主要解決處理器單元內(nèi)多個線程執(zhí)行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。
假設(shè)一個服務(wù)器完成一項任務(wù)所需時間為:T1 創(chuàng)建線程時間,T2 在線程中執(zhí)行任務(wù)的時間,T3 銷毀線程時間。
如果:T1 + T3 遠大于 T2,則可以采用線程池,以提高服務(wù)器性能。
一個線程池包括以下四個基本組成部分:
1、線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,銷毀線程池,添加新任務(wù);
2、工作線程(PoolWorker):線程池中線程,在沒有任務(wù)時處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);
3、任務(wù)接口(Task):每個任務(wù)必須實現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;
4、任務(wù)隊列(taskQueue):用于存放沒有處理的任務(wù)。提供一種緩沖機制。
線程池技術(shù)正是關(guān)注如何縮短或調(diào)整T1,T3時間的技術(shù),從而提高服務(wù)器程序性能的。它把T1,T3分別安排在服務(wù)器程序的啟動和結(jié)束的時間段或者一些空閑的時間段,這樣在服務(wù)器程序處理客戶請求時,不會有T1,T3的開銷了。
線程池不僅調(diào)整T1,T3產(chǎn)生的時間段,而且它還顯著減少了創(chuàng)建線程的數(shù)目,看一個例子:
假設(shè)一個服務(wù)器一天要處理50000個請求,并且每個請求需要一個單獨的線程完成。在線程池中,線程數(shù)一般是固定的,所以產(chǎn)生線程總數(shù)不會超過線程池中線程的數(shù)目,而如果服務(wù)器不利用線程池來處理這些請求則線程總數(shù)為50000。一般線程池大小是遠小于50000。所以利用線程池的服務(wù)器程序不會為了創(chuàng)建50000而在處理請求時浪費時間,從而提高效率。
實現(xiàn)指定個核心最大化使用,比如核心總數(shù)減一。
必要的庫。
要使用的cpu數(shù)量,建議不全使用。
建立管道。
聲明使用的cpu數(shù)。
建立互斥關(guān)系,本例中主要為了實現(xiàn)所有線程執(zhí)行完后再執(zhí)行后續(xù)程序。
創(chuàng)建cpu數(shù)減1個線程
后面每個任務(wù)結(jié)束時要done一個wg,這里根據(jù)具體情況加,是循環(huán)就在每個循環(huán)里加,保證后面能全部done即可
沒有緩沖的、阻塞式的往管道傳遞字符串。
Wait是等所有線程都執(zhí)行完,即增加的數(shù)字被全done掉。
關(guān)閉管道。
假設(shè)已有的函數(shù)是ReadLogs,在它的基礎(chǔ)上加個Wg加函數(shù)名的新函數(shù),我覺得這種方式不改變原有的,比較舒服。
大意是:循環(huán)從管道讀取字符串,讀不到了就跳出循環(huán)。
每個ReadLogs()之后加一個wg.Done(),相當(dāng)于計數(shù)減一。
ReadLogs()就是要執(zhí)行的任務(wù),不再解釋。
就是開指定個線程。
管道阻塞傳值。
wg同步。
WgReadLogs循環(huán)接收。
本文名稱:go語言如何管理線程池 go語言如何管理線程池的數(shù)據(jù)
URL網(wǎng)址:http://jinyejixie.com/article42/ddisehc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、域名注冊、網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)站制作、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)