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

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

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

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

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

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

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

7359 次点击
所在节点    程序员
42 条回复
chanchancl
2020-06-05 17:39:23 +08:00
Golang 中,创建一个协程,仅仅是在用户态下创建一个 Goroutine 数据结构
而一般的线程,则要到内核态去创建,这之间就涉及到 CPU 在两个状态之间的转换。

其次 GMP 调度中,G 的调度始终是由 M 来完成的,M 由依赖于后面实际绑定的 P
P 一般来说就是原生的线程了。在 M 调度不同的 G 也就是 Go routine 时,
不需要从用户态切换到内核态,只需要将 Go routine 的上下文保存,并从自身队列或者全局队列寻找需要调度的 G,
如果由,则进行调度,没有,则在积累一定次数之后,解除与 P 的绑定,并休眠,等待一些 singal 的触发。

本质上来说就是楼上很多人讲的多核:多线程的 M:N 模型,所以调度效率较高,使用的资源较少
Jony4Fun
2020-06-06 21:07:07 +08:00
@ylsc633 好强!感觉很给力

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

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

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

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

© 2021 V2EX