golang 面试之协程比线程更轻量级?

2020-06-04 20:21:15 +08:00
 xmge

最近在 golang 面试,一般都会设计到为什么 go 语言更好地支持高并发,

答:在高并发场景下,创建一个协程比创建一个线程消耗的资源少很多,一般线程创建需要 8Mb,而协程只需要 2kb,所以在同性能的服务器下,协程可以支持更多的并发量。

有的面试官就会问:协程比线程为什么少占这么多资源?

h 在网上搜索相关文章,并没有找到很直接,很具体的说法,

是不是只有我一个人不知道啊,望知道的大佬给普及下,感谢....

7319 次点击
所在节点    程序员
42 条回复
Austaras
2020-06-04 20:58:55 +08:00
<amp-youtube data-videoid="-K11rY57K7k" layout="responsive" width="480" height="270"></amp-youtube>
neoblackcap
2020-06-04 22:05:01 +08:00
goroutine 只是在用户态创建一个数据结构,然后给它分配对应的堆。内核里面是没有对应的线程对象创建的,显然就低很多了
CEBBCAT
2020-06-04 23:15:02 +08:00
GMP,请。

这个问题其实是有点点难度的,首先要了解线程开销,然后还要明白 Go 是怎么调度协程的。对于进程上下文、kernel&CPU 工作原理应该都要有了解吧
CEBBCAT
2020-06-04 23:15:30 +08:00
@CEBBCAT 我记得加了“其实我也是菜鸡”的,怎么发出来没有了。。。
sadwin
2020-06-04 23:31:05 +08:00
一言蔽之:协程不是内核线程,是 runtime 自己支持的调度机制,本质上是单线程
ke1e
2020-06-04 23:32:28 +08:00
因为它只是个数据结构
wellsc
2020-06-04 23:38:41 +08:00
建议买本操作系统的书看看
lasuar
2020-06-04 23:51:45 +08:00
这个问题就要深入了解 go 的两级线程调度模型了,简单来说 go 是自己的 runtime 中实现了用户线程和系统线程的相互转换调度的过程,其他大部分语言的用户线程基本都是直接 1:1 系统线程,线程调度交给了内核,而 go 的用户线程与内核线程的配比是 M:N,go 在这两种线程之间的转换调度做了不少工作,正式这个做了这个优化才使得 go 的用户线程相比于其他语言的用户线程而言是十分轻量的。
chihiro2014
2020-06-05 00:07:03 +08:00
其实感觉就是个 Java 中的单线程线程池(讲的不对,但感觉就是这么一回事)
linvon
2020-06-05 00:09:50 +08:00
GMP 调度模型, 用户态调度与内核态调度的区别,动态栈增长
gdt
2020-06-05 00:18:43 +08:00
协程上下文切换不需要切换到内核态,上下文切换的代价小。
gdt
2020-06-05 00:20:07 +08:00
为什么协程切换的代价比线程切换低? - 暗淡了乌云的回答 - 知乎
https://www.zhihu.com/question/308641794/answer/572499202
gdt
2020-06-05 00:23:04 +08:00
为什么协程切换的代价比线程切换低? - 张凯(Kyle Zhang)的回答 - 知乎
https://www.zhihu.com/question/308641794/answer/570701196
snxq1995
2020-06-05 00:41:48 +08:00
协程是用户态的,线程是内核态的。内存占有小
协程是 go 运行时调度,线程是系统调度。切换成本小。
sagaxu
2020-06-05 00:51:08 +08:00
一般线程创建需要 8Mb 吗?

即便笨重如 Java,一个线程也就 1M
wangyzj
2020-06-05 01:16:43 +08:00
不是 epoll 吗?
ppphp
2020-06-05 01:51:27 +08:00
楼上说的很对,M:N 的模型保证了它的性能和足够好用,其实这个实现起来并不容易
vk42
2020-06-05 05:30:48 +08:00
线程创建要 8MB ???进程表示瑟瑟发抖……
hercule
2020-06-05 07:39:56 +08:00
这么多人回答,连问题点都没理解到,别人说的为什么协程比线程资源占用少,不是什么调度机制,什么内核态用户态
hercule
2020-06-05 07:40:12 +08:00
虽然我也不知道答案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678713

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX