😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go真实面试题汇总系列

    • 《调度模型篇》
  • 宝典内容

    • 5.Go的GMP模型?
    • 22. 讲一讲 GMP 模型
    • 42. gmp当一个g堵塞时,g、m、p会发生什么
    • 63. golang并发模型
    • 64. golang gmp模型,全局队列中的G会不会饥饿,为什么?P的数量是多少?能修改吗?M的数量是多少?
    • 67. 服务器能开多少个M由什么决定
    • 68. 服务器能开多少个P由什么决定
    • 69. M和P是怎么样的关系
    • 70. 同时启动了一万个G,如何调度?
    • 99. P和M的数量一定是1:1吗?如果一个G阻塞了会怎么样?
    • 112. 看你会golang,讲下go的协程模型?(GPM模型)
    • 121. GMP中,M的数量怎么控制,P呢?
    • 129. 知道go的抢占式调度吗?goroutine泄漏?
    • 162. 为什么 GPM 模型会更快
    • 165. golang怎么操作内核线程
    • 174. 为什么P的local queue可无锁访问,任务窃取的时候要加锁吗?
    • 199. GPM调度模型
    • 224. 一个协程挂起换入另外一个协程是什么过程?
    • 229. go语言中的GMP、defer、匿名defer函数、defer执行流程
    • 234. 协程底层怎么实现?
    • 235. go的调度
    • 282. GMP并发模型 goroutine切换的时候上下文环境放在哪里
    • 285. golang的MPG模型,goroutine和线程的区别
    • 344. golang调度能不能不要p
    • 353. 介绍go语言的gmp协程调度模
    • 396. Go如何调度,假设4核的cpu应该有几个线程或者说有几个M,那能有几个groutinue,groutinue数量的上限是多少?
    • 402. gmp模型中一定要有p吗
    • 403. 了解gmp模型的全局队列和本地队列吗
    • 428. go调度中阻塞都有那些方式
    • 434. gmp具体的调度策略

😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

428. go调度中阻塞都有那些方式


企业题库解析小组

题目来源: 滴滴

频次: 1

答案:苦痛律动

  1. 由于原子、互斥量或通道操作调用导致 Goroutine 阻塞,调度器将把当前阻塞的 Goroutine 切换出去,重新调度 LRQ 上的其他 Goroutine;
  2. 由于网络请求和 IO 操作导致 Goroutine 阻塞。Go 程序提供了网络轮询器(NetPoller)来处理网络请求和 IO 操作的问题,其后台通过 kqueue(MacOS),epoll(Linux)或 iocp(Windows)来实现 IO 多路复用。通过使用 NetPoller 进行网络系统调用,调度器可以防止 Goroutine 在进行这些系统调用时阻塞 M。这可以让 M 执行 P 的 LRQ 中其他的 Goroutines,而不需要创建新的 M。执行网络系统调用不需要额外的 M,网络轮询器使用系统线程,它时刻处理一个有效的事件循环,有助于减少操作系统上的调度负载。用户层眼中看到的 Goroutine 中的“block socket”,实现了 goroutine-per-connection 简单的网络编程模式。实际上是通过 Go runtime 中的 netpoller 通过 Non-block socket + I/O 多路复用机制“模拟”出来的。
  3. 当调用一些系统方法的时候(如文件 I/O),如果系统方法调用的时候发生阻塞,这种情况下,网络轮询器(NetPoller)无法使用,而进行系统调用的 G1 将阻塞当前 M1。调度器引入 其它M 来服务 M1 的P。
  4. 如果在 Goroutine 去执行一个 sleep 操作,导致 M 被阻塞了。Go 程序后台有一个监控线程 sysmon,它监控那些长时间运行的 G 任务然后设置可以强占的标识符,别的 Goroutine 就可以抢先进来执行。

参考资料

https://zhuanlan.zhihu.com/p/385371995