golang select default continue_golang 面试入门(一)

Golang(Go) 是由Google开发的静态强类型的编译型的高级语言。Golang 支持跨平台编译(但不支持CGO)。

golang目前整理到常见面试点如下图所示,这篇文章主要讲解简单golang的并发机制。

648b3fc6c1d9718b7e1050a2593c32c8.png

目前Golang实现并发是用goroutine来实现的,goroutine简单来说是协程,一种轻量级的线程,线程又可以简单理解为一种轻量级的进程,关于进程和线程间的关系,会另开操作系统文章进行介绍。goroutine的实现方式目前主要用GPM模型来描述。GPM其中G是指Goroutine,P是指Process(逻辑调度器),M是指Machine。

下面是简单的定义解释:

M:代表真正的内核OS线程,和POSIX里的thread差不多,真正干活的人。
G:代表一个goroutine,它有自己的栈,instruction pointer和其他信息(正在等待的channel等等),用于调度。
P:代表调度的上下文,可以把它看做一个局部的调度器,使go代码在一个线程上跑,它是实现从N:1到N:M映射的关键。
goroutine简单实现原理如下:

首先M简单来说是计算资源,方便记忆的话就认为是计算机的线程,P则是一个调度器,默认数量为计算机CPU内核的数量,这样可以最大化计算机的性能,每个P都有它自己的调度队列,用来存储等待执行的goroutine代码块G。还有一个全局队列存储G,通过上下文(context)来支撑调度,具体调度过程如下:当M对应P的调度队列执行完所有G后,它就会去全局队列去获取 G,如果仍然获取不到则会去其他P中调度队列中获取G,一般为被获取队列的数量的一半,如果多次获取失败,则P结束并释放相应的M,这个是通过上下文(context)来实现。而线程阻塞则是通过channel来改变goroutine的状态来实现。

fb853845ce8986a7b1b538ebfdaaa981.png

channel :

channel 是由go提供用于 gorutine之间通讯的数据结构,是用环形队列来实现的。

Go channel 带缓存和不带缓存的区别:

如果channel 不带缓存即没有设置容量,或者容量设置为0, 则只有sender和receiver都准备好了后它们的通讯(communication)才会发生阻塞(Blocking)。如果设置了缓存,就有可能不发生阻塞, 只有buffer满了后 send才会阻塞, 而只有缓存空了后receive才会阻塞。一个nil channel不会通信。

go 用于并发一些常用的关键字:

select : 它与switch 相似,但select是用于进程间的通讯,所以它的case一般是三种:send(chan <- data),receive( <- chan)还有default。而且支持超时处理用于出现阻塞的情况。

range: 它可以用来读取channel正在发生中的值,直到该channel被关闭。

稍微总结下, golang的并发实现是基于CSP(communicating sequential processes)理论,既然DO NOT COMMUNICATE BY SHARING MEMORY; INSTEAD, SHARE MEMORY BY COMMUNICATING.翻译过来就是“不要以共享内存的方式来通信,相反,要通过通信来共享内存。”相对于C++,Java等语言并发模型用共享内存并加锁的方式来实现进程通讯,golang的并发是线程安全的。

水平有限,还请多多指教。

参考资料:

Golang 的 goroutine 是如何实现的?​www.zhihu.com
3666c48b714a985c0b1682998753d89f.png
皮拉图斯:go runtime 简析​zhuanlan.zhihu.com
bfe37ab77f8898f31f0e831eb0b80aa2.png
Go Channel 详解 | 菜鸟教程​www.runoob.com Golang 的 goroutine 是如何实现的?​www.zhihu.com
7a2e9d97dd41121cb83fbcb0c166f005.png
golang并发原理剖析_Java_zhongcanw的博客-CSDN博客​blog.csdn.net
2a26606412b77685ae17dd1d300b3935.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值