当前位置: 首页 > article >正文

阻塞/非阻塞、同步/异步、五种IO模型

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

网络IO阶段:

  • 数据就绪
    • 阻塞

      调用IO方法的线程进入阻塞状态

    • 非阻塞

      不会改变线程的状态,通过返回值判断
      int size = recv(sockfd, buf, 1024, 0);
      如果size = -1, 在阻塞的情况下可能是出错;
      在非阻塞的情况下还需要判断errno != EAGAIN && errno != EWOULDBLOCK

  • 数据读写
    • 同步

      当数据准备好后,应用程序主动读取数据,在读取数据时程序不能往下运行

    • 异步

      和非阻塞搭配使用
      将sockfd、 buf、通知方式(sig)等信息交给操作系统,应用程序就可以做自己的事了,
      当数据准备好后, 操作系统会自动将数据搬到buf,然后使用约定好的通知方式通知应用程序

!!在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO

linux异步IO接口:aio_read()/aio_write()
select、poll、epoll都是同步IO

五种IO模型

阻塞 blocking

不停的去检查这个函数有没有返回,必须等函数返回才能进行下一步操作

非阻塞 non-blocking(NIO)

事件未发生返回-1,此时根据errno区分是事件未发生还是出错

IO复用(IO multiplexing)

一次检测多个文件描述符的事件是否发生

信号驱动 signal-driven

linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行不阻塞,当IO事件就绪,进程收到SIGIO信号,再处理IO事件

异步 asynchronous

内核自动将数据拷贝到缓冲区,再通知应用程序


http://www.kler.cn/news/10539.html

相关文章:

  • SpringBoot基础配置
  • Spring相关概念
  • 2.28、共享内存(1)
  • springboot如何优雅的打印项目日志
  • 蹭ChatGPT热点有风险,昆仑万维蹭热点被发监管函
  • Vite打包后直接使用浏览器打开,显示空白问题
  • 题解,git的使用,MySQL与JDBC的使用(上)
  • NDK RTMP直播客户端二
  • Metasploit高级技术【第十章】
  • C++篇 ---- 命名空间namespace
  • 华为MatePad有什么好用的软件?
  • 用SSH登陆Centos系统时,命令行最前面显示“的提示符[root@www myapp]”是什么意思?
  • 【博学谷学习记录】超强总结,用心分享丨人工智能 AI项目 统计语言模型之HMM初步学习总结
  • 基于Python实现的深度学习技术在水文水质领域应用
  • Java多线程:定时器Timer
  • C++之入门之缺省参数函数重载引用
  • 【活动】高效学习方法分享
  • 「VS」Visual Studio 常用小技巧
  • 【C语言】迷宫问题
  • CLIP:语言-图像表示之间的桥梁
  • Arcgis Engine之打开MXD文档
  • Linux less 命令
  • SpringBoot ElasticSearch 【SpringBoot系列16】
  • 归排、计排深度理解
  • docker运行服务端性能监控系统Prometheus和数据分析系统Grafana
  • 智慧校园大数据云平台(4)
  • 2023.04.16 学习周报
  • Java学习
  • 【数据结构】解析队列各接口功能实现
  • JS实用技巧断点调试详解