go并发跟并行的理解

go并发:

通常程序会被编写成一个顺序执行的独立执行代码,这被称为串行程序。
并行执行两个及以上的串行程序的综合体成为并发程序。
Go语言中并发指的是让某个函数独立于其他函数运行的能力。
当一个函数创建为goroutine时(即,函数前面加关键字go),Go会将其视为一个独立的工作单元,这单元会先放到全局运行队列中,等待Go运行时的调度器进行调度,把他们分配给其中的一个逻辑处理器,并放到这个逻辑处理器对应的本地运行队列中,等待逻辑处理器执行。这一套管理、调度、执行goroutine的方式称之为Go的并发。

并发与并行:

对于并发来说,就是go语言本身自己实现调度,对于并行来说,是和运行的电脑的物理处理器的核数有关的,多核就可以并行并发,单核只能并发了。
从概念上,并发和并行是不同的:
并行:指让不同的代码片段同时在不同的物理处理器上执行。
并发:指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了,其宗旨:“使用较少资源做更多事情”。
列个队列,一个处理器处理,那是并发。
两个队列,两个处理器处理,那是并行。

runtime.GOMAXPROCS()表示分配逻辑处理器给调度器使用,默认值为:runtime.NumCPU(),go默认给每个物理处理器都分配一个逻辑处理器。
runtime.NumCPU()获取本机逻辑Cpu数量,不是物理cpu,比如一个双核cpu,带有超线程技术,则被认为是四个逻辑cpu。
wg.Add(2):表示要等待两个goroutine。
wg.Wait():表示等待goroutine们结束。
wg.Done():表示通知main函数当前goroutine工作已经结束。

如果当前goroutine不发生阻塞,他说不会让出cpu给其他goroutine的,而如果使用sleep或Gosched函数,则阻塞掉了当前goroutine,当前goroutine会主动让其他goroutine执行,形成并发。
记住,只有在多个逻辑处理器且可以同时让每个goroutine运行在一个可用物理处理器上的时候,goroutine才会并发执行,否则就可能是并行。

https://www.cnblogs.com/shijingxiang/articles/11465460.html

标题Go并发能力为什么那么强,(goroutinue调度器模型?)

没有共协程调度器之前,操作系统调度物理线程,效率很低下,所以go要自己写个调度器,提供并发效率。Go的调度器用的是多对多的调度模型,多个用户协程同时作用多个物理线程下面。线程是物理态,协程是逻辑态,
操作系统线程,即cpu线程,即物理线程。
一个物理线程执行在一个cpu的内核上下文上面,而多个协程共享一个cpu内核的上下文资源。

CPU指令在栈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心码农1号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值