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

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

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

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

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

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

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • 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具体的调度策略

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

229. go语言中的GMP、defer、匿名defer函数、defer执行流程


企业题库解析小组

题目序号:(2337)

题目来源:奇安信

频次:1

# 答案1:(ORVR)

defer 意为延迟,在golang中用于延迟执行一个函数,主要用于帮助我们处理资源释放、连接关闭等一些操作

若函数中有多个defer,其执行顺序为先进后出,可以理解为栈

在理解匿名defer函数之前,首先得了解一个知识点:

go的函数返回值是通过堆栈返回的,return语句不是原子操作,而是被拆成了下面两步

  1. 给返回值赋值(rval)

  2. 返回给调用函数(ret)

defer是在return之前执行的。这个在官方文档 (opens new window)中是明确说明了的。要使用defer时不踩坑,最重要的一点就是要明白,return xxx这一条语句并不是一条原子指令!

函数返回的过程是这样的:先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数中。

defer表达式可能会在设置函数返回值之后,在返回到调用函数之前,修改返回值,使最终的函数返回值与你想象的不一致。

其实使用defer时,用一个简单的转换规则改写一下,就不会迷糊了。改写规则是将return语句拆成两句写,return xxx会被改写成:

返回值 = xxx

调用defer函数

空的return

GMP执行流程,调度模型

新创建的Goroutine会先存放在Global全局队列中,等待Go调度器进行调度,随后Goroutine被分配给其中的一个逻辑处理器P,并放到这个逻辑处理器对应的Local本地运行队列中,最终等待被逻辑处理器P执行即可。

在M与P绑定后,M会不断从P的Local队列中无锁地取出G,并切换到G的堆栈执行,当P的Local队列中没有G时,再从Global队列中获取一个G,当Global队列中也没有待运行的G时,则尝试从其它的P窃取部分G来执行相当于P之间的负载均衡。

  • 答案1:(ORVR)