為什麼協程切換的代價比執行緒切換低

時間 2021-05-05 17:59:09

1樓:艦長

我覺得這個問題得換個問法,結合實際使用場景

協程一般拿來撐併發用,也就是說大部分情況下系統執行的協程數量遠大於核數,在沒有協程的年代用生產者消費者模式,乙個協程相當於那個模式中的乙個task的概念,只是資料儲存在了棧上。這樣兩個模式對比是有意義的,在bthread的M:N模型中,協程也有佇列的,本質上也是一種生產消費者模型,pthread在通過取出bthread在各種棧上穿梭。

而執行緒是完全公平排程演算法,也就意味著你開的越多,單位時間內單個執行緒被排程到的概率越小,執行時間片越短。作業系統為了保證每個執行緒都被排程到會調整時間片和排程演算法,最終會達到乙個很高的上下文切換頻率,這時候是拿執行緒當作task在用的,這會持續惡化cache命中率,提公升sys cpu的執行佔比,導致侵占使用者態的cpu利用率。

這裡如果你單純區域性的比較乙個執行緒的協程切換和執行緒間的切換,都是在儲存上下文,我覺得大部分人實現的未必比系統好,就算你不切換核心也會幫你切,你無法控制。

所以只能通過減少執行緒的數量來讓核心少切一點。當你不用協程(也不用常見的執行緒佇列模型)的時候,你必須得開執行緒來處理更多的任務了,那這個問題應該是「為什麼執行緒開多了效率低」,這個時候和協程無關了,並不是因為協程比執行緒好,僅僅是因為你必須要用更多的執行緒來處理問題。

2樓:

我覺得做伺服器開發的,還是不要面向流行名詞開發,不要去學做WEB前端的,今天乙個這個框架,明天乙個那個特性,嘴裡叫囂著一些高併發,協程這些名詞,會顯得很low,老老實實把生產者消費者系統吃透,再去按需求選擇協程執行緒程序這些非同步方案。

3樓:戈君

這個問題和協作or搶占關係不大,伺服器中的執行緒在大部分時候都是碰到os阻塞原語而主動切換上下文,和協作式是一樣的。還有乙個切換時機是在建立新的協程或執行緒時,主要就這兩類。

建立的提速主要是靠池化,特別是帶棧的協程,否則獲得物件不會很快。

阻塞原語的提速:對於對映到乙個系統執行緒的協程,協程之間的切換不需要和os阻塞原語打交道,(在不處理中斷的前提下)就是儲存恢復幾個暫存器,當然飛快,但代價是無法利用多核,在實踐中基本沒用;對於要利用多個系統執行緒的協程,協程間的切換最終會轉化為系統執行緒間的喚醒,這個開銷會遠遠大於協程那幾個暫存器的儲存恢復。喚醒繞不開核心,是提不了速的,只是因為協程常遠多於工作執行緒,就平攤了工作執行緒的喚醒開銷,在使用者看來,單個協程就」輕「了。

4樓:心痕

我的理解是,協程切換不需要切換特權級別。至於協程切換是否需要切換棧,應該是根據實現不同(有棧協程和無棧協程)。相比於執行緒由核心進行排程,協程由使用者控制排程,因此可控性更高,不需要產生互斥這類的操作。

5樓:

@趙雪松 之前說在他的測試下,一千個左右執行緒時,切換的主要成本在於「尋找當前就緒的執行緒」,並不是「陷入核心態「等。(重IO短尾流量場景,作業系統非O(1)排程)

PS: 我自己腦補的內容是,協程的排程簡單很多,主動退讓、很多協程實現不考慮優先順序,則每次切換成本也要低很多。

6樓:sonald

先說x86體系下的linux的執行緒。在linux下執行緒和程序本質上是同乙個東西(都可以用clone建立),區別在於建立引數不一樣,所以導致的行為不一樣,建立時的消耗不一樣。執行緒切換受核心管理,現代核心應該不用軟中斷了(太慢),而是使用特有的硬體指令(在long mode下),比如sysenter,syscall等等。

他們的代價要小不少。由於同乙個程序的執行緒之間共享記憶體,不存在頁表切換開銷,基本只有暫存器狀態的切換,sysenter在這方面比手動壓棧儲存暫存器要快不少。具體細節就不展開了,我這有乙個最簡單的rust實現。

當然再快,也會涉及到特權級的切換,硬體的特權級保護機制和各種檢查。

協程是乙個純使用者態的併發機制。於是乎沒有任何的特權級切換和作業系統的干預。我們大部分時候談協程可能都是指協作式協程。

一旦乙個協程執行起來後,如果不主動退讓(yield),其他協程是無法獲得執行機會的。協程排程需要維護的暫存器狀態要比執行緒少,幾乎所有的段暫存器以及一些硬體特有暫存器都不需要(也不能)儲存和恢復。

所以,協程和執行緒的上下文資訊以及作業系統層面和硬體層面的牽扯差別很大,所以說協程很輕。也正因為如此,協程也有很多限制。

7樓:張凱(Kyle Zhang)

核心在於,執行緒切換需要借助核心完成,意味著一次使用者態到核心態的切換,以及一次核心態到使用者態的切換。而協程的切換只在使用者態就可以完成,無需借助核心,也就不需要進入核心態。

使用者態和核心態的切換才是最主要的開銷。

為什麼 Java 堅持多執行緒不選擇協程?

Xpecya 最直接的原因我認為是jdbc 協程你想跑滿單核心首先你得非阻塞。但是對於實際專案而言,只要你需要從資料庫獲取資料,就必須用乙個把單執行緒徹底堵死的jdbc api 所以如果現在jdk推出協程,你也只能在不需要jdbc呼叫的場合才能玩玩。而這 真的沒什麼意思。如果真的要搞協程,首先請推出...

為什麼切換到「位址」欄的鍵盤快捷鍵很奇怪?

我不能理解為什麼有人反感整容。在我看來,用一定的手段來使自己變得更美好沒有錯,而且合法。就像化妝,穿修身的衣服。說開了,腦子不是很好的學生,通過努力學習 一定的手段 使自己成績優秀,達到和那些天生聰穎的學生一樣的程度 是自己變得更美好 在行為和目的上和整容沒啥區別。反正我支援整容,本來天生就不是很好...

為什麼黑百合的槍可以自由切換模式而不改變傷害?

三三為酒 首先,CG特寫裡表明了她是子彈,不是脈衝電磁道道之類。黑百合切換模式槍管是有明顯改變的,狙擊模式槍管長於突擊模式,也就是說狙擊模式子彈初速一定是比突擊模式高的,同種子彈的殺傷力跟初速成正比,一槍120和1槍14血是有科學依據的。我們來推測一下蓄力這個過程是怎麼實現的,增加槍管內膛壓強?還是...