成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

單機百萬并發:協程開始吊打線程了?

開發 項目管理
所謂線程的棧大小為MB級別僅僅是虛擬內存大小,假設Linux內核為每個線程默認設置 8MB 虛擬內存,那么在32位系統下虛擬地址空間僅 4GB,512 個線程就會耗盡(8MB × 512 = 4GB),而64位系統雖虛擬空間巨大,但線程數仍受 ??vm.max_map_count?? 等內核參數限制。

著名的C10K問題——即單機如何支持1萬并發連接,想必大家都有所了解,這個問題推動了epoll/kqueue等IO多路復用機制的誕生。

圖片圖片

在這場技術演進中,線程模型的局限性逐漸顯現。。。

這篇文章中我們來分析下為什么只使用線程不容易做到單機百萬并發。

首先來看下線程模型在高并發場景下的資源消耗問題。

線程作為操作系統進程內的執行單元,其開銷主要體現在兩個方面:資源占用和上下文切換成本。

提到資源占用很多資料會講線程的棧是MB級別而協程的棧是KB級別,因此百萬并發下線程占據的內存過多,然而這并不完全正確。

因為就棧的物理內存占用來說,線程可能并不比協程多。

所謂線程的棧大小為MB級別僅僅是虛擬內存大小,假設Linux內核為每個線程默認設置 8MB 虛擬內存,那么在32位系統下虛擬地址空間僅 4GB,512 個線程就會耗盡(8MB × 512 = 4GB),而64位系統雖虛擬空間巨大,但線程數仍受 vm.max_map_count 等內核參數限制。

圖片圖片

現在假設我們放開內存參數的限制。

如果線程的棧在函數真正運行時僅使用 1KB,那么真正的物理內存也就只分配 1KB,剩余虛擬空間僅是地址保留,不占物理內存,此時單線程的物理內存占用與協程基本相當。

因此用戶態棧的內存占用并不是關鍵原因。

既然用戶態棧的資源占用不是線程的瓶頸,那么線程還有其它問題嗎?

我們知道線程切換依賴操作系統內核的搶占式調度,每次切換涉及陷入內核態以及從內核態恢復到用戶態,這涉及到用戶態到內核態的上下文切換,需要保存/恢復完整上下文信息,以及內核中涉及鎖的競爭,單機百萬并發(線程)僅僅浪費在這里的CPU時間就足以形成性能瓶頸。

圖片圖片

而協程則實現在用戶態,協程的切換無需陷入內核,因此不需要保存/恢復完整的上下文信息,僅需保存少量寄存器,全程無需內核介入。

傳統線程模型采用的是搶占式調度,即操作系統可以在任何時刻強制中斷正在執行的線程,將CPU時間分配給其他線程。

這種調度方式對于Linux這種通用操作系統來說是必須的,但缺點是上下文切換成本高。

而協程采用的是協作式調度,它的核心理念是:協程主動讓出CPU資源,而不是被動等待被搶占,而協程能做到這一點當然是因為協程完全是用戶態的事情,用戶態程序相信自己。

而對于線程來說,內核決不能把CPU的分配權交給用戶態程序,因此不是線程做不到協作式調度而是不能。

具體來說,協程會在以下幾種情況下主動讓出執行權:

  • 執行IO操作時(如網絡請求)
  • 顯式調用類yield函數時
  • 等待鎖或其他同步原語時

協作式這種調度方式的優勢在于:

  1. 切換時機可預測:協程切換發生在代碼的明確位置
  2. 避免了不必要的切換:只有在真正需要等待的時候才會切換,減少了無效切換
  3. 降低了同步原語的復雜度:許多情況下可以避免使用復雜的鎖機制

這里絕不是說協作式調度就比搶占式調度好,僅僅是在IO密集型應用中,協作式調度模式的優勢更為明顯,使得利用協程可以輕易實現單機百萬并發。

協作式調度要比搶占式調度簡單太多,不是內核實現不了而是通用內核不能把CPU分配權交給用戶態。

因此,不是線程不夠強,而是一些特定場景下協程重構了游戲規則。

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2025-06-05 01:22:00

線程虛擬內存系統

2022-04-08 07:32:24

JavaJUCThreadLoca

2025-05-06 07:19:52

2023-10-12 09:46:00

并發模型線程

2016-10-28 17:39:47

phpgolangcoroutine

2023-04-26 01:12:53

進程線程語言

2024-06-27 07:56:49

2021-06-03 14:08:03

開發技能代碼

2021-06-04 14:28:07

協程線程Android開發

2024-12-04 13:52:30

2021-05-24 10:55:05

Netty單機并發

2022-09-09 08:41:43

Netty服務端驅動

2020-11-29 17:03:08

進程線程協程

2023-11-24 11:15:21

協程編程

2021-09-16 09:59:13

PythonJavaScript代碼

2021-04-25 09:36:20

Go協程線程

2023-10-11 07:39:58

Java虛擬線程

2021-05-13 21:58:00

高并發應用Asyncio

2024-03-12 13:11:20

powerjob單機線程

2020-08-04 10:56:09

進程線程協程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩二三区 | 国产精久久久久久 | 日本网站免费在线观看 | 国产91精品久久久久久久网曝门 | 国产一区三区在线 | 久久精品青青大伊人av | 91中文字幕在线 | 中文字幕精品一区 | 一区二区三区视频在线 | 久久精品国产久精国产 | 免费成人高清 | 日韩视频在线一区 | 国产综合久久 | 在线日韩 | 成人精品一区二区三区中文字幕 | 99精品免费 | 欧美黑人一区二区三区 | 精品国产色 | 一级a爱片久久毛片 | 亚州国产 | 国产91一区| 黄a免费网络 | 免费永久av | 国产98色在线 | 日韩 | 九九天堂网 | 日韩精品人成在线播放 | 国产精品久久久久久久久久久新郎 | 人人叉| 中文字幕一区二区三区精彩视频 | 国产精品免费视频一区 | 一区二区三区视频在线 | 久久久久免费观看 | 噜噜噜噜狠狠狠7777视频 | 成人欧美一区二区三区视频xxx | 欧美一区二区三区视频 | 欧美日韩精品一区 | 欧美在线播放一区 | 国产日产久久高清欧美一区 | 免费超碰| 日本精品视频一区二区三区四区 | 在线中文字幕av |