并发和并行的区别_Go并发(一):go语句篇

转自本同步公众号:“灰子学技术”
原文链接: https:// mp.weixin.qq.com/s/FD-M P9r5sEn1QYRAYZE_4g

go 语句是Go语言中新增的关键字,用来实现 goroutine的这种并发操作,C++中并没有这种操作操作,C++中的并发操做采用的是多线程,而本作者觉得,go的这种原理其实于线程池是有些类似的。(备注关于C++的线程池部分,后续在做整理。)

一、并发和并行区别

并发:逻辑上具有处理多个任务的能力。一般并发的数量要小于CPU的数量,这些并发的任务通过间隔执行的方式来执行,这里一般是在单核CPU上面。

并行:物理上具备处理多个任务的能力。物理CPU的核数和并行的任务数相同,是并发的理想目标,理论上同一时刻内一个CPU执行一个任务。

二、线程,进程和协程的区别

进程:是系统资源分配的最小单位,系统是由一个个进程组成的,包括文本区,数据区和堆栈区。进程的创建和销毁都比较消耗资源和时间。进程是抢占式的争夺CPU的资源,单核CPU在同一时刻只能有一个进程在执行。

线程:是CPU调度的最小单位,线程属于进程,它共享进程的整个内存空间。多线程是不安全的,进程内的一个线程崩溃会导致整个进程崩溃。

线程的切换除了不用做1)切换页目录以使用新地址之外(进程需要),依然要2)切换内核栈,3)切换硬件上下文。

协程:协程是属于线程的,协程的程序是在线程里面跑的。协程没有线程的上下文切换,协程的切换是程序员自己控制的。协程是原子操作的,不存在代码执行一半,被终止的情况。

三、go 的调度机制

https://mp.weixin.qq.com/s/hTgIyJN7p-wrDfLj1bP1wQ

四、Go的编程例子

go 最简单的并发例子,在Main进程的退出的时候,不管goroutine是不是执行完成,都会强制退出。

b194dde5b820e29f672e8e97a60a2e2e.png

40609e5f9ccc6ef98b41eb47712fc8da.png

等待单个任务结束,可以使用通道进行阻塞,然后发出退出信号。

f51cc9e962efad0e71b27c3335700e73.png

40609e5f9ccc6ef98b41eb47712fc8da.png

等待多个任务结束,可以使用sync.WaitGroup,通过计数器,来控制。

93887abddefe5b00449edfda511e8d13.png

40609e5f9ccc6ef98b41eb47712fc8da.png

参考资料

进程、线程和协程的概念

《Go语言学习笔记》

golang的goroutine调度

go语言之行--golang核武器goroutine调度原理、channel详解

灰子学技术公众号,欢迎订阅,评论,关注,相互学习!

f400924f123eb4c42d62d2f5d8f375ef.png

40609e5f9ccc6ef98b41eb47712fc8da.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值