是什么支撑了 Go 的高并发?
对于高并发,现代操作系统早就有了多进程和多线程,然而它们本身也是有缺点的。进程是独占资源的基本单元,操作系统创建、销毁进程是非常消耗资源的。线程存在于进程中,是一个执行序列,我们通常把在内核上切换线程的行为称之为上下文切换,上下文切换的代价仍然是昂贵的。
为了解决上述问题,Go 构建了自己的 PMG 模型:
M:machine ,代表一个内核线程,这个线程是操作系统来处理的,操作系统负责把它放置到一个 core 上去执行。
P:processor ,代表一个逻辑处理器,也就是执行代码的上下文环境。
G:goroutine ,代表一个并发的代码片段。
简而言之,就是 P 在 M 上执行 G 。
操作系统的线程调度发生在内核空间,而 Go 中并发的基本单元 Goroutine 存在于用户空间,其并不是由操作系统调度(Go 有自己的调度器),总之,Goroutine 比线程更加的轻量,其调度也非常高效,这便是 Go 高并发的重要原因。
推荐阅读 Scheduling In Go 系列文章:
https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part1.html
对应的中文翻译地址:https://juejin.im/post/5cdeb6cdf265da1bd605727f
本文分享自 Node Python Go全栈开发 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!