网络IO的阻塞与非阻塞、异步与同步

2023-11-03

1. 阻塞与非阻塞

  • IO默认是阻塞的,设置非阻塞方法如下:
 #include <fcntl.h> //需要包含的头文件
 int flag = fcntl(cfd, F_GETFL);
 flag |= O_NONBLOCK;
 fcntl(cfd, F_SETFL, flag);
  • IO函数是否阻塞取决于连接的 fd 是否阻塞

  • 阻塞与非阻塞的主要区别在与是否等待系统内核数据就绪

  • 阻塞与非阻塞模型如下所示:
    在这里插入图片描述

  • 可以看到,在阻塞io模型中,即使内核数据未准备好,应用程序中的read函数也在等待;而在非阻塞io模型中,应用程序检测到系统内核数据未就绪,直接返回继续执行应用程序中的任务,但是会一直轮询查看内核中数据是否就绪。

  • 但是在数据拷贝阶段,两者都是阻塞的

2. 异步与同步

  • 异步:应用程序在内核数据准备阶段与数据拷贝阶段都不需要等待,这部分任务内核完成后直接通知应用程序,其实这就是异步非阻塞IO(AIO:Asynchronous no-blocking IO)。
    举个例子:你去面馆打包一份面,你和阿姨说了一声,等面好了,阿姨主动给你打电话通知你面已经到你家桌子上了。
  • 同步:应用程序中的同步io函数read在数据拷贝阶段需要等待
    同步阻塞BIO:blocking IO):
    例子:你去面馆打包一份面,你和阿姨说了一声,阿姨叫你在这等着看他做面(数据准备阶段),做完你拿着自己的碗去装面(数据拷贝阶段),装好了回家。
    同步非阻塞NIO:non-blocking IO):
    例子:你去面馆打包一份面,你和阿姨说了一声,阿姨说面没好,你继续溜达,时不时回来看看面好了没,等到面好了,你拿着自己的碗去装面(数据拷贝阶段),装好了回家。
  • 那么是否有异步阻塞io呢?答案是没有的,都已经是异步了,不需要应用程序管内核的数据准备和拷贝的事了,应用程序当然就没有阻塞这一说了!

水平有限,如有错误,大家多多指正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络IO的阻塞与非阻塞、异步与同步 的相关文章

随机推荐

  • 全新出品!阿里 P5 工程师~P8 架构师晋升路线揭秘

    阿里巴巴终于公开了从初级程序员到架构师的学习路线图 这里相对应的基本上就是从 P5 到 P8 的晋升体系 今天老师将会带着大家从初级程序员开始一点点分享整个晋升体系 职级 初级程序员 薪资 6 12K 开发年限 0 1 年 技术能力 能够理
  • 小程序开发:监听返回当前页面

    故事背景 小程序开发 需要判断进入当前页面是初次加载还是返回的操作 就分享一下卤煮的实现思路吧 实现原理 先上图 我们都知道 在创建page页面的时候 开发工具会默认帮我们把生命周期的钩子一起生成 卤煮就用到了下面这两个钩子函数 原理 页面
  • 改变Element-ui 主题颜色

    主题颜色的改变本质是改变 样式的color 文字 背景 描边 局部改变可以使用 样式穿透 普通css root gt gt gt el upload list item transition none important webkit tr
  • 产业区块链一周动态丨深圳龙华区与腾讯共建产业区块链联盟,新四板试水区块链...

    作者 邱祥宇 10 24 会议之后 产业区块链似乎成为了一种政治正确 全国26省将区块链写入政府工作报告 12省发布专项政策19件 一顿操作猛如虎 整个行业拿到融资的公司却只有17家 政策热火朝天 资本望而却步 是什么原因导致中间出现断层
  • mysql分布式实践 - keepalived 实现IP漂移

    前言 mysql 分布式尤其是主 主 复制架构中 也是实现了读写分离的 如果有一个主master 挂掉了 那么如何让用户无感知的将请求打到另外一个master上 keepalived 插件的IP漂移就可以实现 1 keepalived 原理
  • 利用ipv6,在windows和ipad上远程访问共享文件夹

    利用ipv6 在windows和ipad上远程访问共享文件夹 背景 之前说到用ipv6 解决了远程桌面连接问题 利用ipv6远程桌面 彻底解决校园网掉线带来的问题 那么问题又来了 我在实验室电脑下载了python学习视频 这个视频特别大 几
  • 帧间差分法、背景减法、光流场法简介

    概述 运动目标检测是指当监控场景中有活动目标时 采用图像分割的方法从背景图像中提取出目标的运动区域 运动目标检测技术是智能视频分析的基础 因为目标跟踪 行为理解等视频分析算法都是针对目标区域的像素点进行的 目标检测的结果直接决定着智能视觉监
  • 4个最实用最强大ChatGPT插件

    GPT的插件有很多 功能也很强大 这些插件是自定义模块 可以集成到为特定行业量身定制的 AI 聊天机器人中 包括电子商务 医疗保健 金融和教育 使用 ChatGPT 插件 您现在可以做的不仅仅是聊天 今天给大家分享4个经常使用的插件 希望能
  • Qt Plugin插件机制与实例

    1 Qt 插件机制 1 1 Qt 插件简介 插件是一种遵循一定规范的应用程序接口编写出来的程序 定位于开发实现应用软件平台不具备的功能的程序 插件与宿主程序之间通过接口联系 就像硬件插卡一样 可以被随时删除 插入和修改 所以结构很灵活 容易
  • 深度:微软对Sun的步步紧逼催生了JavaFX

    在旧金山召开的JavaOne会议上 Sun首次公开了Java家族的新产品JavaFX 之后国内外各大媒体就开始竞相报道 也采访了国内的一些Java技术方面的专家 大家针对这一产品的褒贬不一 打开参与JavaFX产品研发的Sun的工程师Chr
  • 解决一个安装office2016缺少vcruntime140.dll的问题

    问题描述 在安装并激活好office2016之后 双击word 显示 缺少vcruntime140 dll 解决方案一 1 下载vcruntime140 dll 2 复制到C盘windows sysWOW64 3 然后寻找下载文件夹里zhu
  • 一文详解 Spring Bean 循环依赖

    一 背景 有好几次线上发布老应用时 遇到代码启动报错 具体错误如下 Caused by org springframework beans factory BeanCurrentlyInCreationException Error cre
  • chooseAddress:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.js

    错误描述 在使用uni app开发微信小程序的时候 想要通过uni chooseLocation获取用户地理位置的时候出现chooseAddress fail the api need to be declared in the requi
  • Linux环境安装配置ffmpeg

    最近需要在云主机上配置ffmpeg 租的服务器上面的环境往往是Linux 参考别人的文章配好了环境 在此进行综合记录 参考文章 https zhuanlan zhihu com p 347780238 https blog csdn net
  • Python 变量类型

    变量是存储在内存中的值 这就意味着在创建变量时会在内存中开辟一个空间 基于变量的数据类型 解释器会分配指定内存 并决定什么数据可以被存储在内存中 因此 变量可以指定不同的数据类型 这些变量可以存储整数 小数或字符 变量赋值 Python 中
  • python技能描述_【python】利用python爬虫 将LOL所有英雄的技能介绍给爬取下来

    工欲善其事 必先利其器 要想玩好LOL 那了解所有英雄的技能必然是其最基本的 所以此爬虫就应运而生 运行环境 python 3 7 此爬虫所用的库有 requests 获取网页信息 openpyxl Excel相关操作 pymysql My
  • UE4 命令行创建Pak

    原创文章 转载请注明出处 回头还会出一个通过编辑器扩展创建Pak的 命令行的还是比较麻烦 命令行打包如下 引擎版本4 25 由于使用新的引擎版本 感觉pak这块变化挺大的 1 gt 注意中间的空格 2 gt 解析 1 E engine 4
  • 2021全国大学生信息安全竞赛初赛部分WP

    第一阶段 Misc tiny traffic 分析pcap包 能发现几个可疑的请求 flag wrapper test secret 分别把它们传输的文件提取出来 得到三个压缩包 通过flag gzip的内容可以确认这个IP就是我们要分析的
  • 初次使用PPYOLOE-R

    目的 优化基于yolov5 obb旋转目标检测算法的证件区域检测 之前的方法是基于anchor 每次使用都要调试anchor 而ppyoloe r是free anchor的算法 源码位置 https github com PaddlePad
  • 网络IO的阻塞与非阻塞、异步与同步

    1 阻塞与非阻塞 IO默认是阻塞的 设置非阻塞方法如下 include