当前位置:网站首页>典型的一次IO的两个阶段是什么?阻塞、非阻塞、同步、异步
典型的一次IO的两个阶段是什么?阻塞、非阻塞、同步、异步
2022-08-02 07:19:00 【_索伦】
典型的一次IO的两个阶段是什么?
典型的一次IO的两个阶段是什么?
数据准备 和 数据读写。
网络IO阶段1——数据准备:
阻塞和非阻塞状态
recv方法示例:
int size = recv(sockfd, buf, 1024, 0);
如果sockfd上没有准备数据,那么调用IO方法的线程会进入阻塞状态;
而非阻塞不会改变线程状态,根据size返回值值来判断情况:
size == -1 && errno = EAGAIN // 一个正常的非阻塞返回
size == 0 // 对端关闭了连接
size > 0 // 返回的就是接收数据的大小。
网络IO阶段2——数据读写:
同步 和 异步
如果数据就绪,开始进行读写,应用程序这边的recv会花自己的时间,从内核缓冲区中读数据,拷贝到recv的buf里,这个过程应用程序是一直等待拷贝完成的,完不成就一直阻塞在那个位置,所以是同步操作。
而异步,是把sockfd,buf和一个信号或回调的通知方式告知内核,内核将数据拷贝到buf,这个过程应用程序不参与,可以去做其他事情,拷贝完成后,内核根据这个通知方式告知应用程序,这个操作就是异步。异步一般都是调用内核中aio的接口:

业务层面的一个逻辑处理是同步还是异步?
A操作等待B操作做完事情,得到返回值,继续处理
A操作告诉B操作它感兴趣的事件以及通知方式,A操作继续执行自己的业务逻辑了;等B监听到相应事件发生后,B会通知A,A开始相应的数据处理逻辑。
总结
陈硕大神原话:在处理 IO 的时候,阻塞和非阻塞都是同步 IO。只有使用了特殊的 API 才是异步
IO。
一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪”和“数据读写”,数据就绪阶
段分为阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。
同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都
是由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口
时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就
可以处理其它逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结
果。
边栏推荐
- OC-范畴
- spark架构
- postgres groupby merge strings
- typescript学习
- Please tell me, how to write Flink SQL and JDBC sink into mysql library and want to create an auto-incrementing primary key
- flutter解决键盘和输入框不适配问题
- About the SQL concat () function problem, how to splice
- pnpm install出现:ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies
- Transimpedance amplifier
- MySQL-数据库事务详解
猜你喜欢

Buried development process

Probability Theory and Mathematical Statistics

MySQL - locking mechanism

Enterprise training and reproduction guidebook - training and reasoning of the OpenPose model based on Huawei ModelArts platform, realizing the recognition of two behaviors of climbing and climbing ov

Comprehensive experiment of MPLS and BGP

DeadLock的可视化分析

HCIP 第八天

A full review of mainstream timed task solutions

论文理解:“Cross-Scale Residual Network: A GeneralFramework for Image Super-Resolution,Denoising, and “

Chain Of Responsibility
随机推荐
OC-NSSet(集合)
MySQL - slow query log
Go implements distributed locks
类型“DropDownList”的控件“ContentPlaceHolder1_ddlDepartment”必须放在具有 runat=server 的窗体标记内。
How to export multiple query results at once in SQL server 2014?
Azure Synapse Analytics上创建用户并赋予权限
A full review of mainstream timed task solutions
理论问题与工程问题的差异在哪里?
Chain Of Responsibility
MySQL-索引优化和查询优化
PanGu-Coder:函数级的代码生成模型
MySQL-FlinkCDC-Hudi enters the lake in real time
HCIP 第十天
如何保护智能家居不受黑客攻击
OC-Category
playwright 爬虫使用
LeetCode 2312. Sell Wood Blocks
【CV】OpenVINO installation tutorial
HCIP第七天
OC-NSNumber and NSValue are generally used for boxing and unboxing