Kauruus 最近的时间轴更新
Kauruus

Kauruus

V2EX 第 328201 号会员,加入于 2018-07-10 15:19:04 +08:00
Kauruus 最近回复了
3 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@lesismal

> 而一个 golang 进程首先是进程自己有一组(1-N 个)用户态线程, goroutine 是基于用户态线程之上的应用层语言 runtime 自己进行调度的, 最大的区别, goroutine 可不是由内核调度的。

“这组线程”就是内核线程,有对应内核调度实体,Goroutine 才是“用户态线程”。

这是非常普遍的 M:N 调度模型。M 个 Goroutine/Green thread/virtual thread/ 调度到 N 个内核调度实体上。

当然 Go 为了方便迁移 Goroutine ,还有个 P 的概念,不影响 M:N 的关系。

按照你的说法,就变成 M:N:O 三层了。
3 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333 Go 运行时不是会调度 goroutine 吗?

> 它更像是单纯的线程 配合 channel 调度才能对标虚拟线程或线程池

你不用 channel 它也会被运行时调度到物理线程上执行呀,运行时内部也有队列呀。
3 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333

virtual thread 和 goroutine 是一个可以被调度的实体,或者说是用户态线程,有自己的栈。

channel ,BlockingQueue 这些是消息通讯机制。

然后调度器都是队列,把用户态线程调度到物理线程。

所以我没明白你说的 “这虚拟线程对标 go 应该是 goroutine+channel”。
3 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333 感觉 java 的 ThreadPoolExecutor 才是你说的 goroutine + channel ,一个线程池 + 队列执行任务。

Thread.startVirtualThread 和 go 一样是“使劲狂分资源”,然后给调度器(里面自然是有个队列的)调度,virtual thread/goroutine 遇到阻塞的时候把执行权给会调度器( Go 也有抢占调度,不知道 virtual thread 有没有),让它调度下一个 virtual thread/goroutine 。
3 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
所以一个 goroutine 大约用 (2641592 - 3644) / 1000000 = 2.64 KB 内存?应该还有些 timer 的消耗在里面。

然后 Java virtual thread 是 (1117640 - 46304) / 1000000 = 1.07 KB ?是因为默认的栈更小还是其他原因?
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5332 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 14ms · UTC 01:18 · PVG 09:18 · LAX 17:18 · JFK 20:18
Developed with CodeLauncher
♥ Do have faith in what you're doing.