前引
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

在这里插入图片描述