2023-11-16日记golang GMP

2023-11-17  本文已影响0人  护念

概览

这些内容本身是昨天看的,但是没有做记录,今日来,也忘了些许;在golang中GMP这部分知识感觉还是比较难懂,但是还是要写下自己的一些只言片语理解。

1. 什么事GMP

2. 什么是goroutine?

首先,我要知道协程-corountine;它是用户级线程;由应用创建管理;它是在用户态下;因此不是普通的线程受操作系统直接管理;

在linux中叫做纤程;在go中实现的我们称之为gorountine,也就是 go + corountine;

3. gorountine有什么特点

  1. 它很轻量,初始大小只有2kb左右;而线程在2M;
  2. 虽然它初始很小,但是它的容量是可以扩展的,最大可以大GB;所以还是要注意gorountine的数量
  3. 它在用户态下创建,因此它的创建销毁由go调度器直接控制,不经过操作系统控制

4. GMP之间的关系

P的个数我们非常容易理解,一个台机器就那么几个核心;

这里主要说明的是G和M的关系;
他们是一种m:n的关系,啥意思?m个gorountine映射到n个线程上;为啥要这样设计;最大的压榨机器性能;提高并发能力;1:1 / n : 1 都有很大的缺点;这种涉及结合了两种的优点,但也最为复杂;

下面尝试阐述下运行流程:

  1. 一个gorountine创建后,先看P的本地队列是否能存放,如果能则存入,如果不能则放入全局P队列
  2. M要执行需要先获取到P,获取到P后,从P的本地队列中领取goroutine来执行;如果本地没有则全局,如果还没有则偷;本地>全局>偷
  3. 如果M执行gorountine队列过程中遇到阻塞,则直接换下一个gorountine;将阻塞的放回本地队列等待下次执行;因此gorountine阻塞不会阻塞M
上一篇 下一篇

猜你喜欢

热点阅读