当前位置: 首页 > news >正文

goroutine调度策略

Golang的调度器采用M:N调度模型,其中M代表用户级别的线程(也就是goroutine),而N代表的事内核级别的线程。Go调度器的主要任务就是N个OS线程上调度M个goroutine。这种模型允许在少量的OS线程上运行大量的goroutine

Go调度器使用了三种队列来管理goroutine

  1. 全局队列(Global Queue):此队列中包含了所有刚创建的goroutine
  2. 本地队列(Local Queue):每个P(Processor,处理器)都有一个本地队列,P会有限从本地队列中取出goroutine来执行。
  3. 网络轮循器(Netpoller):此队列中包含了所有在等待网络时间(如IO操作)的goroutine。当网络事件就绪时,对应的goroutine会被放入到全局队列中,等待被P取出。

Go的调度器采用了工作窃取(Work Stealing)和手动抢占(Preemption)的策略

  • 工作窃取:当一个P的本地队列中没有goroutine时,它会尝试从全局队列或其他P的本地队列中窃取goroutine来执行。
  • 手动抢占:为了防止一个goroutine长时间占用P而导致其他goroutine饿死,Go的调度器会定期地进行抢占操作。在Go 1.14之前,Go的调度器只在函数调用时才会进行抢占,从Go 1.14开始引入了异步抢占,即允许在任何安全点进行抢占。

这种调度模型和策略使得Go语言可以有效地利用硬件资源,处理大量的并发任务,同时也为复杂的并发编程提供了简介的语言级别的支持。

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

http://www.lryc.cn/news/349162.html

相关文章:

  • TypeScript中`unknown`的使用场景:安全处理未知类型
  • react18【系列实用教程】JSX (2024最新版)
  • Docker 创建网络
  • ASME美国机械工程师学会文献如何查询下载经验分享
  • Spring MVC分页示例
  • C++基础——继承(上)
  • 编译安装Python3
  • MySQL数据库核心面试题
  • Golang | Leetcode Golang题解之第85题最大矩形
  • Linux基础知识面试题
  • 中国高分辨率国家土壤信息网格基本属性数据集(2010-2018)
  • 数据仓库项目---Day01
  • 若依生成树表和下拉框选择树表结构(在其他页面使用该下拉框输入)
  • 考研数学|李林《880》做不动,怎么办!?看这一篇!
  • paddle ocr 版面分析
  • 25. K 个一组翻转链表 - 力扣(LeetCode)
  • 使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】
  • [240514] OpenAI 发布 GPT-4o,人机交互的历史性时刻 | 苹果芯片进军服务器剑指AI​ | 谷歌大会以AI为主
  • Maximo 在 Automation Script 中访问数据库
  • gitee 简易使用 上传文件
  • iOS Xcode 升级Xcode15报错: SDK does not contain ‘libarclite
  • 即插即用篇 | YOLOv8引入轴向注意力 Axial Attention | 多维变换器中的轴向注意力
  • 【芯片制造】【常用术语】CP、FT、WAT
  • 计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程
  • 超级简单的地图操作工具开发可疑应急,地图画点,画线,画区域,获取地图经纬度等
  • 25_NumPy数组np.round将ndarray舍入为偶数
  • Java字符串去除空格的方法
  • 【Python】【应用】Python应用之如何操作WiFi之一——使用pywifi
  • 2024OD机试卷-分割均衡字符串 (java\python\c++)
  • 完整版解答!2024年数维杯数学建模挑战赛B题