c实现go语言并发 go语言并发编程

Go CSP并发模型Go的CSP并发模型
Go实现了两种并发形式 。第一种是大家普遍认知的c实现go语言并发:多线程共享内存 。其实就是Java或者C等语言中的多线程开发 。另外一种是Go语言特有的c实现go语言并发,也是Go语言推荐的c实现go语言并发:CSP(communicating sequential processes)并发模型 。
CSP 是 Communicating Sequential Process 的简称c实现go语言并发,中文可以叫做通信顺序进程c实现go语言并发,是一种并发编程模型,由 Tony Hoare 于 1977 年提出 。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel 。CSP 模型的关键是关注 channel,而不关注发送消息的实体 。Go 语言实现了 CSP 部分理论。
“不要以共享内存的方式来通信,相反,要通过通信来共享内存 。”
Go的CSP并发模型,是通过goroutine和channel来实现的 。
goroutine 是Go语言中并发的执行单位 。其实就是协程 。
channel是Go语言中各个并发结构体(goroutine)之前的通信机制 。通俗的讲,就是各个goroutine之间通信的”管道“ , 有点类似于Linux中的管道 。
Channel
Goroutine
Go语言——goroutine并发模型参考c实现go语言并发:
Goroutine并发调度模型深度解析手撸一个协程池
Golang c实现go语言并发的 goroutine 是如何实现的?
Golang - 调度剖析【第二部分】
OS线程初始栈为2MB 。Go语言中c实现go语言并发,每个goroutine采用动态扩容方式c实现go语言并发,初始2KBc实现go语言并发,按需增长 , 最大1G 。此外GC会收缩栈空间 。
BTW,增长扩容都是有代价的 , 需要copy数据到新的stack,所以初始2KB可能有些性能问题 。
更多关于stack的内容,可以参见大佬的文章 。聊一聊goroutine stack
用户线程的调度以及生命周期管理都是用户层面,Go语言自己实现的,不借助OS系统调用 , 减少系统资源消耗 。
【c实现go语言并发 go语言并发编程】 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线程的栈 。
go1.10\src\runtime\proc.go
G没办法自己运行,必须通过M运行
M通过通过调度,执行G
从M挂载P的runq中找到G,执行G
go是什么编程语言?主要应用于哪些方面?Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言” 。
Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛 。BAT大厂正在把Go作为新项目开发的首选语言 。
Go语言能干什么?
1、服务端开发:以前你使用C或者C做的那些事情,用Go来做很合适 , 例如日志处理、文件系统、监控系统等;
2、DevOps:运维生态中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go语言开发;
3、网络编程:大量优秀的Web框架如Echo、Gin、Iris、beego等,而且Go内置的 net/http包十分的优秀;
4、Paas云平台领域:Kubernetes和Docker Swarm等;
5、分布式存储领域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、区块链领域:区块链里面有两个明星项目以太坊和fabric都使用Go语言;
7、容器虚拟化:大名鼎鼎的Docker就是使用Go语言实现的;
8、爬虫及大数据:Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理 。
c实现go语言并发的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言并发编程、c实现go语言并发的信息别忘了在本站进行查找喔 。

    推荐阅读