<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Go語言裡的並行指的是能讓某個函數獨立於其他函數執行的能力。
Go語言的goroutine是一個獨立的工作單元,
Go 語言的並行同步模型來自一個叫作交談循序程式(Communicating Sequential Processes,CSP)的範型(paradigm)。
CSP 是一種訊息傳遞模型,通過在goroutine 之間傳遞資料來傳遞訊息,而不是對資料進行加鎖來實現同步存取。訊息的傳遞通過Go語言中的Channel(通道)來實現。
程序(process) 看作一個包含了應用程式在執行中需要用到和維護的各種資源的容器。
執行緒(Thread)是一個執行空間,這個空間會被作業系統排程來執行函數中所寫的程式碼。
每個程序至少包含一個執行緒,每個程序的初始執行緒被稱作主執行緒。因為執行這個執行緒的空間是應用程式的本身的空間,所以當主執行緒終止時,應用程式也會終止。
下圖就是程序和執行緒的簡要關係。
我的理解控制程式碼就是給使用者操作核心資源的指標,指向指標的指標。【把手】和【門】的關係,使用們把手能轉動整個門(系統資源)
作業系統會在物理處理器上排程執行緒來執行,而Go 語言的執行時會在邏輯處理器上排程goroutine來執行。每個邏輯處理器都分別繫結到單個作業系統執行緒。下面我們就來簡單描述一下goroutine執行的流程。
首先來了解一下作業系統執行緒、邏輯處理器和本地執行佇列
全域性執行佇列:剛建立的goruntine會被安排到這裡面,通過一些排程演演算法,分配給邏輯處理器
作業系統執行緒:這個就是傳統意義上的執行緒,用於具體goroutine的執行,他會和一個邏輯器進行繫結
邏輯處理器:裡面維護著一個原生的佇列,用於本地佇列裡面goroutine的排程
本地執行佇列:裝載著待執行的goruntine
支撐整個排程器的主要有4個重要結構,分別是M、G、P、Sched,前三個定義在runtime.h中,Sched定義在proc.c中。
整個過程描述:
當建立一個Goroutine的時候,先放到全域性佇列當中,然後會把這個Goroutine分配到一個邏輯處理器的本地佇列中,這個邏輯處理器會繫結一個作業系統執行緒,由這個執行緒去執行Goroutine的程式碼。
生動描述:
地鼠(gopher)用小車運著一堆待加工的磚。M就可以看作圖中的地鼠,P就是小車,G就是小車裡裝的磚。一圖勝千言啊,弄清楚了它們三者的關係,下面我們就開始重點聊地鼠是如何在搬運磚塊的。
1.runqget, 地鼠(M)試圖從自己的小車(P)取出一塊磚(G),當然結果可能失敗,也就是這個地鼠的小車已經空了,沒有磚了。
2.findrunnable, 如果地鼠自己的小車中沒有磚,那也不能閒著不幹活是吧,所以地鼠就會試圖跑去工場倉庫取一塊磚來處理;工場倉庫也可能沒磚啊,出現這種情況的時候,這個地鼠也沒有偷懶停下幹活,而是悄悄跑出去,隨機盯上一個小夥伴(地鼠),然後從它的車裡試圖偷一半磚到自己車裡。如果多次嘗試偷磚都失敗了,那說明實在沒有磚可搬了,這個時候地鼠就會把小車還回停車場,然後睡覺休息了。如果地鼠睡覺了,下面的過程當然都停止了,地鼠睡覺也就是執行緒sleep了。
3.wakep, 到這個過程的時候,可憐的地鼠發現自己小車裡有好多磚啊,自己根本處理不過來;再回頭一看停車場居然有閒置的小車,立馬跑到宿舍一看,你妹,居然還有小夥伴在睡覺,直接給屁股一腳,“你妹,居然還在睡覺,老子都快累死了,趕緊起來幹活,分擔點工作。”,小夥伴醒了,拿上自己的小車,乖乖幹活去了。有時候,可憐的地鼠跑到宿舍卻發現沒有在睡覺的小夥伴,於是會很失望,最後只好向工場老闆說——”停車場還有閒置的車啊,我快乾不動了,趕緊從別的工場借個地鼠來幫忙吧。”,最後工場老闆就搞來一個新的地鼠幹活了。
4.execute,地鼠拿著磚放入火種歡快的燒練起來。
注: “地鼠偷磚”叫work stealing,一種排程演演算法。
到這裡,貌似整個工場都正常的運轉起來了,無懈可擊的樣子。不對,還有一個疑點沒解決啊,假設地鼠的車裡有很多磚,它把一塊磚放入火爐中後,何時把它取出來,放入第二塊磚呢?難道要一直把第一塊磚燒練好,才取出來嗎?那估計後面的磚真的是等得花兒都要謝了。這裡就是要真正解決goroutine的排程,上下文切換問題。
當一個OS執行緒M0陷入阻塞時(如下圖),P轉而在執行M1,圖中的M1可能是正被建立,或者從執行緒快取中取出。
簡單解釋就是,噹噹前的Goroutine在阻塞,就把他和當前執行緒繫結,讓當前的執行緒繼續執行這個Goroutine(就是等待),其他的goroutine隨著邏輯處理器被繫結到另一個執行緒上,繼續執行。
當阻塞的執行緒返回時,它必須嘗試取得一個邏輯處理器來執行goroutine,一般情況下,它會從其他的OS執行緒那裡拿一個P過來,如果沒有拿到的話,它就把goroutine放在一個全域性執行佇列裡,然後自己睡眠(放入執行緒快取裡)。所有的P也會週期性的檢查global runqueue並執行其中的goroutine,否則global runqueue上的goroutine永遠無法執行。
還有就像下面的圖片,左邊的執行緒一個滿載狀態,一個沒有goroutine,此時的做法就是會進行重新分配,就想右側圖展示
參考 :https://morsmachine.dk/go-scheduler
並行是兩個任務可以在重疊的時間段內啟動,執行和完成。並行是任務在同一時間執行,例如,在多核處理器上。
並行是獨立執行過程的組合,而並行是同時執行(可能相關的)計算。
並行是一次處理很多事情,並行是同時做很多事情。
簡單講:並行就是同時做很多事 並行就是一堆事情一個時間點來了,然後通過分片等方式感覺像都在執行
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45