系统线程和goroutine的区别

从栈空间上,goroutine的栈空间更加动态灵活。

每个OS的线程都有一个固定大小的栈内存,通常是2MB,栈内存用于保存线程执行期间的局部变量,且大小是固定不变的,在多变的场景下,这样固定大小的栈,既太大,又太小,往往不能满足多变的场景。
2MB固定大小的栈,对于执行简单操作的goroutine来说,是一种巨大的浪费;但对于执行高度复杂的goroutine来说,又太过于小了。为了适应不同场景,goroutine在生命周期开始时只有一个很小的栈,典型情况是2KB, 在go程序中,一次创建十万左右的goroutine也不罕见(2KB*100,000=200MB)。而且goroutine的栈不是固定大小,它可以按需增大和缩小,最大限制可以到1GB。

从调度上看,goroutine的调度开销远远小于线程调度开销。

OS的线程由OS内核调度,每隔几毫秒,硬件就发送中断到CPU,CPU调用调度器内核函数,进而引发当前线程的暂停和下个线程的运行,而线程与线程之间的切换,需要一个完整的上下文切换。由于引发内存访问数量的增加和CPU等待周期的增加,这一操作是非常耗时的。
但是Go运行的时候包含一个自己的调度器,这个调度器使用一个称为一个M:N调度技术,把m个goroutine调度到n个os线程上运行,我们可以用GOMAXPROCS来控制n的数量,Go的调度器不是由硬件时钟来定期触发的,而是由特定的go语言结构来触发的,全部在用户态实现,不需要切换到内核语境,因此调度一个goroutine比调度一个线程

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值