字节一面:go的协程比线程轻量,体现在哪?

01 用户态和内核态

Linux整个体系分为用户态和内核态(或者叫用户空间和内核空间), 那内核态究竟是什么呢?

本质上我们所说的内核态, 它是一种特殊的软件程序,特殊在哪?统筹计算机的硬件资源,例如协调CPU资源、分配内存资源、并且提供稳定的环境供应用程序运行。

应用程序系统调用坠入内核态。

d3d69f400fd93da0a6c78f1f90061a65.png

 

02 为什么线程切换会导致用户态和内核态的切换?

•线程是cpu调度的基本单位,进程是资源占有的基本单位。

•因为线程中的代码是在用户态运行,而线程的调度是在内核态,所以线程切换会触发用户态和内核态的切换。

•线程上下文切换的代价是高昂的:上下文切换的延迟取决于不同的因素,大概是50到100 ns左右,考虑到硬件平均在每个核心上每ns执行12条指令,那么一次上下文切换可能会花费600到1200条指令的延迟时间。

 

03导致线程上下文切换的时机

<1>. 自发性上下文切换自发性上下文切换指线程由于自身因素导致的切出
Thread.sleep()线程主动休眠
object.wait()线程等待锁
Thread.yield()当前线程主动让出CPU,如果有其他就绪线程就执行其他线程,如果没有则继续当前线程
oThread.join()阻塞发起调用的线程,直到oThread执行完毕

<2>. 非自发性上下文切换:线程由于线程调度器的原因被迫切出
线程的时间片用完
高优先级线程抢占
垃圾回收动作

04 线程切换的开销

<1>. 直接开销
保存/恢复上下文所需的开销
线程调度器调度线程的开销
<2>. 间接开销
重新加载高速缓存
上下文切换可能导致 一级缓存被冲刷,写入下一级缓存或内存
5ad5965c2784e8809e42d706e3f5e906.png

 

05 go的协程轻量级体现在哪?

如上面所述,线程切换会导致 用户态和内核态的切换,其中内核态耗时较长,且不受用户代码控制。

go将goroutine的调度维持在用户态, 这是由GPM中的P Process来完成的,做用户态任务的调度器,功能类比于常规的操作系统线程调度器,所以又被称为逻辑处理器。

45b8723820464594cdea3722035ad210.png

(1) 上下文切换代价小:  P 是G、M之间的桥梁,调度器对于goroutine的调度,很明显也会有切换,这个切换是很轻量的:只涉及PC SP DX三个寄存器的值的修改;而对比线程的上下文切换则需要陷入内核模式、以及16个寄存器的刷新。

(2) 内存占用少: 线程栈空间通常是2M, Goroutine栈空间最小是2k:

Golang可以轻松支持10W+的Goroutine运行,而线程数量达到1k,内存占用就到2G。

 

06 Go GMP调度方式

•由逻辑处理器P调度协程G进系统线程M (若本地队列没有G,从其他队列/全局队列偷取G),

•线程M执行G, 遇到[系统调用], G和M分离,拿新的M去接管原逻辑处理器P

6bd68c7e8e12e7565bf030464b9701b4.png

请仔细阅读上图,出处不可考证,感谢原图作者。

这里特意指出网络IO操作不会走上图的模型,否则要分配的系统线程M依然很多,程序很快就爆满了。这时G会和逻辑处理器P分离,并移动到netpoller,一旦网络轮询器通知网络读/写就绪,对应G就会重新分配到逻辑器处理器上来完成操作, 在此期间原系统线程M可以去做别的G。

ref

•https://blog.csdn.net/No_Game_No_Life_/article/details/106100813•https://zhuanlan.zhihu.com/p/261807834

•https://chende.ren/2020/12/27221039-008-gmp-model.html•https://studygolang.com/articles/12328

•https://www.jianshu.com/p/cc3c0fefee43

 

d2367511e86d0e562d1f2b1064a4e7e1.gif

年终总结:2021技术文大盘点  |  打包过去,面向未来

项目总结:麻雀虽小,五脏俱全

理念总结:实话实说:只会.NET,会让我们一直处于鄙视链、食物链的下游

云原生系列: 什么是云原生?

点“戳“在看

体现态度很有必要!

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有态度的马甲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值