0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解剖析Go语言调度模型的设计

马哥Linux运维 来源:爱户外的程序猿 作者:爱户外的程序猿 2021-07-26 10:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

golang的MPG调度模型是保障Go语言效率高的一个重要特性,本文详细介绍了Go语言调度模型的设计。

前言

Please remember that at the end of the day, all programs that work on UNIX machines end up using C system calls to communicate with the UNIX kernel and perform most of their tasks. 所有在 UNIX 系统上运行的程序最终都会通过 C 系统调用来和内核打交道。

用其他语言编写程序进行系统调用,方法不外乎两个:一是自己封装,二是依赖 glibc、或者其他的运行库。Go 语言选择了前者,把系统调用都封装到了 syscall 包。封装时也同样得通过汇编实现。

异步系统调用 G 会和MP分离(G挂到netpoller),同步系统调用 GM 会和P分离(P另寻M),生动的说明了GPM相对GM的精妙之处。

阻塞

在 Go 里面阻塞主要分为以下 4 种场景:

由于原子、互斥量或通道操作调用导致 Goroutine 阻塞,调度器将把当前阻塞的 Goroutine 切换出去,重新调度 LRQ 上的其他 Goroutine;

由于网络请求和 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 多路复用机制“模拟”出来的。

当调用一些系统方法的时候(如文件 I/O),如果系统方法调用的时候发生阻塞,这种情况下,网络轮询器(NetPoller)无法使用,而进行系统调用的 G1 将阻塞当前 M1。调度器引入 其它M 来服务 M1 的P。

如果在 Goroutine 去执行一个 sleep 操作,导致 M 被阻塞了。Go 程序后台有一个监控线程 sysmon,它监控那些长时间运行的 G 任务然后设置可以强占的标识符,别的 Goroutine 就可以抢先进来执行。

系统调用

Go 语言通过 Syscall 和 Rawsyscall 等使用汇编语言编写的方法封装了操作系统提供的所有系统调用,其中 Syscall 在 Linux 386 上的实现如下:

TEXT ·Syscall(SB),NOSPLIT,$0-28

CALL runtime·entersyscall(SB)

MOVL trap+0(FP), AX // syscall entry

MOVL a1+4(FP), BX

MOVL a2+8(FP), CX

MOVL a3+12(FP), DX

MOVL $0, SI

MOVL $0, DI

INVOKE_SYSCALL

CMPL AX, $0xfffff001

JLS ok

MOVL $-1, r1+16(FP)

MOVL $0, r2+20(FP)

NEGL AX

MOVL AX, err+24(FP)

CALL runtime·exitsyscall(SB)

RET

ok:

MOVL AX, r1+16(FP)

MOVL DX, r2+20(FP)

MOVL $0, err+24(FP)

CALL runtime·exitsyscall(SB)

RET

Golang - 调度剖析 https://segmentfault.com/a/1190000016611742

Go: Goroutine, OS Thread and CPU Management https://medium.com/a-journey-with-go/go-goroutine-os-thread-and-cpu-management-2f5a5eaf518a

Go optimizes the system calls — whatever it is blocking or not — by wrapping them up in the runtime. This wrapper will automatically dissociate the P from the thread M and allow another thread to run on it.

异步系统调用

通过使用网络轮询器进行网络系统调用,调度器可以防止 Goroutine 在进行这些系统调用时阻塞M。这可以让M执行P的 LRQ 中其他的 Goroutines,而不需要创建新的M。有助于减少操作系统上的调度负载。

G1正在M上执行,还有 3 个 Goroutine 在 LRQ 上等待执行

接下来,G1想要进行网络系统调用,因此它被移动到网络轮询器并且处理异步网络系统调用。然后,M可以从 LRQ 执行另外的 Goroutine。

最后:异步网络系统调用由网络轮询器完成,G1被移回到P的 LRQ 中。一旦G1可以在M上进行上下文切换,它负责的 Go 相关代码就可以再次执行。

同步系统调用

G1将进行同步系统调用以阻塞M1

调度器介入后:识别出G1已导致M1阻塞,此时,调度器将M1与P分离,同时也将G1带走。然后调度器引入新的M2来服务P。

b030aa1a-db82-11eb-9e57-12bb97331649.png

阻塞的系统调用完成后:G1可以移回 LRQ 并再次由P执行。如果这种情况需要再次发生,M1将被放在旁边以备将来使用。

b03e4c56-db82-11eb-9e57-12bb97331649.png

sysmon 协程

b04936ca-db82-11eb-9e57-12bb97331649.jpg

在 linux 内核中有一些执行定时任务的线程, 比如定时写回脏页的 pdflush, 定期回收内存的 kswapd0, 以及每个 cpu 上都有一个负责负载均衡的 migration 线程等。在 go 运行时中也有类似的协程 sysmon. sysmon 运行在 M,且不需要 P。它会每隔一段时间检查 Go 语言runtime,确保程序没有进入异常状态。

系统监控的触发时间就会稳定在 10ms,功能比较多:

检查死锁runtime.checkdead

运行计时器 — 获取下一个需要被触发的计时器;

定时从 netpoll 中获取 ready 的协程

Go 的抢占式调度

当 sysmon 发现 M 已运行同一个 G(Goroutine)10ms 以上时,它会将该 G 的内部参数 preempt 设置为 true。然后,在函数序言中,当 G 进行函数调用时,G 会检查自己的 preempt 标志,如果它为 true,则它将自己与 M 分离并推入“全局队列”。由于它的工作方式(函数调用触发),在 for{} 的情况下并不会发生抢占,如果没有函数调用,即使设置了抢占标志,也不会进行该标志的检查。

Go1.14 引入抢占式调度(使用信号的异步抢占机制),sysmon 仍然会检测到运行了 10ms 以上的 G(goroutine)。然后,sysmon 向运行 G 的 P 发送信号(SIGURG)。Go 的信号处理程序会调用P上的一个叫作 gsignal 的 goroutine 来处理该信号,将其映射到 M 而不是 G,并使其检查该信号。gsignal 看到抢占信号,停止正在运行的 G。

在满足条件时触发垃圾收集回收内存;

打印调度信息,归还内存等定时任务。

转自:bert.li@ximalaya.com

qiankunli.github.io/2020/11/21/goroutine_system_call.html

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • go语言
    +关注

    关注

    1

    文章

    159

    浏览量

    9851

原文标题:Golang 系统调用与阻塞处理

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    神州鲲泰携手趋境科技推出大模型推理智能算力调度解决方案

    近日,华为中国合作伙伴大会现场,神州鲲泰与趋境科技正式签订生态合作协议,并联合推出面向企业级大模型推理场景的智能算力调度解决方案。
    的头像 发表于 04-17 15:12 486次阅读
    神州鲲泰携手趋境科技推出大<b class='flag-5'>模型</b>推理智能算力<b class='flag-5'>调度</b>解决方案

    微电网经济调度理论:成本最小化与效益最大化的优化模型

    构建微电网经济调度优化模型,需先明确模型的核心构成要素,包括目标函数、约束条件与优化变量,三者相互关联、相互制约,共同决定了优化模型的科学性与实用性。其中,目标函数是
    的头像 发表于 03-12 11:05 237次阅读
    微电网经济<b class='flag-5'>调度</b>理论:成本最小化与效益最大化的优化<b class='flag-5'>模型</b>

    Go 语言高并发服务设计与性能调优实战:从万级到百万级并发的演进之路

    ┌─────────────────────────────────────────────────────────────┐ │Go GMP 调度模型
    发表于 02-18 19:19

    国内七大基于大模型的发射任务调度与过程保障分系统软件介绍

        七大基于大模型的发射任务调度与过程保障系统    结合公开航天资料、机构技术路线及商业航天实践,可梳理出涵盖国内外典型案例的七大智能发射调度系统及平台。这些系统深度融合大语言
    的头像 发表于 12-24 11:08 430次阅读

    基于大模型的发射任务调度与过程保障分系统平台的应用与未来发展

        基于大模型的发射任务调度与过程保障分系统航天智能化升级核心方案    北京华盛恒辉大模型的发射任务调度与过程保障分系统,是航天领域智能化升级的核心支撑。该系统凭借多源数据融合、
    的头像 发表于 12-24 10:36 380次阅读

    七大基于大模型的地面测控站网调度分系统软件的应用与未来发展

    出的七项具有代表性的智能调度系统/项目。这些系统均深度融合大模型、AI决策与数据驱动优化技术,是航天测控体系向智能化、自主化升级的核心载体。    1.北京华盛恒辉大模型地面测控站网调度
    的头像 发表于 12-19 15:42 521次阅读

    基于大模型ai的地面测控站网调度分系统:功能特点与平台架构解析

        大模型AI驱动的地面测控站网调度分系统:航天智能化核心技术解析    北京华盛恒辉大模型AI驱动的地面测控站网调度分系统作为航天领域智能化转型的关键支撑,大
    的头像 发表于 12-19 15:13 450次阅读

    模型驱动的发射任务智能调度分系统软件平台的应用与未来发展

    模型驱动的发射任务智能调度分系统平台    作为航天智能化转型的关键支撑,该平台融合多源数据、动态资源调度与大模型智能决策能力,显著提升发射任务的效率、安全性与可靠性。以下从技术架构
    的头像 发表于 12-19 14:50 408次阅读

    后勤资源大模型智能调度系统:功能特点与平台架构解析

        后勤资源大模型智能调度系统解析    后勤资源大模型智能调度系统融合大数据、人工智能与机器学习技术,针对物资、设备、人员、运输工具等后勤资源,通过实时感知、智能决策与动态优化,
    的头像 发表于 12-15 16:35 446次阅读

    3万字长文!深度解析大语言模型LLM原理

    我们正在参加全球电子成就奖的评选,欢迎大家帮我们投票~~~谢谢支持本文转自:腾讯技术工程作者:royceshao大语言模型LLM的精妙之处在于很好地利用数学解决了工业场景的问题,笔者基于过往工程经验
    的头像 发表于 09-02 13:34 3620次阅读
    3万字长文!深度解析大<b class='flag-5'>语言</b><b class='flag-5'>模型</b>LLM原理

    【VisionFive 2单板计算机试用体验】3、开源大语言模型部署

    的系统和芯片架构。 3、拉取/运行大语言模型 ollama的使用方法和docker很像。 返回到ollama的编译路径,找到ollama可执行文件 执行 ./ollama run qwen3:0.6b
    发表于 07-19 15:45

    鸿蒙中Stage模型与FA模型详解

    【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在HarmonyOS 5的应用开发
    的头像 发表于 07-07 11:50 1100次阅读

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1972次阅读
    深度<b class='flag-5'>剖析</b> RT-Thread 线程<b class='flag-5'>调度</b>流程

    欧洲借助NVIDIA Nemotron优化主权大语言模型

    NVIDIA 正携手欧洲和中东的模型构建商与云提供商,共同优化主权大语言模型 (LLM),加速该地区各行业采用企业级 AI。
    的头像 发表于 06-12 15:42 1396次阅读