Goroutine原理

Goroutine

两篇很好的文章:

http://morsmachine.dk/go-scheduler

http://www.nyankosama.com/2015/04/03/java-goroutine/

goroutine和传统的coroutine有所区别,goroutine不主动让出控制权,而是在有blocking call的情况下由scheduler取走控制权,例如io或者channel  send。所以如果在goroutine中加入一个spin lock,它就会一直占用cpu不会让出。

几个概念:

M: OS的native thread

P: 代表调度的一个context,在runtime的代码中被称为processor

G: goroutine

每一个goroutine都被加入到某个context(P)的run queue上,context在当前groutine被阻塞时会被移到一个新创建(或已有的线程池中的一个)的系统线程上。而阻塞的syscall继续在当前线程上运行,调用阻塞syscall的goroutine会被设为waiting状态,并将控制权交给scheduler继续调度,syscall的返回状态通过channel进行同步。

go已将将所有system call都wrap到了标准库中,在针对这些system call进行调用时会主动标记goroutine为阻塞状态并保存现场,交由scheduler执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 为什么Golang需要单独开发一个Goroutine? 开销问题:POSIX的thread API虽然能够提供丰富...
    Yancey_BFD阅读 9,413评论 3 8
  • Goroutine是Go里的一种轻量级线程——协程。相对线程,协程的优势就在于它非常轻量级,进行上下文切换的代价非...
    witchiman阅读 10,414评论 0 9
  • 轻量级进程模型: 用同步IO的方法写程序的逻辑,第二点是用尽可能多的并发进程来提升IO并发的能力。 核心思想,第...
    lifesoul阅读 7,668评论 4 1
  • 原文: http://morsmachine.dk/go-scheduler 为什么在内核的线程调度器之外Go还需...
    imec阅读 7,036评论 0 1
  • 我每一天都在笑 我对每一个人都会笑着打招呼 我每天都说着自恋、高傲的话语 可是 谁又知道笑着的我有多么的可笑 明明...
    伤人刺猬阅读 2,767评论 0 0

友情链接更多精彩内容