協程與執行緒的區別 程序 執行緒 和 協程對比

2021-10-11 15:03:41 字數 939 閱讀 3814

程序、執行緒,都是有核心進行排程,有 cpu 時間片的概念,進行 搶占式排程。

協程(使用者級執行緒)完全由使用者自己的程式進行排程(協作式排程),需要協程自己主動把控制權轉讓出去之後,其他協程才能被執行到。

goroutine 和協程區別

本質上,goroutine 就是協程。 不同的是,golang 在 runtime、系統呼叫等多方面對 goroutine 排程進行了封裝和處理,當遇到長時間執行或者進行系統呼叫時,會主動把當前 goroutine 的cpu (p) 轉讓出去,讓其他 goroutine 能被排程並執行,也就是 golang 從語言層面支援了協程。golang 的一大特色就是從語言層面原生支援協程,在函式或者方法前面加 go關鍵字就可建立乙個協程。

執行緒是作業系統的核心物件,多執行緒程式設計時,如果執行緒數過多,就會導致頻繁的上下文切換,這些 cpu時間是乙個額外的耗費。

協程,是在應用層模擬的執行緒,他避免了上下文切換的額外耗費,兼顧了多執行緒的優點。簡化了高併發程式的複雜度。

協程如何實現的?

協程是基於執行緒的。內部實現上,維護了一組資料結構和 n 個執行緒,真正的執行還是執行緒,協程執行的**被扔進乙個待執行佇列中,由這 n 個執行緒從佇列中拉出來執行。這就解決了協程的執行問題。那麼協程是怎麼切換的呢?答案是:golang 對各種 io函式 進行了封裝,這些封裝的函式提供給應用程式使用,而其內部呼叫了作業系統的非同步 io函式,當這些非同步函式返回 busy 或 bloking 時,golang 利用這個時機將現有的執行序列壓棧,讓執行緒去拉另外乙個協程的**來執行,基本原理就是這樣,利用並封裝了作業系統的非同步函式。包括 linux 的 epoll、select 和 windows 的 iocp、event 等。

在任務排程上,協程是弱於執行緒的。但是在資源消耗上,協程則是極低的。乙個執行緒的內存在 mb 級別,而協程只需要 kb 級別。而且執行緒的排程需要核心態與使用者的頻繁切入切出,資源消耗也不小。

知行研發部-劉學千

程序 執行緒和協程的區別

這是我的第一篇部落格,文章如有不足之處,請各位大神多多指教!執行緒和程序的操作是由程式觸發系統介面,最後的執行者是系統 協程的操作則是程式設計師。切換開銷 即排程和切換的時間 程序 執行緒 協程 程序和執行緒的區別 概要 計算密集型 cpu bound 適合多程序,而多執行緒是雞肋 和i o密集型 ...

程序,執行緒和協程

程序 process 和執行緒 thread 是程式設計師必需掌握的核心知識。而多程序和多執行緒程式設計對於 的並行併發執行,提公升 效率和縮短執行時間至關重要。簡單總結 程序是資源分配的單位 執行緒是作業系統排程的單位 程序切換需要的資源很最大,效率很低 執行緒切換需要的資源一般,效率一般 當然了...

程序 執行緒與協程

程序的出現是為了更好的利用cpu資源使到併發成為可能。假設有兩個任務a和b,當a遇到io操作,cpu默默的等待任務a讀取完操作再去執行任務b,這樣無疑是對cpu資源的極大的浪費。聰明的老大們就在想若在任務a讀取資料時,讓任務b執行,當任務a讀取完資料後,再切換到任務a執行。注意關鍵字切換,自然是切換...