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

究竟什么是阻塞与非阻塞、同步与异步

文章目录

  • 前言
  • 阻塞与非阻塞
  • 同步与异步
  • 复杂的网络IO
  • 真正的异步IO
  • IO分类与示例
  • 总结

前言

这几个名词在程序开发时经常听到,但是突然问起来各个词的含义一时间还真是说不清楚,貌似这几个词都是翻译过来的,每个人的解释都不太一样,我对这几个词的理解也不是一成不变的,随着开发经验的积累,渐渐有了自己的记忆方式,所以总结一下,不一定准确,有问题可以一起聊一聊。

先说说我的结论:阻塞与非阻塞是指等待执行结果时的状态,同步与异步是指获取执行结果的方式,读起来有点绕口,听起来也迷迷糊糊的,没关系,我们用具体的例子来说明应该就容易理解了。

阻塞与非阻塞

先说说『阻塞与非阻塞是指等待执行结果时的状态』这一句,是说在执行某个操作或者某个函数时,在没有拿到我们想要的结果时,我们的状态是怎样的,如果是一直等就是【阻塞】的,如果发现没有结果就去做别的事情了就是【非阻塞】的。

以常见的网络IO为例,服务器对客户端连接的socket调用read函数,试图获取客户端发送的请求数据,但是客户端并不总是有数据发送过来,所以想要获得数据我可以采用【阻塞】方式一直等,也可以采用【非阻塞】方式,在发现此时没有数据时就先去干别的事,一会再来看看。

同步与异步

再来说说『同步与异步是指获取执行结果的方式』这一句,以游戏中的常见升级发奖为例,可以主动调用升级函数,在执行完成后返回升级的结果,然后根据结果来发奖励,也就是【同步】写法,也可以注册一个监听等级变化的回调函数,注册完我就不管了,当升级时会将升级的结果通过回调函数传回来,这就是【异步】处理方式。

复杂的网络IO

为什么同步和异步没有用网络IO来举例呢?因为网络IO这里的情况更加复杂,虽然你注册了回调函数,但它很可能是个同步IO,究竟怎么回事,一起来看看。

我们知道要想从IO读取数据,需要经历「内核数据准备好」和「数据从内核态拷贝到用户态」两个过程,还是以read函数为例,如果设置为阻塞模式,相当于read函数等待了「内核数据准备好」和「数据从内核态拷贝到用户态」两个过程,然后取到IO数据,如果设置成非阻塞模式,当内核数据没准备好会直接返回,也就是不会等待第一个过程,但是当数据准备好时,会直接等待第二个过程完成后,将结果数据返回。

所以无论是否阻塞,我们都等待了第二个阶段,等着它执行完成后获取结果,所以这两种都是同步IO。

那作为IO多路复用里的“一哥”epoll也是同步IO吗?是的!那封装了select/poll/epoll的libevent可是用了Reactor模式,支持事件回调,它也是同步IO吗?是的!

真正的异步IO

有点惊呆了不是吗?那究竟什么是异步IO呢?还真有!Windows 里实现了一套完整的支持 socket 的异步编程接口 IOCP,而 Linux 是在 2019 年 5.1 版本 内核首次引入的高性能异步I/O 框架 io_uring,我确实都没用过,感兴趣的可以试一下

是否是异步IO就看「数据从内核态拷贝到用户态」这个过程需不需要等待,如果需要逻辑层自己等待这个过程取数据就是同步IO,如果这个过程都不用等,调用回调函数时已经把内核态的数据拷贝出来,并且通过回调将数据进行了回传,这就是异步IO。

IO分类与示例

所以总结下来一共有这么几种:同步阻塞IO,同步非阻塞IO,异步IO,为啥不区分异步阻塞IO和异步非阻塞IO呢?你在阻塞时搞个异步试试,办不到吧,所以异步只能与非阻塞搭配,也就习惯只写异步IO了。

一顿理论讲下来可能还是比较抽象,那我们再举个日常生活中的例子,比如中午买饭的过程:

同步阻塞IO就好像,你去食堂吃面条,但是你去这一锅面条还没煮好,然后你就一直在那里等啊等,等了一段时间终于做好了(数据准备的过程),但是你还得继续等工作人员把面条(内核空间)打到你的餐盘里(用户空间),才能找个桌子开始吃饭。

同步非阻塞IO就好像,你又去食堂吃饭,问大叔饭做好了没有,告诉你没有你就离开了,过了一会,你又来饭堂问大叔饭做好了吗,人家说说做好了,于是你等着把饭打到你的餐盘里,后面这个过程你是得等待的。

异步IO就好像,你在十分焦急的写BUG,这时到饭点肚子饿了,给食堂大叔打电话,等饭做好了麻烦给我送一份,等到饭好了真的送来直接就能吃了,一直在抓紧写BUG中间没有等待(做梦中)

我想大部分同学吃午饭都是第一种同步阻塞IO吧,第二种同步非阻塞IO可能也有,但是不是要重新排队啊,如果是第三种异步IO的情况,我只能说大哥/姐,我跟你混了~~

总结

  • IO分为同步阻塞IO,同步非阻塞IO,异步IO三类
  • 异步IO有Windows平台的 IOCP 和 Linux 平台的 io_uring
  • 从IO读取数据,需要经历「内核数据准备好」和「数据从内核态拷贝到用户态」两个过程
  • 分析阻塞和非阻塞看是否等待第一个过程,分析同步与异步看是否等待第二个过程

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

人生的岔路口,不知是机会还是风险,边走边看吧,毕竟路还是在脚下,空想也到不了终点~

相关文章:

究竟什么是阻塞与非阻塞、同步与异步

文章目录 前言阻塞与非阻塞同步与异步复杂的网络IO真正的异步IOIO分类与示例总结 前言 这几个名词在程序开发时经常听到&#xff0c;但是突然问起来各个词的含义一时间还真是说不清楚&#xff0c;貌似这几个词都是翻译过来的&#xff0c;每个人的解释都不太一样&#xff0c;我…...

Openlayer【三】—— 绘制多边形GeoJson边界绘制

1.1、绘制多边形 在绘制多边形和前面绘制线有异曲同工之妙&#xff0c;多边形本质上就是由多个点组成的线然后连接组成的面&#xff0c;这个面就是最终的结果&#xff0c;那么这里使用到的是Polygon对象&#xff0c;而传给这个对象的值也是多个坐标&#xff0c;坐标会一个个的…...

用SOLIDWORKS画个高尔夫球,看似简单的建模却大有学问

SOLIDWORKS软件提供了大量的建模功能&#xff0c;如果工程师能灵活使用这些功能&#xff0c;就可以绘制得到各式各样的模型&#xff0c;我们尝试使用SOLIDWORKS绘制高尔夫球模型&#xff0c;如下图所示。 为什么选用solid works进行建模&#xff1f; solid works是一款功能强大…...

Linux:Network: ARP被动删除的一个情况

今天看到Linux内核里arp代码相关的一个函数,让人想起来很久之前掉进去的一个坑。 说产品的实现里,会存放一个dummy的neighbor(arp记录)在系统里,然后根据这个dummy的记录做一些特殊的处理。 但是当时根本就不知道这个记录的存在,也就无从谈起说要在做设计时考虑它的存在。…...

『接口测试干货』| Newman+Postman接口自动化测试完整过程

『接口测试干货』| NewmanPostman接口自动化测试完整过程 1 Newman简介2 如何安装Newman&#xff1f;2.1 安装NodeJs2.2 安装Newman2.2 解决Newman不是内部命令 3 Newman使用3.1 Newman如何运行集合&#xff1f;3.2 如何查看帮助文档&#xff1f;3.3 环境变量设置3.4 关于全局变…...

根据商品链接获取拼多多商品详情数据接口|拼多多商品详情价格数据接口|拼多多API接口

拼多多&#xff0c;作为中国最大的社交电商之一&#xff0c;为卖家提供了丰富的商品详情接口。这些接口可以帮助卖家快速获取商品信息&#xff0c;提高销售效率。本文将详细介绍如何使用拼多多商品详情接口&#xff0c;以及它的优势和注意事项。 一、拼多多商品详情接口概述 …...

KaiwuDB 监控组件及辅助 SQL 调优介绍

一、介绍 KaiwuDB 具备完善的行为数据采集功能&#xff0c;此功能要求 KaiwuDB 数据库系统 C/E/T 端不同进程的不同维度的指标采集功能十分完善&#xff1b;在不同进程完成指标采集后&#xff0c;会通过 Opentelemetry 和 Collector 将指标存入 Prometheus&#xff0c;以便查找…...

双11再创新高!家电行业如何通过矩阵管理,赋能品牌增长?

双11大促已落下帷幕&#xff0c;虽然今年不再战报满天飞&#xff0c;但从公布的数据来看&#xff0c;家电行业整体表现不俗。 根据抖音电商品牌业务发布的收官战报&#xff0c;家电行业创造了成交新纪录&#xff0c;整体同比增长125%。快手官方数据显示&#xff0c;消电家居行业…...

苏东坡最经典的诗词

苏东坡最经典的诗词_诗词_百度汉语 水调歌头明月几时有 [作者] 苏轼 [朝代] 宋 丙辰中秋&#xff0c;欢饮达旦&#xff0c;大醉&#xff0c;作此篇&#xff0c;兼怀子由。明月几时有&#xff1f;把酒问青天。不知天上宫阙&#xff0c;今夕是何年。我欲乘风归去&#xff0c;又…...

iterator遍历赋值

在Java中&#xff0c;迭代器&#xff08;Iterator&#xff09;是用于遍历集合的对象。它提供了一种顺序访问集合元素的方式&#xff0c;但是不能直接用于给特定索引赋值。 迭代器只能用于遍历集合并访问集合中的元素&#xff0c;而不能通过迭代器来修改集合元素的值。如果你想…...

【从删库到跑路】MySQL数据库 — E-R图 | 关系模型

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f339;简述什么是E-R图⭐核心概念 &#x1f339;E-R图…...

网工内推 | 美的、得力集团,包吃包住,IE认证优先,14薪

01 美的 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责IT网络设备、IDC机房的日常维护巡检、监控和管理&#xff1b; 2.负责路由、交换、防火墙、无线控制器、AP等网络设备的开通、调整、优化升级&#xff1b; 3.负责公司OT、IT网络规划&#xff0c;项目实施以…...

java springboot在测试类中构建虚拟MVC环境并发送请求

好 上文java springboot在测试类中启动一个web环境我们在测试类中搭了一个web环境 那么 下面就要想办法弄一个接口的测试 这边 我们还是要在controller包下去创建一个 controller类 写一个访问接口 这里 我创建一个 TestWeb.java 这里 我们编写代码如下 package com.example.…...

python运算符重载之字符串显示和右侧加法

1 python运算符重载之字符串显示和右侧加法 1.1 重载字符串显示 1.1.1 str和repr python调用prin()t时&#xff0c;自动调用__str__和__repr__&#xff0c; python调用str()时&#xff0c;自动调用__str__和__repr__&#xff0c; python调用repr()时&#xff0c;自动调用_…...

卷积神经网络(AlexNet)鸟类识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、AlexNet (8层&#xff09;介绍四、构建AlexNet (8层&#xff09;网络模型五、…...

hive 报错return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误&#xff0c;大家觉得应该怎么办&#xff1f;从哪方面入手呢&#xff1f; 1.百…...

Java Web——XML

1. XML概述 XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。XML是一种用于存储和传输数据的语言&#xff0c;它使用标签来标记数据&#xff0c;以便于计算机处理和我们人来阅读。 “可扩展”三个字表明XML可以根据需要进行扩展和定制。这意味…...

【.NET Core】Task应用详解

【.NET Core】Task应用详解 文章目录 【.NET Core】Task应用详解一、概述二、Task用法应用2.1 通过New实例化Task2.2 通过Factory中StartNew方法2.3 通过Run方法 三、让Task任务按顺序执行四、通过异步Run方法异步执行顺序Task五、创建带有返回值的Task<TResult>六、Task…...

convertRect:toView 方法注意事项

这是在网上找到的一张图 我们开发中有时候会用到左边转换&#xff0c;convertRect:toView 通常情况下&#xff0c;我们回这样使用 CGRect newRect [a convertRect:originframe toView:c];其中newRect和 originframe的size相同&#xff0c;只改变origin newRect.origin a…...

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造成基础伤害。小…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

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

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

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...