go的排程
執行緒和協程的區別,執行緒是核心態的,而協程是使用者態。執行緒之間的切換主要由核心去排程,而協程之間的切換則需要使用者去操作。執行緒切換需要儲存上下文資訊,切換到另乙個執行緒,過段時間,恢復到之前的執行緒繼續執行。
cpu時間片的讓渡,上下文的儲存等等複雜操作都是由核心實現的,操作員不需要關注其中的細節。對操作員更加友好。但是為了支援這些操作,執行緒需要使用大量的資源。所以乙個程序之間只能支援少量的執行緒,一般幾個,十幾個就會將資源耗盡。而協程則不同,它將協程之間的排程交給操作員去處理,優秀的操作員可以通過各種操作降低協程之間上下文切換資源占用,處理切換時機等等。對操作員的水平要求更高,由於排程由操作員控制,那麼使用的資源相對來說會更少,所以乙個程序可以啟動的協程數量比執行緒更多。
goroutine
結合了執行緒和協程的優點。主要表現在,從資源占用上看,
goroutine
更像是協程,占用的資源都很少,支援乙個程序開千個萬個
goroutine
。而從切換角度來看,
goroutine
更像是執行緒,不需要使用者實現
goroutine
之間的排程。
goroutine
之間的排程不由核心來操作,也不由使用者操作。由
go自己來操作,
go中自己實現了排程器。 執行
go程式時,從
main
開始,main goroutine
建立乙個新的
m,繫結乙個
p。如果
main
函式裡有其他的
goroutine
,查詢是否有空閒的
p,如果有,建立乙個新的
m,加入新
p的本地佇列中,繫結其他空閒的
p。如果沒有空閒的
p,那麼將
g加入全域性佇列中。每次執行時,迴圈執行本地佇列任務(本地佇列和全域性佇列會交換任務),然後執行全域性任務,都沒有的話,去其他
p裡面偷,偷一半。
Go語言GMP 排程器的原理
作業系統中的程式可以往下分解為程序 執行緒和協程。go中,協程被稱為goroutine,被runtime進行排程。gmp排程中,g代表goroutine,m代表執行緒,p是processor,它包含了執行goroutine的資源,只有當 m 關聯乙個 p 後才能執行 g 復用執行緒 2個體現 1.w...
goroutine 1 go的排程器
對多道並行執行的程式來說,有時它要占用處理器執行,有時要等待傳送資訊,當得到資訊後又可繼續執行,乙個程式的執行可能受到另乙個程式的約束。所以程式的執行實際上是走走停停的,為了能正確反映程式執行時的活動規律和狀態變化,引進了程序,以便從變化的角度,動態地分析和研究程式的執行。用計算機系統來解決某個問題...
車間排程 車間排程問題的特點
多約束性在通常情況下,工件的加工路線是已知的,並且受到嚴格的工藝約束,使得各道工序在加工順序上具有先後約束關係 同時,工件的加工機器集是已知的,工件必須按照工序順序在可以選擇的工具機上進行加工。離散性車間生產系統是典型的離散系統,其排程問題是離散優化問題。工件的開始加工時間 任務的到達 訂單的變更,...