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太困了

 

posted @ 2019-10-14 21:06  森淼clover  阅读(156)  评论(0编辑  收藏  举报