Goroutine调度器及面试精选

Goroutine调度器

Go语言在并发编程有着非常强大的能力,讲到调度器,我们的话题离不开操作系统、进程与线程这些概念,在学习操作系统时,线程是操作系统调度的最基本单元。

在没有学习Go语言之前,线程之间通信,通过内存共享可以实现,但是在调度时每个线程都会占用1M以上内存空间,还有恢复寄存器中内容也需要向操作系统申请或销毁资源,这样会有较大额外开销。

在Go语言中,不需要通过共享内存来通信,而是通过通信来共享内存,这也是Go语言最重要的编程理念。这样的话,Go调度器对Goroutine的上下文切换就减少额外开销了。

Go 调度器概念

  • G(Goroutine) — 表示 Go协程,它是一个待执行的任务或代表一个Goroutine对象;

  • M(Machine) — 表示操作系统的线程,它由操作系统的调度器调度和管理;

  • P(Processor) — 表示处理器,它可以被看做运行在线程上的本地调度器;

M必须拥有P才可以执行G中的代码,P含有一个包含多个G的队列,P可以调度G交由M执行。P的个数在启动时就决定,默认是使用等同CPU的数量,又因为M必须持有一个P才能运行Go代码,所有M个数一般也是等同于CPU个数,以达到尽可能的使用CPU而又不至于产生过多的线程切换开销,这样就大大降低操作系统和硬件的负载。P的个数,可以使用runtime.GOMAXPROCS()来设置个数,当在IO密集的场景下可以自行设置来提高性能。

Go 语言的调度器是一个非常复杂机制,看了Go源码,虽然有很多注释,但是对于工作经验不足或刚入门Go开发来说,我们还是需要多多的深研究,还有很多细节需要去学习,比如,调度器的设计原理:

  • 在早起0.x版本中Go语言调度器是单线程调度器,由G-M模型组成,还有P这个概念;
  • 经过不断优化与设计,到1.0版本就引入多线程调度器,但是出现全局锁导致竞争严重;
  • 到1.1版本,引入处理器P,然后就构成GMP模型;
  • 到Go 1.2 加入抢占式调度器;以及到1.14版本引入基于信号量的抢占式调度器

面试题:

  1. Go 中的GMP模型了解吗?

  2. GMP模型Go有几种状态?(空闲、待运行、运行中、系统调用、等待中、已停止及栈复制中)

  3. 为什么Go能提高性能,与进程和线程有什么区别?

    • 线程和进程会导致CPU额外开销大,切换线程上下文及申请销毁都需要额外开销;
    • 线程占用内存一般是固定为2M内存空间;
    • Go 栈内存是可变的,初始的时候一般为2KB,最大可扩展为1GB;
    • Go 自己实现的调度器,所以创建和销毁开销小;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容