Goroutine 存在的意义是什么?

系统
goroutine是用户态线程,其创建和切换都在用户代码中完成而无需进入操作系统内核,所以其开销要远远小于系统线程的创建和切换。

[[428010]]

线程其实分两种:

  • 一种是传统意义的操作系统线程
  • 一种是编程语言实现的用户态线程,也称为协程,在 Go 中就是 goroutine

因此,goroutine 的存在必然是为了换个方式解决操作系统线程的一些弊端 -- 太重 。

太重表现在如下几个方面:

第一:创建和切换太重

操作系统线程的创建和切换都需要进入内核,而进入内核所消耗的性能代价比较高,开销较大;

第二:内存使用太重

一方面,为了尽量避免极端情况下操作系统线程栈的溢出,内核在创建操作系统线程时默认会为其分配一个较大的栈内存(虚拟地址空间,内核并不会一开始就分配这么多的物理内存),然而在绝大多数情况下,系统线程远远用不了这么多内存,这导致了浪费;

另一方面,栈内存空间一旦创建和初始化完成之后其大小就不能再有变化,这决定了在某些特殊场景下系统线程栈还是有溢出的风险。

相对的,用户态的goroutine则轻量得多:

 

  • goroutine是用户态线程,其创建和切换都在用户代码中完成而无需进入操作系统内核,所以其开销要远远小于系统线程的创建和切换;
  • goroutine启动时默认栈大小只有2k,这在多数情况下已经够用了,即使不够用,goroutine的栈也会自动扩大,同时,如果栈太大了过于浪费它还能自动收缩,这样既没有栈溢出的风险,也不会造成栈内存空间的大量浪费。

 

责任编辑:武晓燕 来源: Go编程时光
相关推荐

2021-09-06 08:55:16

软件开发 架构

2010-06-21 09:18:26

anacron服务

2022-05-11 08:53:13

MySQL锁机制

2020-11-04 13:01:38

FastThreadLocalJDK

2012-08-15 09:20:29

数据中心软件定义网络openflow

2021-02-25 10:20:26

Java接口代码

2022-01-17 16:02:32

区块链私有链数据库

2009-07-22 10:13:30

2018-03-29 13:00:01

2020-07-15 10:28:18

区块链个人数据可信数据做对比

2021-09-10 17:02:43

Python协程goroutine

2018-01-09 15:18:08

2015-11-03 09:59:10

程序员鼓励师

2013-03-08 10:07:20

GO语言Goroutine

2017-05-08 16:13:33

深度学习神经网络深度

2018-04-02 13:10:41

2021-11-16 19:17:14

零信任网络安全网络攻击

2010-01-28 15:38:57

学习C++意义

2017-03-21 23:29:44

DevOps运维开发

2023-10-29 16:37:23

Goroutine泄露
点赞
收藏

51CTO技术栈公众号