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

【操作系统】聊聊协程为什么可以支撑高并发服务

在实际的业务开发中,比如针对一个业务流程,调用三方,然后存储数据,从oss上获取数据。其实都是进行的同步调用,说白了就是A完成之后,B在继续完成。如果整个过程中A、B、C 分别耗时100、300、200毫秒。那么整体的耗时就是600毫秒。

但是如果使用异步方式,而整体A、B、C又没有数据依赖,就可以将整体的耗时提升到300毫秒。但是虽然异步的方式可以提升整体的速度。但是在业务中嵌套太多非阻塞API其实对于整体的来说,BUG、开发效率也不高。并且业务中需要嵌套很多多线程、异步的代码。

其实可以看出,本质上为了提升性能,从多进程、多线程、到异步、协程都是通过不同的技术去解决问题。

如何通过切换请求实现高并发

多进程是利用将CPU执行权,按照时间段进行分片,比如1S中 分为100个10毫秒,那么每个程序都可以根据一定的调度算法获取执行权。虽然从宏观上看是并发执行,但是微观上确实串行执行。进程也因为管理成本高,无法通过内存同步数据。于是出现了多线程,多线程虽然可以通过共享虚拟内存来实现数据的共享,但是因为其本身消耗内存过多,并且当出现多个线程调用的时候,上下文切换也会导致资源的消耗。

如图是通过同步阻塞方式读取。
在这里插入图片描述
而目前主流的IO多路复用,采用非阻塞IO其实就是将内核态的请求切换工作,转移到用户态中来做处理,异步化编程通过应用层实现请求切换,降低内存成本和切换成本。异步化其实依赖于IO多路复用机制,比如linux中的epoll。

在这里插入图片描述
可以发现使用异步化,请求发起IO读取之后会进行注册回调函数,而通过异步回调函数可以进行避免线程切换。

协程如何实现高并发的

协程与异步编程的相似点在于通过使用非阻塞的系统调用与内核交互,切换请求在用户态中完成。协程是通过封装称一个函数来完成。在这里插入图片描述
协程的切换其实和内核态的切换线程是一样的。因为内核态的线程切换是通过CPU的寄存器来完成的。
每个线程都有自己的栈和下一条要执行的指令代码寄存器,首先需要先保存A线程的当前栈和下一条要执行的指令,然后将B线程的当前栈设置为它的下一条要执行的指令。就可以完成线程切换。同理协程也是这样的。
在这里插入图片描述
线程的栈有8MB,而协程通过只有几十KB。可以占用更低的内存支持高并发。
因而协程是用户态的线程,如果线程进行切换,那么这个线程内的协程都将丢失执行信息,所以这个必须有协程框架来进行调度。
协程的高性能,建立在切换必须由用户内核态代码完成。

小结

本篇主要介绍了为了提升运行效率,从进程、线程、异步编程、协程,每种方式都有自己的优缺点,但是归根结底都是为了实现更好的业务开发,而通过减少内存占用和内核中上下文切换(线程),将协程搬到了用户态进行上下文切换。但是从设计角度违反了内聚性。
这里简单解释以下 并发是一段时间内执行多个任务。并行是同一时刻执行多个任务。串行是一个执行完另一个执行。

相关文章:

【操作系统】聊聊协程为什么可以支撑高并发服务

在实际的业务开发中,比如针对一个业务流程,调用三方,然后存储数据,从oss上获取数据。其实都是进行的同步调用,说白了就是A完成之后,B在继续完成。如果整个过程中A、B、C 分别耗时100、300、200毫秒。那么整…...

算法leetcode|80. 删除有序数组中的重复项 II(rust重拳出击)

文章目录 80. 删除有序数组中的重复项 II:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 80. 删除有序数组中的重复项 II: …...

Vite 完整版详解

1. 打包构建: Vite 使用 Rollup 作为默认的构建工具。通过运行 npm run build 命令,Vite 会将应用程序的源代码打包成一个或多个优化的静态文件,以便在生产环境中进行部署。Vite 的构建过程会根据需要进行代码拆分、压缩和优化,以…...

AI入门指南:探索人工智能的基础原理和实际应用

引言 介绍AI的基本概念:什么是人工智能,为什么它如此重要。 引出博客的主要内容,即AI的基础原理和实际应用。 第一部分:AI的基础原理 什么是人工智能: 解释AI的定义和范畴。 介绍AI的历史和发展。 机器学习入门&#x…...

使用 Webpack 从 0 到 1 构建 Vue3 项目 + ts

使用 Webpack 从 0 到 1 构建 Vue3 项目 1.初始化项目结构2.安装 webpack,补充智能提示3.初步编写 webpack.config.js3.1设置入口文件及出口文件3.2 指定 html 模板位置 4.配置 运行/打包 命令,首次打包项目5.添加 Vue 及相关配置5.1安装并引入 vue5.2 补…...

【Git】Git 分支

Git 分支 1.分支简介 为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。 或许你还记得 起步 的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。 在进行提交操作时,Git 会保存一…...

.NET Upgrade Assistant 升级 .NET MAUI

.NET Upgrade Assistant 是一种可帮助您将应用程序升级到最新的 .NET版本 的工具,并且您可以使用这个工具将您的应用程序从旧平台(例如 Xamarin Forms 和 UWP)迁移到新的平台。此外,这个新版本的工具,可以让您在不更改…...

记一次诡异的Cannot find declaration to go to,Cannot resolve method

记一次诡异的 Cannot find declaration to go to, Cannot resolve method getOnExpressions in Join 对于项目中通常问题,清除缓存,重启idea,或者仔细检查语法通常都能解决问题,但是这次却失效了,以下是原…...

智慧园区:AI边缘计算技术与视频监控汇聚平台打造智慧园区解决方案

一、行业趋势与背景 智慧园区是现代城市发展的重要组成部分,通过智能化技术提高园区的运营效率、降低成本、增强环境可持续性等具有重要作用。在智慧园区中,人工智能和视频汇聚技术是重要的前置技术。人工智能技术可以实现对数据的智能化处理和分析&…...

SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

17 SpringCloud Alibaba入门简介 17.1 why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now 说明 Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模…...

Jmeter安装与测试

目录 一:JMeter简介: 二:JMeter安装与配置 三:JMeter主要原件 一:JMeter简介: JMeter,一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是功能 …...

java开发环境从0开始 【汇总版】

java开发环境从零开始 第一步:jdk第二步:安装 mysql第三步:安装maven第四步:idea最新免费安装第五步:安装navicate第六步 :安装git, 第一步:jdk 第一步当然是最先安装java开发环境啦。 看这个链…...

线性代数的本质(九)——二次型与合同

文章目录 二次型与合同二次型与标准型二次型的分类度量矩阵与合同 二次型与合同 二次型与标准型 Grant:二次型研究的是二次曲面在不同基下的坐标变换 由解析几何的知识,我们了解到二次函数的一次项和常数项只是对函数图像进行平移,并不会改变…...

STM32WB55开发(4)----配置串口打印Debug调试信息

STM32WB55开发----4.配置串口打印Debug调试信息 概述硬件准备视频教学样品申请选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙开启串口调试配置蓝牙参数设置工程信息工程文件设置Keil工程配置代码配置结果演示 概述…...

云原生服务无状态(Stateless)特性的实现

文章目录 为何要使用无状态服务?无状态服务的实现方法1. 会话状态外部化2. 负载均衡3. 自动伸缩4. 容器编排5. 数据存储6. 安全性 示例:使用Spring Boot实现无状态服务结论 🎉欢迎来到云计算技术应用专栏~云原生服务无状态(Statel…...

zookeeper最基础教程

文章目录 一、简介1、工作机制2、特点3、数据结构4、应用场景5、选举机制 二、软件安装1、单机版安装2、集群安装3、配置参数解读(zoo.cfg)4、ZK集群启动脚本 三、命令行操作1、语法2、使用3、节点相关4、监听器原理5、节点删除与查看 三、写数据流程 一、简介 1、工作机制 官…...

又一重磅利好来袭!Zebec Payroll 集成至 Nautilus Chain 主网

流支付协议 Zebec Protocol 正在积极的拓展自身生态,随着此前其全新路线图的发布,揭示了该生态从 Web3 世界向 Web2 世界跨越的决心。根据其最新路线图,Zebec Protocol 正在从最初构建在 Solana 上的流支付协议,拓展为囊括模块化公…...

NLP模型的tokenize方法中return_tensors参数

NLP模型的tokenize方法中return_tensors参数 在许多NLP模型的tokenize方法中,return_tensors参数可以指定tokenize之后返回的张量类型,常见的可选值包括: ‘tf’: 返回TensorFlow的张量对象Tensor。 ‘pt’: 返回PyTorch的张量对象torch.Tensor。 ‘np’: 返回NumPy的ndarray对…...

模方新建工程时,显示空三与模型坐标系不一致怎么解决

答:检查空三xml与模型的metadata.xml的坐标系是否一致,metadata文件是否有在data目录外面。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.0新增单体化建模模块,…...

氧化锌避雷器绝缘电阻测试

氧化锌避雷器 绝缘电阻测试 试验目的 避雷器绝缘电阻包括本体绝缘电阻和底座绝缘电阻, 主要目的在于初步检查避雷 器内部是否受潮; 有并联电阻者可检查其通、 断、 接触和老化等情况。 试验设备 高压绝缘电阻测试仪 厂家: 湖北众拓高试 试验方法 本体绝缘电阻试验…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...