Go语言怎么天然支持并发 go语言并发之道 pdf

为什么要使用 Go 语言?Go 语言的优势在哪里1、学习曲线
它包含了类C语法、GC内置和工程工具 。这一点非常重要,因为Go语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用 。在国内大家都追求快 , 这也是为什么国内Go流行的原因之一 。
2、效率
Go拥有接近C的运行效率和接近PHP的开发效率 , 这就很有利的支撑了上面大家追求快速的需求 。
3、出身名门、血统纯正
之所以说Go语言出身名门,是因为我们知道Go语言出自Google公司,这个公司在业界的知名度和实力自然不用多说 。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑 。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途 。我们看看Go语言的主要创造者,血统纯正这点就可见端倪了 。
4、组合的思想、无侵入式的接口
Go语言可以说是开发效率和运行效率二者的完美融合 , 天生的并发编程支持 。Go语言支持当前所有的编程范式 , 包括过程式编程、面向对象编程以及函数式编程 。
5、强大的标准库
这包括互联网应用、系统编程和网络编程 。Go里面的标准库基本上已经是非常稳定 , 特别是我这里提到的三个,网络层、系统层的库非常实用 。
6、部署方便
我相信这一点是很多人选择Go的最大理由,因为部署太方便,所以现在也有很多人用Go开发运维程序 。
7、简单的并发
它包含降低心智的并发和简易的数据同步,我觉得这是Go最大的特色 。之所以写正确的并发、容错和可扩展的程序如此之难 , 是因为我们用了错误的工具和错误的抽象 , Go可以说这一块做的相当简单 。
8、稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切 。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期的各个环节的工具,如go
tool、gofmt、go test 。
Go语言——goroutine并发模型参考:
Goroutine并发调度模型深度解析手撸一个协程池
Golang Go语言怎么天然支持并发的 goroutine 是如何实现的?
Golang - 调度剖析【第二部分】
OS线程初始栈为2MB 。Go语言中Go语言怎么天然支持并发,每个goroutine采用动态扩容方式Go语言怎么天然支持并发,初始2KB,按需增长,最大1G 。此外GC会收缩栈空间 。
BTW,增长扩容都是有代价的,需要copy数据到新的stack,所以初始2KB可能有些性能问题 。
更多关于stack的内容 , 可以参见大佬的文章 。聊一聊goroutine stack
用户线程的调度以及生命周期管理都是用户层面,Go语言自己实现的,不借助OS系统调用,减少系统资源消耗 。
Go语言采用两级线程模型,即用户线程与内核线程KSE(kernel scheduling entity)是M:N的 。最终goroutine还是会交给OS线程执行,但是需要一个中介,提供上下文 。这就是G-M-P模型
Go调度器有两个不同的运行队列:
go1.10\src\runtime\runtime2.go
Go调度器根据事件进行上下文切换 。
调度的目的就是防止M堵塞,空闲,系统进程切换 。
详见Golang - 调度剖析【第二部分】
Linux可以通过epoll实现网络调用,统称网络轮询器N(Net Poller) 。
文件IO操作
上面都是防止M堵塞 , 任务窃取是防止M空闲
每个M都有一个特殊的G,g0 。用于执行调度,gc,栈管理等任务,所以g0的栈称为调度栈 。g0的栈不会自动增长,不会被gc,来自os线程的栈 。

推荐阅读