深度剖析muduo网络库1.1---面试提问(阻塞、非阻塞、同步、异步)

server/2024/9/24 11:02:51/

面试过程中,如果被问到关于IO的阻塞、非阻塞、同步、异步时,我们应该如何回答呢?

结合最近学习的课程,我作出了以下的总结,希望能与大家共同探讨!

先给出 陈硕大神原话:在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO。

在这里插入图片描述

阻塞、非阻塞、同步、异步

对于一个典型的网络IO调用来说,阻塞、非阻塞、同步、异步都是在藐视IO的状态,而一个典型的IO调用,可以分为两个阶段:数据准备和数据读写。接下来拿recv()函数来谈这四个概念,

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

可以看出recv()函数需要传入的参数主要是sockfd,应用程序缓冲区buf以及buf的大小 。

首先我们来谈数据准备阶段。

数据准备分为阻塞和非阻塞:

阻塞:是指调用IO方法的线程进入阻塞状态,即sockfd工作在阻塞状态下,如果sockfd内核的tcp接收缓冲区中没有数据可读,recv就会阻塞当前的调用线程,直到有数据可读时返回。

非阻塞:如果sockfd工作在非阻塞模式状态下,是不会改变线程的状态,revc就会立即返回,我们可以通过返回值判断数据是否读入,例如返回值size大于0,表示实际读到数据的字节数;size==0,表示对方关闭了连接;size==-1&&errno=EAGAIN,size==-1表示出错,接着判断errno=EAGAIN或者EWOULDBLOCK表示socket设置为了非阻塞,连接成功但是没有数据,即数据未就绪,不会阻塞。

数据准备就绪以后,进入数据读写阶段

对于同步和异步,是分为IO同步异步以及业务逻辑层面的同步于异步,先来说说IO的同步与异步:

对于IO同步来说:应用程序需要自己将数据由内核缓冲区搬入buf里(不论是阻塞还是非阻塞),没有数据一直等待或者空转,这个期间应用程序不能执行其他事情;

对于IO异步来说:应用程序首先调用系统提供的异步IO接口,比如Linux平台下的aio_read、aio_write,将sockfd, buf以及通知方式(回调函数或者sigio信号通知)告知内核,由内核去将数据搬到buf,在这个期间应用程序可以去执行其他事情,内核将数据搬完后,内核就会按照事先约定的通知方式去通知应用程序,应用程序就可以直接开始处理数据。

注意::不论是阻塞还是非阻塞都是同步的,以及epoll一定是同步IO接口,因为epoll_wait(xxxxx,timeout),结束以后我们依旧要recv()。

再来说说业务逻辑层面的同步与异步,比如登录注册是同步实现还是异步实现:

同步:指的是A操作要调用B操作的API接口时,A操作一直等到B操作执行完后,得到返回值,然后才能继续向下处理。

异步:指的是A操作把自己感兴趣的事件以及通知方式告知于B,A继续执行自己的业务逻辑,等到B监听到相应事件后,再通知A去执行相应的处理逻辑。


http://www.ppmy.cn/server/32102.html

相关文章

【C++】---模板进阶

【C】---模板进阶 一、模版参数1、类型参数2、非类型参数 二、模板的特化1、函数模板的特化2、类模板特化(1)全特化(2)偏特化 三、模板分离编译1、模板支持分离编译吗?2、为什么模板不支持分离编译?3、如何…

数据库 和 SQL 和 索引事务 和 Java数据库编程(JDBC)

一、初识数据库 什么是数据库?和数据结构有什么关系? 数据库是“一类软件”,能够针对数据进行管理。数据结构,也是针对数据进行管理。所以,数据库其实就是一个“基于数据结构”实现出来的软件。 有哪些常用数据库&…

MySQL表的增删改查

在进行表操作之前,一定要use选中数据库 注释:在SQL中可以使用 --空格描述 来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。 文章目录 数据库约束约束类型NOT NULL约束UNIQUE:唯一约束DEFAULT&…

int类型的取值范围(为什么负数比正数表示的范围多一位)

🎁个人主页:我们的五年 🔍系列专栏:C语言基本概念 🌷追光的人,终会万丈光芒 目录 🏝1.int的基本概念: 空间大小: 有符号类型的表示形式: 🏝2.…

【Linux】进程等待

思维导图 学习目标 进程等待的必要性进程等待的方法wait函数和waitpid函数的学习参数status的介绍 一、进程等待的必要性 1.1 进程等待是什么? 任何子进程,在退出的情况下,一般都必须让父进程进行等到,进程在退出的时候&#x…

使用RTSP将笔记本摄像头的视频流推到开发板

一、在Windows端安装ffmpeg 1. 下载ffmpeg:下载ffmpeg 解压ffmpeg-master-latest-win64-gpl.zip bin 目录下是 dll 动态库 , 以及 可执行文件 ;将 3 33 个可执行文件拷贝到 " C:\Windows " 目录下 ,将所有的 " .dll " 动态库拷贝到 " C:\Windows\Sy…

001 springCloudAlibaba 负载均衡

文章目录 orderServerOrderController.javaProductClient.javaOrderServerApplication.javaServletInitializer.javaapplication.yamlpom.xml productServerProductController.javaProduct.javaProductServerApplication.javaServletInitializer.javaapplication.yamlpom.xml p…

Vue 项目 尚品汇(一)

一、开发环境构造 Vue-cli 脚手架初始化项目 node 平台 和 webpack 和 淘宝镜像 环境 (一)脚手架 1.安装脚手架 在我们的项目文件夹中路径输入 cmd 然后在终端中输入 vue create app(项目名) 选择 vue 2 然后安装 (因为是基于 vue2 开…