为什么Go高并发吊打Java

本文探讨了Go语言为何在高并发场景下优于Java,关键在于其轻量级的协程(Goroutine)和GMP模型。协程在用户态执行,减少了线程切换的开销。GMP模型通过P(Processor)、M(线程)和G(协程)的交互,实现了工作窃取算法和hand off机制,有效提高了资源利用率。
摘要由CSDN通过智能技术生成

为什么?因为设计线程模型M:N,协程大杀器,无论在单个占用内存,还是切换成本,还是GMP的设计,从Go诞生开始,就是为高并发而生。

协程

协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

背景

Process(进程) -> Thread(LWP,lightweight process轻量级进程)——CPU调度的最小单位 -> Goroutine(lightweight userspace thread轻量级用户空间线程)——用户态
从进程到协程,就是不断共享,减少切换成本的过程。到了协程已经完全是由程序所控制,在用户态执行,不像线程切换一样耗费资源。多个协程在一个线程中执行。

协程结构体和切换函数

一个协程代表一个执行流,执行流包含有需要执行的函数、函数的入参、当前执行流的状态和进度(对应CPU的PC寄存器和SP寄存器),还有保存状态的地方,用于执行流恢复。(因为不涉及线程栈,所以栈空间很小默认2kb)

有了执行流的形式后,用户系统基本就可以模拟CPU切换的过程。问题是待运行的协程呢?在哪排队呢?

GM模型

在Go1.0的时候,调度队列schedt是全局的,要共同竞争一把锁。每个CPU绑定一个Mÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值