Go并发GoGo
并发vs并行
concurrency
CPU
parallellism
CPUCPU
Go的CSP并发模型
Go
JavaC++GoGoCSP(communicating sequential processes)
CSPCSP
Do not communicate by sharing memory; instead, share memory by communicating.
不要以共享内存的方式来通信,相反,要通过通信来共享内存。
JavaC++Pythonjava.util.concurrent
Go
Go的CSP并发模型
Gogoroutinechannel
goroutineGochannelGogoroutinegoroutineLinux
goroutinego
go func(){
...
}()
通信机制
channelchannel <- data<-channelchannel <- data<-channelgoroutinegoroutine
sleep
通信过程
goroutinechannel
goroutine1channelgoroutine1goroutine2goroutineGolangCSP
Go并发模型的实现原理
CPUI/O
KSE
用户级线程模型
如图所示,多个用户态的线程对应着一个内进程(核线)程,用户级线程的创建、终止、切换或者同步等线程工作必须自身来完成。
内核级线程模型
这种模型直接调用操作系统的内核线程,所有线程的创建、终止、切换、同步等操作,都由内核来完成。C++就是这种。
用户级+内核级线程模型
1 1
GogoroutineMPG
Go线程实现模型MPG
说起Go的线程实现模型,有三个必知的核心元素,它们支撑起了这个模型的主框架。
M:machineMP:processorPGoG:goroutineGGo
GPMMPGPGrunqG
MMPPGPGgoroutine
PProcessor)GOMAXPROCSruntime.GOMAXPROCS()
ProcessorgoGoroutine
PGoroutineGoroutineGoroutinerunqueues
三者关系的宏观的图为:
MKSEMGoruntime systemMMKSEMKSEMPPGMGGMP
调度G
抛弃P(Processor)
PPGoroutinerunqueuesM
P
sysallMPGgoroutineM
M0G0syscallM1M0PsyscallM1PGgoroutine
syscallM0PM0G0gouroutinerunqueuerunqueuePG runqueueGgoroutinePrunqueueGgoroutinerunqueuegoroutines
G负载均衡
Pgoroutinegoroutinegoroutinegoroutinegoroutine
Prunqueue偷
PGgoroutinePMPGgoroutinePgoroutine
goP