前言

网络IO会涉及到两个系统对象

  • 用户空间调用IO的进程或线程
  • 内核空间的内核系统

比如发生IO read时,会经历两个阶段,一个是等待数据准备就绪,另一个是将数据从内核拷贝到进程或线程中。因为在这两个阶段上有不同的情况,所以出现了多种网络IO模型

阻塞IO(blocking IO)

在linux中,默认情况下所有socket都是blocking的,如下图:

当用户进程调用read时,Kernel就进行第一阶段:准备数据。对于网络IO来说,很多时候数据包都没有到达,这个时候内核在等足够的数据到来。那么在用户进程这边,整个进程就被阻塞,当内核将数据准备好了,就会将数据从内核拷贝到用户内存,然后根据内核返回的结果,用户进程才会解除block状态,继续运行。
总而言之,blocking IO就是在IO执行的两个阶段都阻塞。

非阻塞IO

Linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket进行操作时,流程如下:


可以看出,非阻塞IO中,用户进程需要不断轮训kernel数据是否准备好了。
在非阻塞下,用recv接收数据,recv接口在调用后立即返回,返回值代表了不同含义

  • recv() 返回值 > 0,表示数据接收完毕,返回值是接收到的字节数
  • recv() 返回值 == 0,表示连接已经正常断开;
  • recv() 返回值 == -1,且errno等于EAGAIN,表示recv操作还未执行完成。
  • recv() 返回值 == -1,且errno不等于EAGAIN,表示recv遇到系统错误,具体需要看errno。

非阻塞的接口和阻塞的接口一个显著差别在于在被调用后是否立即返回。我们可以用fcntl来设置fd为非阻塞状态。

网络IO模型(一):阻塞IO与非阻塞IO相关推荐

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  2. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

  3. java非阻塞io流_阻塞式和非阻塞io流初认识

    1  什么是阻塞式和非阻塞式? 阻塞式IO:IO即input/output,阻塞式IO指的是"一旦输入/输出工作没有完成,则程序阻塞,直到输入/输出工作完成".在目前,我们从书本上 ...

  4. Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I

    Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I   1.1. .3 进程的阻塞1 1.2. 网络 ...

  5. Windows五种IO模型性能分析和Linux五种IO模型性能分析

    Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...

  6. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  7. python非阻塞输入_python_非阻塞套接字及I/O流

    首先,我们要明确2个问题: 普通套接字实现的服务端有什么缺陷吗? 有,一次只能服务一个客户端! 这种缺陷是如何造成的? accept阻塞:当没有套接字连接请求过来的时候会一直等待着 recv阻塞:当连 ...

  8. 同步阻塞与异步非阻塞

    syncBlocking & asyncNonblocking 转载:https://www.zhihu.com/question/19732473/answer/23434554 作者:严肃 ...

  9. Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结

    同步和异步:与消息的通知机制有关. 本质区别 现实例子 同步模式 由处理消息者自己去等待消息是否被触发 我去银行办理业务,选择排队等,排到头了就办理. 异步模式 由触发机制来通知处理消息者 我去银行办 ...

  10. 嵌入式驱动之阻塞操作、非阻塞操作

    阻塞 阻塞操作     是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作. 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非阻塞操作   进 ...

最新文章

  1. GPT-3数学不及格,愁坏团队,于是他们出了12500道数学
  2. ios cordova报gap://ready 弹出框,一直弹
  3. linux环境: shell初始化文件, for TCSH, CSH
  4. OAuth2.0文档
  5. 哈工大计算机系女生的宿舍,哈工大的硕博士们,这次被学校折腾惨了!
  6. centos7 没有pip命令_Linux(CentOS7)部署系列---Docker编排应用部署方案
  7. linux无线网卡的安装
  8. 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...
  9. BZOJ2176Strange string——最小表示法
  10. 实现类的构造函数,析构函数和赋值函数
  11. 最常见的5个导致节点重新启动、驱逐或 CRS 意外重启的问题
  12. kei4的安装教程(附下载地址)
  13. 怎样将exe打包成服务运行
  14. 群晖虚拟机VMM定时开启
  15. Linux eBPF内核源码sample/bpf全网最细解析(一)
  16. 微信小程序转换为uni-app项目
  17. 实时头发-面部皮肤分割与人脸肤色分类
  18. 解决c++读入文件时多读一个字符
  19. OSChina 周四乱弹 —— 只有食物才能收买我的灵魂
  20. t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数

热门文章

  1. kubernete架构体系介绍
  2. Spring JDBC的原理与实现
  3. linux中ping命令网络不可达或ping www.baidu.com未知的名称与服务
  4. 使用STM32在SPI模式下读写SD卡
  5. 一起来学孟德尔随机化(Mendelian Randomization)
  6. Mysql 还原.sql 文件
  7. 2021全球科技行业薪资报告出炉:字节高级码农年薪竟高达274万元,位居中国之首?
  8. 语音情感识别(Speech Emotion Recognition)相关资料
  9. 从菜鸟到大神:SEO优化方法大揭秘
  10. Codeforces Round #752 (Div. 2)部分题解(A ~ D)