【Linux】协程简介

news2024/11/18 19:47:29

【Linux】协程简介

  • 一、什么是协程?
    • 简介
    • 优点
  • 二、为什么使用协程?
  • 三、协程的种类
    • 1、对称协程
    • 2、非对称协程
  • 四、协程栈
    • 1、静态栈
    • 2、分段栈
    • 3、共享栈
    • 4、虚拟内存栈
  • 五、协程调度
    • 1、栈式调度
    • 2、星切调度
    • 3、环切调度
  • 六、常见协程库
  • 参考文献

一、什么是协程?

首先回忆一下线程的概念:
线程是操作系统能够进行运算调度的最小单位。被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程可以并发执行多个线程,每个线程会执行不同的任务。

简介

  • 协程可以理解为一种用户态的轻量级线程,切换由用户定义,各任务之间可以控制执行暂停恢复函数,来达到多任务协作的目的;
  • 协程上下文切换速度快, 且不会陷入内核态
  • 协程拥有独立的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈,在来回切换时,恢复先前保存的寄存器上下文和栈。
  • 一个线程中可以有多个协程,协程是运行在线程之中的逻辑处理单元。协程在线程里的运行是串行的。
  • 协程之间的调度通过调度器或者自己主动放开对CPU的占有,让给其他协程。

优点

  • 协程具有极高的执行效率,由于子程序切换不是线程切换,是由程序自身控制,故协程没有线程切换的开销;
  • 多线程的线程数越多,协程的性能越显著
  • 访问共享资源不需要使用多线程的锁机制和变量冲突,由于只有一个线程,故在协程只需要判断状态即可,降低了编码难度;
  • 同步代码的方式写异步逻辑;

二、为什么使用协程?

为什么使用协程,我们先从server框架的实现说起,对于client-server的架构,server最简单的实现如下。即串行地接收连接、读取请求、处理、应答。该实现弊端显而易见,server同一时间只能为一个客户端服务。

while(1) {
	accept();
	recv();
	do();
	send();
	}

为充分利用好多核cpu进行任务处理,我们有了多进程/多线程的server框架,这也是server最常用的实现方式
accept进程 - n个epoll进程 - n个worker进程

  • accpet进程处理到来的连接,并将fd交给各个epoll进程
  • epoll进程对各fd设置监控事件,当事件触发时通过共享内存等方式,将请求传给各个worker进程
  • worker进程负责具体的业务逻辑处理并回包应答

以上框架以事件监听、进程池的方式,解决了多任务处理问题,但我们还可以对其作进一步的优化。

进程/线程是Linux内核最小的调度单位,一个进程在进行io操作时 (常见于分布式系统中RPC远程调用),其所在的cpu也处于iowait状态。直到后端svr返回,或者该进程的时间片用完、进程被切换到就绪态。是否可以把原本用于iowait的cpu时间片利用起来,发生io操作时让cpu处理新的请求,以提高单核cpu的使用率?

协程在用户态下完成切换,由程序员/调度器完成调度,结合对socket类/io操作类函数挂钩子、添加事件监听,为以上问题提供了解决方法。

三、协程的种类

协程目前分两种,一种是go语言采用的对称协程;一种是libco采用的非对称协程
yield: 协程执行到⼀半就退出,暂时让出CPU执行权
resume: 协程重新恢复运行

1、对称协程

这里借用知乎博主tx征服者的图来向大家说明:
在这里插入图片描述

对称协程其实就是由协程调度器来负责,协程不允许调度其他协程。 调度器resume协程A,那么协程A会yeild回调度器,再由调度器去执行其他的协程。如果我们把resume的虚线都放在左边,yeild的实线都放在右边。以调度器为中心,那么他是不是就是一个对称的图形呢?

2、非对称协程

我们再来看一下非对称协程
在这里插入图片描述
非对称调度由调度器来调度协程A,然后协程A再调动协程B。 那么Byeild让出CPU使用权就不是让给调度器了,而是协程A。简而言之就是从哪儿来,回哪儿去。同样,将此展开也不是一个对称的图形了。

四、协程栈

1、静态栈

固定大小的栈,容易造成溢出等现象。

2、分段栈

插入栈内存检测代码,若栈不够用,则申请新内存扩展;但该方法难以在第三方库中进行使用。

3、共享栈

申请一块大内存作为共享栈,在运行前,先把协程栈的内存copy到共享栈中,运行结束后再计算协程栈真正使用的内存,copy出来保存起来,这样每次只需保存真正使用到的栈内存量即可。

优点:该方案极大程度上避免了内存的浪费,做到了用多少占多少,同等内存条件下,可以启动的协程数量更多。

缺点:但该方案在copy上花费了时间,降低速度,导致协程切换慢。

4、虚拟内存栈

机制:进程申请的内存并不会立即被映射成物理内存,而是仅管理于虚拟内存中,真正对其读写时会触发缺页中断,此时才会映射为物理内存;
可以做到用多少占多少,冗余不超过一个内存页大小。

五、协程调度

1、栈式调度

协程队列是一个栈式结构,创建的协程都置于栈顶,并且会立即暂停当前协程并切换至子协程中运行,子协程运行结束后,继续切换回来执行父协程;越是栈底部的协程,被调度到的机会将越少,甚至出现只有栈顶的协程在互相切换。

2、星切调度

调度线程 -> 协程A -> 调度线程 -> 协程B -> 调度线程 -> …
将当前可调度的协程组织成队列,按顺序从头部取出协程调度;新协程则从尾部入队,调度后再将协程从尾部入队。

3、环切调度

调度线程 -> 协程A -> 协程B -> 协程C -> 协程D -> 调度线程 -> …
从调度顺序上可知,环切的切换次数仅为星切的一半,可以提高整体切换速度;但在多线程调度、WorkSteal方面会带来一定的挑战。

六、常见协程库

boost.context
提供了上下文的抽象,并给了两种方式,fiber和call/cc的方式保留和执行上下文切换;
性能佳,推荐使用,切换性能可达到1.25亿次/秒。

boost.coroutine
提供的协程只能单向传递数据,数据只能单向的从一个代码块流向另一个代码块。流入流出分别对应着push_type和pull_type类型,由这两个类型组成协程间跳转的通道,同时也是数据传递的通道。

ucontext
该库是在unix下提供的,使用是最安全可靠,但性能较差,大概200万次/秒。

fiber
该库是在window下提供的,与ucontext类似。

libco
腾讯开源的c++协程库。

libgo
libgo为了有更广阔的适用性,支持了多线程调度、HookSyscall、Worksteal等,同时突破了传统协程库仅用来处理网络io密集型业务的局限,也能适用于cpu密集型业务,充当并行编程库来使用。

参考文献

协程 及 libco 介绍
ucontext-人人都可以实现的简单协程库
协程学习(对称和非对称)
Linux【协程】 | 常见协程库简介

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

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

相关文章

Spring Task的应用

介绍 Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位: 定时任务框架 作用: 定时自动执行某段Java代码 应用场景: 引用卡每月还款提醒、银行贷款每月还款提醒、火车票售票系统处理未支…

SpringCloud(17)之SpringCloud Stream

一、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型,该模型建立在已经建立和熟悉的Spring习惯用法和最佳实践之上,包括对持久发布/子语义…

软件性能测试工具RunnerGo安装步骤

现在安装RunnerGo仅需要一条命令!目前支持系统:Centos、Debian、Ubuntu三种。下面给大家介绍一下RunnerGo安装使用流程: Step1:复制以下命令 wget https://img.cdn.apipost.cn/running_go/img/wiki/runnergo.tar && ta…

探索 SPA 与 MPA:前端架构的选择与权衡

查看本专栏目录 关于作者 还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas&#x…

论文阅读-CheckFreq:频繁、精细的DNN检查点操作。

论文名称:CheckFreq: Frequent, Fine-Grained DNN Checkpointing. 摘要 训练深度神经网络(DNNs)是一项资源密集且耗时的任务。在训练过程中,模型在GPU上进行计算,重复地学习权重,持续多个epoch。学习到的权重存在GPU内存中&…

机器遗忘同等重要,AI如何忘记不良数据,保护用户隐私?

引言:大语言模型中的机器遗忘问题 在人工智能领域,大语言模型(LLMs)因其在文本生成、摘要、问答等任务中展现出的卓越能力而备受关注。然而,这些模型在训练过程中可能会记住大量数据,包括敏感或不当的信息…

【MySQL】学习和总结标量子查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-kLo6jykc7AcEVEQk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

消息中间件之RocketMQ源码分析(二十二)

Broker主从同步流程 配置数据同步流程 配置数据包含4种类型:Topic配置、消费者位点、延迟位点、订阅关系配置。每种配置数据由一个继承自ConfigManager的类来管理,继承关系如图。Slave如何从Master同步这些配置呢?我们先来看一下初始化服务的步骤 第一步:Maste…

【JavaEE进阶】图书管理系统开发日记——捌

文章目录 🍃前言🎍统一数据返回格式🚩快速入门🚩存在问题🎈问题原因🎈代码修改 🚩统一格式返回的优点 🍀统一异常处理🌲前端代码的修改🚩登录页面&#x1f6a…

openai.CLIP多模态模型简介

介绍 OpenAI CLIP(Contrastive Language–Image Pretraining)是一种由OpenAI开发的多模态学习模型。它能够同时理解图像和文本,并在两者之间建立联系,实现了图像和文本之间的跨模态理解。 如何工作 CLIP模型的工作原理是将来自…

三、软考-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。 冯诺依曼体系计算机结构: 1、计算机硬件组成 冯诺依曼计算机结构将…

C#理论 —— WPF 应用程序Console 控制台应用

文章目录 1. WPF 应用程序1.1 工程创建1.2 控件1.2.1 控件的公共属性1.2.1 TextBox 文本框1.2.1 Button 按钮 *. Console 控制台应用1.1 工程创建 1. WPF 应用程序 1.1 工程创建 Visual Studio 中新建项目 - 选择WPF 应用程序; 1.2 控件 1.2.1 控件的公共属性 …

2024常用的 Python 自动化测试框架有哪些?

Unittest是Python中最常用的测试框架之一,它提供了丰富和强大的测试工具和方法,可以帮助开发者更好地保证代码质量和稳定性,本文就来介绍下Unittest单元测试框架。 1. 介绍 unittest是Python的单元测试框架,它提供了一套丰富的测…

【MySQL】基本查询(表的增删改查)-- 详解

CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)。 一、Create insert [into] table_name [(column [, column] ...)] v…

硬件工程师入门基础知识(三)钽电容应用(二)

钽电容应用(二) 1.钽电容使用容量选择2.非固体电解质钽电容器使用时应注意的问题2.1 容量和损耗2.2 直流漏电流2.3 使用电压2.4 反向电压2.5 纹波电流2.6 失效率的影响因素2.7 补充说明: 1.钽电容使用容量选择 许多情况下,高能混…

自定义Chrome的浏览器开发者工具DevTools界面的字体和样式

Chrome浏览器开发者工具默认的字体太小,想要修改但没有相关设置。 外观——字体可以自定义字体,但大小不可以调整。 github上有人给出了方法 整理为中文教程: 1.打开浏览器开发者工具,点开设置——实验,勾上红框设…

实现unity场景切换

本文实现两个按键实现场景1和场景2之间的切换 ①首先在unity 3D中创建两个场景,分别为Scene1和Scene2 ②在Scene1中创建一个Button,修改txt内容为“To Scene2”,并在Buttons下创建一个空物体,用于挂载脚本。 脚本Trans Scene.…

自然语言:信息抽取技术在CRM系统中的应用与成效

一、引言 在当今快速变化的商业环境中,客户关系管理(CRM)已成为企业成功的关键因素。CRM系统的核心在于有效地管理客户信息,跟踪与客户的每一次互动,以及深入分析这些数据以提升客户满意度和忠诚度。在我最近参与的一个…

综合实战(volume and Compose)

"让我,重获新生~" MySQL 灾难恢复 熟练掌握挂载卷的使用,将Mysql的业务数据存储在 外部。 实战思想: 使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 "mysql-data"用来保存容器中产生的数据。我们需要容器连接到Mysql服务&a…

智慧公厕:打造智慧城市环境卫生新标杆

随着科技的不断发展和城市化进程的加速推进,智慧城市建设已经成为各地政府和企业关注的焦点。而作为智慧城市环境卫生管理的基础设施,智慧公厕的建设和发展也备受重视,被誉为智慧城市的新标杆。本文以智慧公厕源头厂家广州中期科技有限公司&a…