golang 并发二(调度)

色狼叔叔来了 · · 1573 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang 并发二(原理)

每个操作系统都有一个固定大小的栈内存,用户保存函数的局部变量。但是空能会这个固定大小显然不太灵活。而goroutine在生命周期开始时申请一个很小的栈,与操作系统线程类似,用于保存函数调用期间的局部变量。本质区别是它的大小不是固定的,可以按需增大和缩小。

操作系统线程由内核进行调度,每隔几秒,cpu调用内核函数,暂停正在运行的线程,并将执行信息保存到内存,之后找到下一个需要执行的线程,然后从内存中恢复执行信息,最后执行线程。由于保存了一个线程的状态到了内存,并且从内存恢复了另一个线程的状态,所以进行了上下文切换。这是一个比较慢的过程。

go运行时包含一个自己的调度器,可以调用m个goruotine到n个操作系统线程,与操作系统线程调度不同的是,go调度器不是由时钟来决定的,而是有特定的go语言结构触发的。

java当中每一个线程都有一个独特的标识,但是goroutine没有提供可供程序员访问的标识。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:色狼叔叔来了

查看原文:golang 并发二(调度)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1573 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传