"golang 抢占式调度:GMP原理、阻塞、底层实现"
需积分: 50 97 浏览量
更新于2023-12-26
收藏 1.15MB PPTX 举报
golang中的GMP(Goroutine调度器、调度器和操作系统中的M:N线程调度)模型采用了抢占式调度策略,以满足多处理器时代的需求。该模型将goroutine(轻量级线程)调度分为三个层次:G-goroutine、P-process、M-mechine,通过这三个层次的协作来实现抢占式调度。
G-goroutine代表用户态的线程,是goroutine的抽象表示,每个goroutine都与一个G结构相关联,G结构中包含了该goroutine的状态和调度信息。P-process代表调度上下文,负责goroutine的调度、抢占和执行。M-mechine代表操作系统的线程,负责执行goroutine。在多处理器时代,P和M的数量可以动态增长和收缩,以适应系统的负载。
golang调度器的抢占式调度是通过在goroutine的执行点上插入抢占点的方式实现的。抢占点是一段代码,在这段代码中,系统会检查当前goroutine的执行时间,如果一个goroutine的执行时间过长,就会将其暂停,并切换到其他goroutine执行,以平衡系统的负载,这就是抢占式调度的核心机制。
此外,golang调度器还提供了一些常见的阻塞和抢占场景,来说明抢占式调度的应用。例如,当一个goroutine被阻塞时,调度器会暂停其执行并切换到其他可执行的goroutine,以提高系统的并发度。另外,当一个goroutine执行时间过长,会引发抢占,调度器会主动中断该goroutine的执行,然后将资源分配给其他goroutine。
在底层实现原理方面,golang调度器采用了一些数据结构和算法来支持抢占式调度。其中,goroutine的抽象结构和调度信息存储在G结构中,P结构负责管理goroutine和M结构的调度,M结构用于执行goroutine。通过这些数据结构和算法,调度器可以高效地实现抢占式调度。
总的来说,golang调度器的抢占式调度是一种高效的方式,可以提高系统的并发度,满足多处理器时代的需求。通过GMP模型的协作,调度器可以实现灵活的弹性调度,以适应系统的负载变化。在实际应用中,开发者可以充分利用抢占式调度的特性,来提高系统的并发性能和响应速度。
302 浏览量
142 浏览量
264 浏览量
2025-01-08 上传
202 浏览量
2024-08-06 上传
164 浏览量
378 浏览量
在山的那边是海吗
- 粉丝: 128
- 资源: 2
最新资源
- pid控制器代码matlab-drone_gazebo:drone_gazebo
- android_device_xiaomi_perseus:适用于Android偏执狂(AOSPA)的Xiaomi Mi MIX 3(perseus)设备树
- emgibbs96.github.io
- FC小霸王4000余款游戏整合版.zip
- css3悬停滑动分享按钮动画特效
- obp-apis:OpenBankingProject.ch社区API
- RollerworksSearchBundle:[只读]将RollerworksSearch与任何基于Symfony的应用程序集成
- pid控制器代码matlab-KCPidTuner:RobinDeKeyser等人的论文《工业循环控制的通用直接调谐器》中的KissingCi
- Git-2.28.0-64bit.zip
- 灰色预测模型,灰色预测模型适用范围,matlab
- uno,Hx711库文件
- Data-Structures
- WebMaster FTP v1.03
- eric-kruk-photo
- wuxian1.rar_IFY_UF OFDM AND OFDM_UFMC_UFMC OFDM
- vmd代码,vmd代码解释,matlab