libgo 流程分析(1)

news2025/1/19 7:05:22

libgo 基础模块

libgo逻辑结构

libgo主要的功能模块主要包括:调度器( Scheduler )、处理器( Processer )、协程( Task )和一个FastSteadyClock。

其中 Scheduler -> Processer -> Task 三层逻辑结构实现了对协程( Task )的生命周期管理和调度和运行。

scheduler 功能

Processer 的创建和状态检查
Task 的创建
Processer 之间的负载均衡 

Processer的功能

Task 的调度运行
Task 的资源回收  

在这里插入图片描述

Scheduler

负责Processer(线程)管理,Task调度和负载均衡

一个std::thread类型的dispatchThread_(至少有一个,默认一个),任务:

定时检查processer运行超时(可配置,默认100ms),超时后将这个Processer的所有Task交给其他Processer处理
在processer之间进行task的负载均衡

std::thread类型的时钟线程FastSteadyClock,用于提供快速稳定的时钟访问,精度固定20ms

Processer

每一个processer对应一个std::thread

四个Task队列:runnableQueue,waitQueue,newQueue,gcQueue

新任务(新增的或steal来的任务)放入newQueue

Processer::process负责调度和运行协程代码;

runableQueue为空或没有可调度task就从newQueue补充,Task运行完成后被切换到done状态并进入gcQueue;

当gcQueue size>16则开始回收资源delete Task;

Task运行过程中由于资源得不到满足而且换到block状态,进入waitQueue,或主动放弃执行权限的Task仍然是runnable状态;

运行下一个runnableQueue中的Task,Task在被挂起时会将自己状态设置成block,并将自己放入waitQueue,不需要Processer::process将其放入waitQueue

负载均衡将在下面讲解

Task

Task有三种状态:runnable,block,done

Task调度流程
Task 的调度和运行是以 Processer 为单位进行的, 由 Processer::Process() 执行
Task 在 Processer::Process() 中大致的调度流程:

1. 从 runnableQueue 队头取 runningTask
2. runningTask 状态被设置成 TaskState::runnable
3. runningTask 被调度运行
4. runningTask 运行结束

a). 若状态为 TaskState::runnable , runingTask 取 runningTask->next , 若
runningTask 为空,则将 NewQueue 中的 Task 移动到 runnableQueue 中, 重新设置
runingTask 为 runningTask->next , 跳转到2.
b). 若状态为 TaskState::done , 则将 runningTask 从 runnableQueue 摘除, 放入
gcQueue , 当前取 runningTask->next 为 runningTask
c). 若状态为 TaskState::block , runingTask 取 runningTask->next ,跳转到2  

在这里插入图片描述
https://blog.51cto.com/muhuizz/2328629

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【好书分享】数字信号处理入门宝典(Digital Signal Processing-A Student Guide)

简介 该书作为初学者的入门书籍,葵花宝典级的存在,发行量很少,在市面上很难见到,仅此一本,想要的私信! Digital signal processing (DSP) systems have developed at a rapid pace over the past two dec…

基于DSP+FPGA+ADS1282支持31Bit高精度数据采集方案(二)模拟电路设计

如图 4.1 所示是系统硬件系统的信号框图,数字信号处理板上的主要核心是 两个处理芯片,即 FPGA 和 DSP ,其中 FPGA 主要作用是做 DSP 和外围接口的 桥梁及数据预处理, DSP 做为数据解算核心。 FPGA 通过各种的数据总…

AJAX和JSON

1、什么是AJAX? AJAX(ASynchronous JavaScript And XML)异步的JavaScript 和 XML; 由Jesse James Garrett 在他的文章AJAX:A New Approoch to Web Applications中首次提出。 ajax(Web数据交互方式)_百…

[深度学习][CenterFusion]关于centerfusion训练注意的要点

我参考博客CenterFusion 项目超详细环境搭建步骤及可视化操作_centernet可视化_上班摸不了鱼的博客-CSDN博客本文引用 CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection,复现此论文中的代码,互相学习。注意:由于…

电影元素主题:《黑客帝国》中的js加密与解密

在《黑客帝国》中,加密和解密是非常重要的概念。加密是将信息转换为看起来毫无意义的数据,以确保只有拥有解密密钥的人才能读取和理解它。在这篇文章中,我们将探讨如何使用JavaScript进行加密和解密,就像黑客们在电影中所做的那样…

2023-04-27:用go语言重写ffmpeg的remuxing.c示例。

2023-04-27:用go语言重写ffmpeg的remuxing.c示例。 答案2023-04-27: ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命令行工具。它可以将音频、视频和字幕等元素从源文件中提取出来,并按照用户指定的方式…

Windows 11 本地 php 开发环境搭建:PHP + Apache + MySQL +VSCode 安装和环境配置

目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口(非必须)2.5 配置系统变量2.6 安装服务2.7 启动服…

在Docker上部署SpringBoot项目(纯步骤)

在Docker上部署SpringBoot项目 在学习中发现了部署的时候总是有各种问题,此文章只有操作步骤没有原理解释,只是用来提醒自己部署步骤 部署总共可以分为五步! 第一步:将SpringBoot项目打包成jar包 这里使用idea的上maven选项打包,点一下就行。…

seata 1.4.2 安装部署(Linux环境)

Linux安装部署 seata server 1.4.2 下载安装包上传至服务器 1.首先从GitHub拉取seata压缩包 https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip 下载到本地后上传至服务器 或使用命令拉取 wget https://github.com/seata/seata/release…

java调用百度的接口获取起-止位置的距离

需求:校验收货地址是否超出配送范围 重要: 做该需求的思路就是通过卖家和卖家具体的地址信息,来获取到二者的经纬度, 此时可以使用百度的 "地理编码服务",即可获取对应的经纬度 第二步,就是通过二者的经纬度,按照百度接口的要求,发送,即可获取到包含二者距离的JSON串…

SQL Father - 模拟数据生成器(后端)

SQL Father - 模拟数据生成器(后端) SQL 之父项目:快速生成 SQL 和模拟数据,大幅提高开发测试效率! 前后端全栈项目 By 程序员鱼皮 制作不易,请勿商用和二次售卖!!! 在线…

HAProxy搭建web集群

目录 一、HAProxy简介1.Haproxy应用分析2.HAProxy的主要特性3.HAProxy常用的负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集1.haproxy 服务器部署2.编译安装 Haproxy3.Haproxy服务器配置4.添加haproxy 系统服务5.节点服务器部署6.启动haproxy服务7.日志定义…

在KylinV10安装DM8、卸载DM8

前言 因为近期,业外和几个朋友想搞点有趣的项目玩玩,既然不以盈利为主,就> 主推国产化,所以这篇记录一下,我在KylinV10安装dm8.写的博客可能有所披露,希望指正。 注意 dm8试用版只有一年试用期&#xff…

10个你从未想过的 ChatGPT 有趣用途

这篇文章向我们展示了ChatGPT的有趣用途,如创作独特的故事、写作协助、模拟对话和游戏等。这些应用展示了ChatGPT的强大功能和灵活性。通过这些有趣的例子,我们可以看到ChatGPT作为一种人工智能技术在生活中的实际应用和潜力。无论是娱乐还是实用&#x…

基于matlab的长短期神经网络lstm的股票预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的股票预测 MATALB编程实现,附有代码,及链接基于matlab编程的的长短期神经网络LSTM的股票价格的预测,基于深度学习神经网络的股票价格预测-深度学习文档类资源-CSDN文库…

基于SpringBoot的线上日志阅读器

软件特点 部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。 使用手册 基本页面 配置路径 配置日志所在的目录,配置后按回车…

new和delete相关知识点

new和delete基本介绍 malloc 和free 是C函数 new和delete是C的运算符 malloc失败是通过返回值和nullptr作比较;而new开辟内存失败,是通过抛出bad_alloc类型的异常来判断的 new不仅可以做内存开辟,还可以做内存初始化操作 malloc和new的区…

一、MyBatis简介:MyBatis历史、MyBatis特性、和其它持久化层技术对比、Mybatis下载依赖包流程

文章目录 一、MyBatis简介1.1 MyBatis历史1.2 MyBatis特性1.3 和其它持久化层技术对比1.4 Mybatis下载依赖包流程 一、MyBatis简介 1.1 MyBatis历史 ​ MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁 移到了Google Code。随着开…

【每日一题】4978:宠物小精灵之收服

目录 一:题目 二:分析 三:代码实现 一:题目 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵。小智也想收服其中的一些小精灵。然而,野生的小精灵并不那么容易被收服…

MySql,

SQL语句分类 DDL:数据定义语句【create 表,库...】DML:数据操作语句【增加insert,修改update,删除delete】DQL:数据查询语句【select】DCL:数据控制语句【管理数据库:比如用户权限grant&#xf…