概览
这些内容本身是昨天看的,但是没有做记录,今日来,也忘了些许;在golang中GMP这部分知识感觉还是比较难懂,但是还是要写下自己的一些只言片语理解。
1. 什么事GMP
- G 指的goroutine
- M 指的是系统级线程
- P 指的是使用核心数,可以通过
runtime.GOMAXPROCS()
中的数,默认情况下它的数是机器的核心数,我们可以通过上面的指令手动设置。
2. 什么是goroutine?
首先,我要知道协程-corountine;它是用户级线程;由应用创建管理;它是在用户态下;因此不是普通的线程受操作系统直接管理;
在linux中叫做纤程;在go中实现的我们称之为gorountine,也就是 go + corountine
;
3. gorountine有什么特点
- 它很轻量,初始大小只有2kb左右;而线程在2M;
- 虽然它初始很小,但是它的容量是可以扩展的,最大可以大GB;所以还是要注意gorountine的数量
- 它在用户态下创建,因此它的创建销毁由go调度器直接控制,不经过操作系统控制
4. GMP之间的关系
P的个数我们非常容易理解,一个台机器就那么几个核心;
这里主要说明的是G和M的关系;
他们是一种m:n的关系,啥意思?m个gorountine映射到n个线程上;为啥要这样设计;最大的压榨机器性能;提高并发能力;1:1 / n : 1 都有很大的缺点;这种涉及结合了两种的优点,但也最为复杂;
下面尝试阐述下运行流程:
- 一个gorountine创建后,先看P的本地队列是否能存放,如果能则存入,如果不能则放入全局P队列
- M要执行需要先获取到P,获取到P后,从P的本地队列中领取goroutine来执行;如果本地没有则全局,如果还没有则偷;本地>全局>偷
- 如果M执行gorountine队列过程中遇到阻塞,则直接换下一个gorountine;将阻塞的放回本地队列等待下次执行;因此gorountine阻塞不会阻塞M
网友评论