"golang 抢占式调度:GMP原理、阻塞、底层实现"
需积分: 50 186 浏览量
更新于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模型的协作,调度器可以实现灵活的弹性调度,以适应系统的负载变化。在实际应用中,开发者可以充分利用抢占式调度的特性,来提高系统的并发性能和响应速度。
2022-04-23 上传
2023-09-19 上传
2023-05-17 上传
2024-08-06 上传
2021-01-07 上传
2018-01-14 上传
2021-02-10 上传
2018-04-08 上传
在山的那边是海吗
- 粉丝: 128
- 资源: 2
最新资源
- Android-A Programmer's Guide(译).pdf
- 第09讲 图像类型与彩色模型的转换.doc
- 硬盘维修绝密资料下载
- fckeditor的0DAY
- 在嵌入式系统中实现对U盘的读写等操作
- 笔记本原理复习指南\笔记本试行版\第一章笔记本技术综述.doc
- 嵌入式linux入门
- 网络工程师必备的十种工具0ccb5867-80ae-4acb-abdc-ff2cda2a091a.doc
- java程序员面试宝典
- C_C++指针经验总结
- 基于单片机的脉搏测量仪器设计
- ibatis 开发指南.pdf
- 基于DSP和USB技术的数据采集与处理系统
- bus hound中文使用说明书
- MySQL安装图解(适合初学者)
- 数字图像处理大纲式试题