当前位置: 首页 > 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新增单体化建模模块,…...

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

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

链动2+1系统开发

什么是链动21模式? 链动21主要是一个集团队搭设、快速提升产品销量,与消费者做到合作共赢的一个商业模式,让用户在享受购物折扣的同时,也能获得相对收益,同时公司也能达到产品快速销售这样的一个目的,而链…...

AIGC(生成式AI)试用 4 -- 从模糊到精确

从模糊到精确,也许差异在于 更多的描述,更多的信息更具像的描述,更多的数据,更有效的信息主题明确和目标清晰层次感与条理性更简洁清晰的逻辑 “说清楚点,不太明白,提供更多的信息也许能知道要做什么。” …...

Linux中使用Docker安装ElasticSearch7.10.x集群

使用Docker安装ElasticSearch7.10.x单节点请访问这里 一、集群环境说明 服务器IP地址192.168.137.1,192.168.137.2,192.168.137.3 二、前期准备 1. 拉取镜像 docker pull elasticsearch:7.10.12. 首先需要创建一个用于生成秘钥的初始容器&#xff0…...

electron 左上角图标 dev(开发环境)可显示 build(打包)后无法显示

先说解决方法,用于作为图标的ico文件需要富集多种尺寸,必须包含256*256,且同时应当包含其他更小的尺寸。 例如: 接下来解释一下这么做的原因 ico是Iconfile的缩写,是Windows计算机中的一种图标文件格式,…...

全球与中国BGO晶体市场:增长趋势、竞争格局与前景展望

BGO晶体,全名为Bismuth Germanate Scintillation Crystal(铋锗酸盐闪烁晶体),是一种用于探测放射性粒子和射线的闪烁晶体材料。它的主要成分是铋氧化物(Bi4Ge3O12),其中铋和锗的特性使得这种晶体…...

华三路由交换技术基础——计算机网络基础

计算机网络: 定义:一组具有自治权的计算机互联的集合 作用: 1.共享信息资源 2.分解式处理信息 4.负载均衡 5.综合信息服务 它是计算机技术与通信技术的两个领域的结合 一,计算机网络中的基本概念: 局域网&#xff…...

Docker搭建RK3568开发环境

推荐:Ubuntu 20.04 版本 Docker加速 # 编辑 Docker 配置文件 $ sudo vim /etc/docker/daemon.json# 加入以下配置项 {"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidu…...

【GAMES202】Real-Time Ray Tracing 1—实时光线追踪1

一、前言 这篇我们开始新的话题—Real-Time Ray Tracing简称RTRT,也就是实时光线追踪,关于光线追踪,我们已经不止一次提到过它的优点,无论是软阴影还是全局光照,光线追踪都很容易做,唯一的缺点就是速度太慢…...

Linux修复损坏的文件系统

如何判断文件系统是否损坏 当文件系统受损时,将会出现一些明显的迹象。例如,文件或文件夹无法访问、文件大小异常、系统启动慢或无法启动等。此外,系统也可能发出一些错误信息,如"Input/output error"、"Filesyst…...

三分钟学会一个新技能——使用Java操作Redis

目录 1、前置准备操作 1.1、为什么要进行前置准备操作 1.2、本地如何访问到云服务上Redis的6379端口号 1.3、配置步骤: 2、配置后本地主机如何操作 3、常用命令举例 3.1、通用命令举例 3.2、string相关命令举例 3.3、hash相关命令举例 3.4、list相关命令…...

连云港最新疫情/南京百度seo公司

很多事情做着做着就偏了,半途而废了。因为周计划没做,所以随波逐流了。因此,在每周日定下周计划,至于太长的规划,不要想太多,太大的目标容易畏惧和自暴自弃。 周一: GDAL源码剖析:…...

网站导航这么做/怎么给公司做网站推广

(1)从文件中加载图片void CScale3DCUserManageView::OnDraw(CDC* pDC) {// TODO: 在此添加专用代码和/或调用基类CImage image; //创建图片类 USES_CONVERSION;INT re _access(W2A(m_strUserPicPath), 0);//判文件是否存在if (re -1)return;image.Load(m_strUserPicPath); /…...

wordpress添加海报生成功能/百度空间登录入口

一、前言 在网站后台登录中,为了防止黑客攻击,大量盗刷登录请求,造成系统崩溃等安全攻击问题,如果使用账号/密码的方式登录,一般都会加一个验证码功能,验证码有多种形式,比较常用的有图片验证码,可以是数字加减乘除计算类型的,也可以是字母数据混合类型的,为了应对不…...

免费网站商城模板/郑州网站排名优化公司

1需求:请输出一个4行5列的星星(*)图案。 ***** ***** ***** ***** 2,注意事项: System.out.println("*");和System.out.print("*");的区别 外循环控制行数,内循环控制列数 class Demo1_ForFor {public…...

宽带固定ip的怎么做网站服务器/申请网站怎么申请

说明红色RGB(255,0, 0),绿色RGB(0,255,0),作为中间的过渡颜色RGB(255,255,0),因此简单的渐变运算过程如下:长度为d的矩形,均分两份,一份的RGB的R分量不变,G分量逐渐递增到…...

wordpress菜单属性/app推广渠道

前言:本文主要介绍了因为SELinux对网站目录权限控制的不当而引起网站无法正常操作和访问的问题。 正文开始:今天下午闲着没有事做于是突然兴起想尝试安装下Drupal。以前用Wordpress做博客久了,总想着尝尝新。 按照Installtion Guide提示的安装…...