Skip to content

Commit fff479c

Browse files
author
minibear2333
committed
[*]gmp协程调度理论
1 parent 7f9c892 commit fff479c

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

interview/go.md

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@
55
### 框架
66
#### gin
77

8-
### 协程是什么?为什么协程可以创建很多?
9-
10-
11-
### 线程和协程,有什么区别
8+
### 线程和协程,有什么区别,为什么协程可以创建很多
129

1310
答者:记事本
1411

15-
线程有系统调度,协程有运行时调度
12+
线程由系统调度,协程由运行时调度
1613

1714
而为什么协程可以做到同时创建上万个,是因为go的协程初始化资源是4KB空间,比线程轻量级
1815

@@ -23,7 +20,7 @@
2320
1. 一个线程可以多个协程,一个进程也可以单独拥有多个协程。
2421
2. 线程进程都是同步机制,而协程则是异步。
2522
3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
26-
4. 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
23+
4. 线程是**抢占式**,而协程是**非抢占式的**,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
2724
5. 协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。
2825
6. 线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。
2926

@@ -46,6 +43,25 @@
4643
2. 对于CPU密集型的任务,则需要多个进程,绕开GIL的限制,利用所有可用的CPU核心,提高效率。
4744
3. 所以大并发下的最佳实践就是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
4845

46+
47+
### go协程的GMP理论
48+
49+
首先协程和线程是多对多的关系,一般是多对一,只要不涉及多线程就不涉及抢占和线程上下文切换
50+
51+
G指goroutine M thread(machine)、P(Processor处理器)
52+
53+
![](../res/2021-04-13-17-51-47.png)
54+
55+
* 在 Go 中,线程是运行 goroutine 的实体,调度器的功能是把可运行的 goroutine 分配到工作线程上。
56+
* 全局队列(Global Queue):存放等待运行的 G。
57+
* P 的本地队列:同全局队列类似,存放的也是等待运行的 G,存的数量有限,不超过 256 个。新建 G’时,G’优先加入到 P 的本地队列,如果队列满了,则会把本地队列中一半的 G 移动到全局队列。
58+
* P 列表:所有的 P 都在程序启动时创建,并保存在数组中,最多有 GOMAXPROCS(可配置) 个。
59+
* M:线程想运行任务就得获取 P,从 P 的本地队列获取 G,P 队列为空时,M 也会尝试从全局队列拿一批 G 放到 P 的本地队列,或从其他 P 的本地队列偷一半放到自己 P 的本地队列。M 运行 G,G 执行之后,M 会从 P 获取下一个 G,不断重复下去。
60+
61+
一句话:协程创建先放入P的队列,放满了把一半放G的全局队列,M顺序取P来运行,如果M没有取到(P为空)移动全局队列到P中,或者去其他P上取,所以M有调度的作用
62+
63+
引用:[Golang 调度器 GMP 原理与调度全分析](https://learnku.com/articles/41728)
64+
4965
### go的切片和数组有什么区别
5066

5167
定长声明的是数组,不定长是切片

0 commit comments

Comments
 (0)