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

在面试过程中,如果被问到关于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.hqwc.cn/news/679100.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水面垃圾清理机器人的视觉算法研究

卷积神经网络是一种分层的数据表示模型,通常由数据输入层、卷积层、池化层、 非线性激活函数、全连接层以及输出结果预测层等组成,其中卷积层、池化层和非线 性激活函数是卷积神经网络中的重要组成部分。此外,有些模型会增加其他的层(归一 化…

C++贪心算法

关于string的系统函数! (注:以下函数只可用于string,不适用其他类型的变量) ① a.size(); 这个系统函数是用来获取这个string变量的长度的,我们通常会新建一个变量来保存他,以便之后使用。 …

linux centos7.9 快速安装python3环境

安装好linux centos7.9 默认只有python2的环境如下: python2.7.5这个很老旧的版本了,有很多新库不支持,性能可能也不行。 接下来快速安装python3环境,并设置源做到快速安装包,设置虚拟环境,打造强大的python实验环境: 1,下载,安装最小化的miniconda,可以通过这个自…

同一局域网如何从Windows系统拷贝文件到银河麒麟系统

1. 先将Windows下的、被拷贝文件所在文件夹设置为共享目录:在文件夹上单击右键选择“属性”菜单,弹出如下对话框: 按数字顺序单击鼠标左键,弹出如下对话框: 并将权限开放为Everyone,单击“共享”按钮。 在…

嵌入式开发八:STM32启动过程分析

本次给大家分析 STM32F4 的启动过程,这里的启动过程是指从 STM32 芯片上电复位执行的第一条指令开始,到执行用户编写的 main 函数这之间的过程。我们编写程序,基本都是用 C 语言编写,并且以 main 函数作为程序的入口。但是事实上&…

腾讯云服务器之ssh远程连接登录

一、创建密钥绑定实例 创建密钥会自动下载一个私钥,把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户权限 2、添加当前用户权限 查看当前用户名 echo %USERNAME%三、ssh远程连接到服务器 ssh ubuntu175.xxx.xxx.112 -i C:\Crack\cs2.pem四、修改root密码 s…

2024-05-08 问AI: 在深度学习中,介绍一下RMSProp 优化器

文心一言 在深度学习中,RMSProp(Root Mean Square Propagation)优化器是一种常用的优化算法,主要用于神经网络训练的梯度下降算法的变体。它是对Adagrad优化器的一种改进,旨在解决Adagrad中学习率过快下降的问题。 R…

可视化面板布局适配屏幕-基于 flexible.js + rem 智能大屏适配

可视化面板布局适配屏幕-基于 flexible.js rem 智能大屏适配 VScode 安装cssrem插件引入flexible.js在之后的开发都使用rem为单位,安装cssrem插件就是为了快捷将px转为rem我们的设计稿是1920px,设置最小宽度为1024px,最后,我们可…

刷题训练之模拟

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握模拟算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷题训…

掌控网络流量,优化网络性能 - AnaTraf网络流量分析仪登场

在当今日新月异的网络环境中,网络流量监控和性能诊断已成为企业IT部门不可或缺的重要工作。只有充分了解网络流量状况,才能有效优化网络性能,提高业务运营效率。针对这一需求,全新推出的AnaTraf网络流量分析仪应运而生,为企业提供全面的网络监控和性能诊断解决方案。 快速定位…

GD32F103RCT6/GD32F303RCT6(9)高级定时器互补PWM波输出实验

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布: 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转: 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

【3dmax笔记】035: 车削修改器

一、车削修改器介绍 车削:图形通过绕轴旋转来创建三维效果。 开放的样条线,车削之后是面片。闭合的样条线,车削之后,是实体。 一、车削修改器实例 绘制高脚杯,首先在前视图绘制如下二维图形。 添加一个车削的修改器…