Linux 五种IO模型


注:还有一种信号驱动IO,使用较少暂不讨论;

一,区分阻塞、非阻塞和同步、异步


看了很多文章对这两组概念解释和对比,说的太复杂了,其实没必要,两句话就能说清楚。
首先,对于读数据recv或read(写数据同理),分两个阶段:

  1. 等待数据可读;
  2. 系统调用讲数据从内核拷贝到用户空间;

然后,对比两组概念:

  • 阻塞、非阻塞是对于等待数据可读、可写时,是否死等,即看第一阶段;
  • 同步、异步是对于数据在用户空间和内核传递时,是否等待完成,即看第二阶段;

可以得出结论:阻塞IO、非阻塞IO、多路复用都属于同步IO,区别于异步IO。

二,关于多路复用


  • 多路复用介绍参考:万字图解| 深入揭秘IO多路复用-腾讯云开发者社区-腾讯云
  • IO 多路复用的复用指的是复用线程,而不是IO连接,目的是让少量线程能够处理多个IO连接和读写;
  • 多路复用有两个会阻塞的阶段:第一阶段阻塞在select、epoll等系统调用,第二阶段阻塞在数据拷贝;
  • 多路复用首先是同步IO,但是阻塞还是非阻塞不同文章说法不一,如果从第一阶段是否卡住死等数据就绪来看,是阻塞IO。
  • 注意区分系统调用(如select、epoll)的阻塞和socket本身的阻塞,一般来说使用select、epoll是需要将socket设置为非阻塞的,因为有时返回socket可读但执行recv时发现并没数据,如果阻塞就会卡住;再者避免由于一个FD的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。参考:使用epoll时需要将socket设为非阻塞吗?-腾讯云开发者社区-腾讯云

三,区分原生Socket的非阻塞和NIO


  • 原生Socket在创建的时候也可以指定为阻塞或非阻塞模式(区别只在第一个等待数据的阶段,第二个阶段调用recv拷贝数据都是一样的)。原生非阻塞Socket编程较复杂,比如可能需要循环判断send和recv的数据量是否完整,故一般不会轻易挑战。
  • 原生Socket也是可以编程实现多路复用的,参考:SOCKET编程与复用 | YuYoung's Blog
  • NIO底层实现也是操作的原生Socket,可以看作是对以上两点的包装,对使用者更友好。

=====================
点关注,不迷路,有缘再见!

相关推荐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
爱写代码的森9 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
REDcker10 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
ANSIOT12 小时前
安朔科技蓝牙无感开锁方案,靠近自动解锁
网络·科技·物联网
晏宁科技YaningAI13 小时前
VoIP系统的工程实现模型:从信令控制到媒体传输的完整架构解析
网络·人工智能·架构·系统架构·信息与通信
爱笑的源码基地13 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415913 小时前
TCP超时重传机制是为了解决什么问题?
java