Golang协程调度器

栏目: Go · 发布时间: 7年前

内容简介:Golang作为Google亲自孵化出来一门现代编程语言,可以说是吸收了众多早期编程语言的优点,又有其自己独特的设计哲学。由于其简洁的编程风格和优秀的并发编程效率,越来越多精通C++和Java的同学把Go作为自己第二,甚至是第一语言。本文打算从Go调度器(Go Scheduler)的角度讨论下Go的并发编程。什么是并行(Parallel)?在同一时刻,多件事情一起做。

说在前面

Golang作为Google亲自孵化出来一门现代编程语言,可以说是吸收了众多早期编程语言的优点,又有其自己独特的设计哲学。由于其简洁的编程风格和优秀的并发编程效率,越来越多精通C++和 Java 的同学把 Go 作为自己第二,甚至是第一语言。本文打算从Go调度器(Go Scheduler)的角度讨论下Go的并发编程。

正文

什么是并行(Parallel)?

在同一时刻,多件事情一起做。

什么叫并发处理(Concorrent)?

在一个时段内,多件事情一起做。

举个例子就是火影忍者中的鸣人影分身后产生的两个鸣人是并行,本质上产生了两个独立的鸣人;而七龙珠中孙悟空通过超高速移动产生两个残影是并发,本质上悟空还是只有一个,只是本尊以超高速移动将时间片分配在两个影子上。

并行和并发怎么体现在计算机中?

先谈谈并发,在计算机还是单处理器的时候,如果要同时运行两个程序A和B,计算机将CPU的时间切成非常细小的片,这一个时间片去执行程序A,第二个时间片去执行程序B,只要时间片切换得非常快,对于使用计算机的人来说A和B像是在同时运行,但在同一个时间片内部,CPU只能处理程序A或者程序B。

再聊聊并发,人们发现单处理器的时钟频率很难提升,如果同时运行100个程序,由于切换速度不够快,每个程序分到时间片的频率太低,表现上来看每一个程序都会变慢。既然处理器太少了,那么,就多加几个处理器,100个任务就最多有n个同时在运行,使用者会感觉到程序变快。

现代计算机,n个线程可以依附在n个独立的CPU核心上同时(并行)计算。但是CPU核心非常贵,所以常见的计算机也就4-32核。

Golang没有设置线程数量的API,调度器在并发编程上是怎么设计的?

Go调度器引入了新的并发单位——协程(goroutine)

Go底层的执行还是依赖于内核级的线程,但是Go程序中并发单元的调度,都由调度器来调度,显然,底层需要开多少个线程,也是Go调度器基于某些策略动态决定的。具体是什么样的策略,后续会聊到。

所以,Go程序本质上的性能的好坏,与Go调度器的策略算法有非常大的关系。既要避免线程开太多,频繁上下文切换消耗时间。也要避免线程数量不够,导致无法充分利用多核优势。

协程与线程有怎么样的关系?

M: Machine,可以简单理解为内核级线程,M与线程数量1:1

G: Goroutine,协程

P: Processor,处理器,每个P协调n个G在某一个M上执行。可以通过GOMAXPROCS设置P的个数。GOMAXPROCS表示最多有多少个G可以并行。

协程的阻塞有哪些情况?

Gwaitting. 内部channel或者mutex阻塞

Gsyscall. 调用了syscall(除了没有数据的NIO)

G处于Gruning状态,调度器会怎么处理其它待执行的G?

Golang协程调度器

image.png

时间片到了,自然会出让线程资源

G如果因为Gwaitting而阻塞了,调度器会怎么处理其它待执行的G?

Golang协程调度器

image.png

Golang协程调度器

Go调度器全貌

结合以上描述,

一个线程什么时候获得CPU时间,能够运行多久,是由OS线程调度器根据某种调度策略所定。这个是线程调度器。

类似得,

一个协程什么时候获得线程的时间,能够占用线程运行多久,就是Go调度器根据某种调度策略所定。这个是Go调度器。

说在后面

如果喜欢本文,请收藏后点个赞,咱们江湖再见。


以上所述就是小编给大家介绍的《Golang协程调度器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

DOM Scripting

DOM Scripting

Jeremy Keith / friendsofED / 2010-12 / GBP 27.50

There are three main technologies married together to create usable, standards-compliant web designs: XHTML for data structure, Cascading Style Sheets for styling your data, and JavaScript for adding ......一起来看看 《DOM Scripting》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器