最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
go語言給結(jié)構(gòu)體加并發(fā)鎖 go語言的鎖

Go語言——goroutine并發(fā)模型

參考:

成都創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元碾子山做網(wǎng)站,已為上家服務(wù),為碾子山各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

Goroutine并發(fā)調(diào)度模型深度解析手擼一個協(xié)程池

Golang 的 goroutine 是如何實現(xiàn)的?

Golang - 調(diào)度剖析【第二部分】

OS線程初始棧為2MB。Go語言中,每個goroutine采用動態(tài)擴容方式,初始2KB,按需增長,最大1G。此外GC會收縮??臻g。

BTW,增長擴容都是有代價的,需要copy數(shù)據(jù)到新的stack,所以初始2KB可能有些性能問題。

更多關(guān)于stack的內(nèi)容,可以參見大佬的文章。 聊一聊goroutine stack

用戶線程的調(diào)度以及生命周期管理都是用戶層面,Go語言自己實現(xiàn)的,不借助OS系統(tǒng)調(diào)用,減少系統(tǒng)資源消耗。

Go語言采用兩級線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會交給OS線程執(zhí)行,但是需要一個中介,提供上下文。這就是G-M-P模型

Go調(diào)度器有兩個不同的運行隊列:

go1.10\src\runtime\runtime2.go

Go調(diào)度器根據(jù)事件進行上下文切換。

調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進程切換。

詳見 Golang - 調(diào)度剖析【第二部分】

Linux可以通過epoll實現(xiàn)網(wǎng)絡(luò)調(diào)用,統(tǒng)稱網(wǎng)絡(luò)輪詢器N(Net Poller)。

文件IO操作

上面都是防止M堵塞,任務(wù)竊取是防止M空閑

每個M都有一個特殊的G,g0。用于執(zhí)行調(diào)度,gc,棧管理等任務(wù),所以g0的棧稱為調(diào)度棧。g0的棧不會自動增長,不會被gc,來自os線程的棧。

go1.10\src\runtime\proc.go

G沒辦法自己運行,必須通過M運行

M通過通過調(diào)度,執(zhí)行G

從M掛載P的runq中找到G,執(zhí)行G

Go語言——sync.Map詳解

sync.Map是1.9才推薦的并發(fā)安全的map,除了互斥量以外,還運用了原子操作,所以在這之前,有必要了解下 Go語言——原子操作

go1.10\src\sync\map.go

entry分為三種情況:

從read中讀取key,如果key存在就tryStore。

注意這里開始需要加鎖,因為需要操作dirty。

條目在read中,首先取消標記,然后將條目保存到dirty里。(因為標記的數(shù)據(jù)不在dirty里)

最后原子保存value到條目里面,這里注意read和dirty都有條目。

總結(jié)一下Store:

這里可以看到dirty保存了數(shù)據(jù)的修改,除非可以直接原子更新read,繼續(xù)保持read clean。

有了之前的經(jīng)驗,可以猜測下load流程:

與猜測的 區(qū)別 :

由于數(shù)據(jù)保存兩份,所以刪除考慮:

先看第二種情況。加鎖直接刪除dirty數(shù)據(jù)。思考下貌似沒什么問題,本身就是臟數(shù)據(jù)。

第一種和第三種情況唯一的區(qū)別就是條目是否被標記。標記代表刪除,所以直接返回。否則CAS操作置為nil。這里總感覺少點什么,因為條目其實還是存在的,雖然指針nil。

看了一圈貌似沒找到標記的邏輯,因為刪除只是將他變成nil。

之前以為這個邏輯就是簡單的將為標記的條目拷貝給dirty,現(xiàn)在看來大有文章。

p == nil,說明條目已經(jīng)被delete了,CAS將他置為標記刪除。然后這個條目就不會保存在dirty里面。

這里其實就跟miss邏輯串起來了,因為miss達到閾值之后,dirty會全量變成read,也就是說標記刪除在這一步最終刪除。這個還是很巧妙的。

真正的刪除邏輯:

很繞。。。。

Go CSP并發(fā)模型

Go的CSP并發(fā)模型

Go實現(xiàn)了兩種并發(fā)形式。第一種是大家普遍認知的:多線程共享內(nèi)存。其實就是Java或者C++等語言中的多線程開發(fā)。另外一種是Go語言特有的,也是Go語言推薦的:CSP(communicating sequential processes)并發(fā)模型。

CSP 是 Communicating Sequential Process 的簡稱,中文可以叫做通信順序進程,是一種并發(fā)編程模型,由 Tony Hoare 于 1977 年提出。簡單來說,CSP 模型由并發(fā)執(zhí)行的實體(線程或者進程)所組成,實體之間通過發(fā)送消息進行通信,這里發(fā)送消息時使用的就是通道,或者叫 channel。CSP 模型的關(guān)鍵是關(guān)注 channel,而不關(guān)注發(fā)送消息的實體。 Go 語言實現(xiàn)了 CSP 部分理論 。

“ 不要以共享內(nèi)存的方式來通信,相反, 要通過通信來共享內(nèi)存。”

Go的CSP并發(fā)模型,是通過 goroutine和channel 來實現(xiàn)的。

goroutine 是Go語言中并發(fā)的執(zhí)行單位。其實就是協(xié)程。

channel是Go語言中各個并發(fā)結(jié)構(gòu)體(goroutine)之前的通信機制。 通俗的講,就是各個goroutine之間通信的”管道“,有點類似于Linux中的管道。

Channel

Goroutine


本文標題:go語言給結(jié)構(gòu)體加并發(fā)鎖 go語言的鎖
當前URL:http://fisionsoft.com.cn/article/hgojco.html