深圳英文网站建设公司,wordpress百度贴吧,男男做h的视频网站,网站建设服务器对比谈到 goroutine#xff0c;绕不开的一个话题是#xff1a;它和 thread 有什么区别#xff1f;
参考资料【How Goroutines Work】告诉我们可以从三个角度区别#xff1a;内存消耗、创建与销毀、切换。
内存占用
创建一个 goroutine 的栈内存消耗为 2 KB#xff0c;实际运…谈到 goroutine绕不开的一个话题是它和 thread 有什么区别
参考资料【How Goroutines Work】告诉我们可以从三个角度区别内存消耗、创建与销毀、切换。
内存占用
创建一个 goroutine 的栈内存消耗为 2 KB实际运行过程中如果栈空间不够用会自动进行扩容。创建一个 thread 则需要消耗 1 MB 栈内存而且还需要一个被称为 “a guard page” 的区域用于和其他 thread 的栈空间进行隔离。
对于一个用 Go 构建的 HTTP Server 而言对到来的每个请求创建一个 goroutine 用来处理是非常轻松的一件事。而如果用一个使用线程作为并发原语的语言构建的服务例如 Java 来说每个请求对应一个线程则太浪费资源了很快就会出 OOM 错误OutOfMermoryError。
创建和销毀
Thread 创建和销毀都会有巨大的消耗因为要和操作系统打交道是内核级的通常解决的办法就是线程池。而 goroutine 因为是由 Go runtime 负责管理的创建和销毁的消耗非常小是用户级。
切换
当 threads 切换时需要保存各种寄存器以便将来恢复 16 general purpose registers, PC (Program Counter), SP (Stack Pointer), segment registers, 16 XMM registers, FP coprocessor state, 16 AVX registers, all MSRs etc. 而 goroutines 切换只需保存三个寄存器Program Counter, Stack Pointer and BP。
一般而言线程切换会消耗 1000-1500 纳秒一个纳秒平均可以执行 12-18 条指令。所以由于线程切换执行指令的条数会减少 12000-18000。
Goroutine 的切换约为 200 ns相当于 2400-3600 条指令。
因此goroutines 切换成本比 threads 要小得多。
本文节选于Go合集《Go 语言问题集》GOLANG ROADMAP 一个专注Go语言学习、求职的社区。