Golang 并发原理 笔记
whatever
1. 并发
并发concurrency在有限的CPU资源上,尽可能快的执行多线程任务。对I/O密集型的计算可以使用并发提高程序性能。
- 多进程:多进程资源开销大,进程间通信成本高
- 多线程:多线程资源开销小,易于通信,但涉及线程安全、死锁等复杂问题。
2. Goroutine
采用多线程模型,但是为两级线程模型。封装系统线程(kernel)为协程Goroutine(用户及线程),调度逻辑对外透明,上下文切换为用户态,不需要线程那样在内核与用户态间进行切换。
3. G.P.M模型
G:协程,M:内核级线程的封装,数量对应真实的CPU数,P:上下文调度,G与M的调度对象,用来调度M与G的关联关系,数量 = gomaxprocs,链表方式存储。GO有一个调度器,用于调度P。
调度时,有全局变量Global Run Queue(存储Goroutine对象),里面对象分配给P的Local Run Queue,P中有多个用户的Goroutine。而G要想执行,必须通过P绑定M。
执行时,当M数量少(空闲M会Sleep),P数量多,G数量多时,会生成新的M(kse)。当M空闲时,会去其他M那里偷走一半的G,如果没什么可偷的,会睡觉。
kse:CPU调度的基本单位(M),执行时,P等待M执行完后主动告知、更新状态在栈上。
md太困了