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

單機百萬并發(fā):協(xié)程開始吊打線程了?

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

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

圖片圖片

在這場技術(shù)演進中,線程模型的局限性逐漸顯現(xiàn)。。。

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

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

線程作為操作系統(tǒng)進程內(nèi)的執(zhí)行單元,其開銷主要體現(xiàn)在兩個方面:資源占用和上下文切換成本。

提到資源占用很多資料會講線程的棧是MB級別而協(xié)程的棧是KB級別,因此百萬并發(fā)下線程占據(jù)的內(nèi)存過多,然而這并不完全正確。

因為就棧的物理內(nèi)存占用來說,線程可能并不比協(xié)程多。

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

圖片圖片

現(xiàn)在假設我們放開內(nèi)存參數(shù)的限制。

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

因此用戶態(tài)棧的內(nèi)存占用并不是關(guān)鍵原因。

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

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

圖片圖片

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

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

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

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

而對于線程來說,內(nèi)核決不能把CPU的分配權(quán)交給用戶態(tài)程序,因此不是線程做不到協(xié)作式調(diào)度而是不能。

具體來說,協(xié)程會在以下幾種情況下主動讓出執(zhí)行權(quán):

  • 執(zhí)行IO操作時(如網(wǎng)絡請求)
  • 顯式調(diào)用類yield函數(shù)時
  • 等待鎖或其他同步原語時

協(xié)作式這種調(diào)度方式的優(yōu)勢在于:

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

這里絕不是說協(xié)作式調(diào)度就比搶占式調(diào)度好,僅僅是在IO密集型應用中,協(xié)作式調(diào)度模式的優(yōu)勢更為明顯,使得利用協(xié)程可以輕易實現(xiàn)單機百萬并發(fā)。

協(xié)作式調(diào)度要比搶占式調(diào)度簡單太多,不是內(nèi)核實現(xiàn)不了而是通用內(nèi)核不能把CPU分配權(quán)交給用戶態(tài)。

因此,不是線程不夠強,而是一些特定場景下協(xié)程重構(gòu)了游戲規(guī)則。

責任編輯:武曉燕 來源: 碼農(nóng)荒島求生
相關(guān)推薦

2025-05-26 02:20:00

并發(fā)協(xié)程虛擬內(nèi)存

2022-04-08 07:32:24

JavaJUCThreadLoca

2025-05-06 07:19:52

2023-10-12 09:46:00

并發(fā)模型線程

2016-10-28 17:39:47

phpgolangcoroutine

2024-06-27 07:56:49

2023-04-26 01:12:53

進程線程語言

2021-06-03 14:08:03

開發(fā)技能代碼

2021-06-04 14:28:07

協(xié)程線程Android開發(fā)

2025-06-26 04:10:00

2024-12-04 13:52:30

2021-05-24 10:55:05

Netty單機并發(fā)

2022-09-09 08:41:43

Netty服務端驅(qū)動

2020-11-29 17:03:08

進程線程協(xié)程

2023-11-24 11:15:21

協(xié)程編程

2021-09-16 09:59:13

PythonJavaScript代碼

2021-04-25 09:36:20

Go協(xié)程線程

2023-10-11 07:39:58

Java虛擬線程

2021-05-13 21:58:00

高并發(fā)應用Asyncio

2024-03-12 13:11:20

powerjob單機線程
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩欧美亚洲 | 国产大毛片 | 国产精品视频97 | av特级毛片 | 中文字幕男人的天堂 | 91福利网址 | 97精品视频在线观看 | 在线国产视频 | 久久久久久国产 | 黄a网站 | 亚洲3p| 中文字幕一区在线观看视频 | 久久久久久精 | 亚洲免费观看视频网站 | 91成人在线| av在线成人| 精品成人av | 亚洲iv一区二区三区 | 免费观看一级特黄欧美大片 | 久久综合久色欧美综合狠狠 | 免费精品 | 91精品国产91久久久久久吃药 | 日韩欧美在线免费 | xnxx 日本免费 | 日韩有码一区 | 亚洲视频免费在线播放 | 99re热精品视频国产免费 | 日本欧美大片 | 99久久免费精品国产免费高清 | 亚洲日韩中文字幕一区 | 日韩在线免费视频 | 日韩www | 手机av网| 久久午夜视频 | 四虎影院久久 | 91精品国产91久久久久久最新 | 亚洲天堂成人在线视频 | 日日干日日操 | 黄色片在线网站 | 99精品国产一区二区三区 | 一区二区三区在线 | 欧 |