linux五种IO模型

linux五种IO模型为了更好的理解五种 IO 模型 我们先来说一下几个概念 同步 异步 阻塞和非阻塞 同步和异步 这两个概念与消息的通知机制有关 同步 所谓同步 就是在发出一个功能调用时 在没有得到结果之前 该调用就不返回 比如 调用 readfrom 系统调用时 必须等待 IO 操作完成才返回 异步 异步的概念和同步相对 当一个异步过程调用发出后 调用者不能立刻得到结果 实际处理这个

  为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。

同步和异步

  这两个概念与消息的通知机制有关。

同步

  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。

异步

  异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。

阻塞与非阻塞

  阻塞与非阻塞与等待消息通知时的状态有关。

阻塞 

非阻塞

事例

②、同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

③、异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。

④、异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
  
  异步:下载完成“叮”一声通知;
  非阻塞:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知。


五种IO模型

阻塞式I/O
非阻塞式I/O
I/O复用(select,poll,epoll等)
信号驱动式I/O(SIGIO)
异步I/O(POSIX的aio_系列函数)



IO执行的两个阶段

阻塞式I/O模型:

非阻塞式I/O:

I/O多路复用(select,poll,epol):

  IO 多路复用的好处就在于单个进程就可以同时处理多个网络连接的IO。它的基本原理就是不再由应用程序自己监视连接,取而代之由内核替应用程序监视文件描述符。
  以select为例,当用户进程调用了select,那么整个进程会被阻塞,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从内核拷贝到用户进程。如图:
这里写图片描述
  这里需要使用两个system call (select 和 recvfrom),而阻塞 IO只调用了一个system call (recvfrom)。所以,如果处理的连接数不是很高的话,使用IO复用的服务器并不一定比使用多线程+非阻塞阻塞 IO的性能更好,可能延迟还更大。IO复用的优势并不是对于单个连接能处理得更快,而是单个进程就可以同时处理多个网络连接的IO。
  实际使用时,对于每一个socket,都可以设置为非阻塞。但是,如上图所示,整个用户的进程其实是一直被阻塞的。只不过进程是被select这个函数阻塞,而不是被IO操作给阻塞。所以IO多路复用是阻塞在select,epoll这样的系统调用之上,而没有阻塞在真正的I/O系统调用(如recvfrom)。



优势
  与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降底了系统的维护工作量,节省了系统资源。
主要应用场景
  ①、服务器需要同时处理多个处于监听状态或者多个连接状态的套接字;
  ②、服务器需要同时处理多种网络协议的套接字,如同时处理TCP和UDP请求;
  ③、服务器需要监听多个端口或处理多种服务;
  ④、服务器需要同时处理用户输入和网络连接。





信号驱动式I/O

异步I/O模型:

五种IO模型比较

这里写图片描述
  其实前四种I/O模型都是同步I/O操作,他们的区别在于第一阶段,而他们的第二阶段是一样的:在数据从内核复制到应用缓冲区期间(用户空间),进程阻塞于recvfrom调用。相反,异步I/O模型在这等待数据和接收数据的这两个阶段里面都是非阻塞的,可以处理其他的逻辑用户进程将整个IO操作交由内核完成,内核完成后会发送通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

参考
聊聊同步、异步、阻塞与非阻塞:https://www.jianshu.com/p/aed6067eeac9
《unix网络编程 :卷一》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212034.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午8:59
下一篇 2026年3月18日 下午9:00


相关推荐

  • 为什么国内很少人用树莓派(树莓派怎么玩)

    1.网站服务器在树莓派上搭建了一个博客网站,树莓派就放在家里,常年开机,使用内网穿透技术使得任何地方都可以访问我的博客,节省了服务器费用。虽然树莓派的性能比较差,但是当一个基本的服务器也足够了。树莓派安装lnmp套件搭建个人博客网站服务器|科技爱好者博客​www.lxx1.com2.做了一个广告屏蔽器用树莓派搭建了一个DNS服务器,主要用来屏蔽广告,效果非常不错,家里所有的上网设备都没有广…

    2022年4月12日
    600
  • ZPedia丨蚂蚁悄悄上线阿里版「 即梦」,完全基于千问底座,5秒生成4张2k大图,专治AI生图的不可控

    ZPedia丨蚂蚁悄悄上线阿里版「 即梦」,完全基于千问底座,5秒生成4张2k大图,专治AI生图的不可控

    2026年3月12日
    3
  • Vue生成二维码_生成二维码插件

    Vue生成二维码_生成二维码插件首先安装一下面这个插件cnpminstallvue-qr-S接下来在需要生产并下载二维码的页面引入importVueQrfrom’vue-qr’并在components中注册为组件components:{VueQr//二维码组件},data(){ return{ config:{//二维码配置logo:”,value:”} }

    2026年4月13日
    6
  • 24个希腊字母及其读音表

    24个希腊字母及其读音表序号大写小写英文注音国际音标注音中文注音 1A alphaa lf 阿尔法 2 betabet 贝塔 3 gammaga m 伽马 4 deltadelt 德尔塔 5 epsilonep silon 伊普西龙 6 zetazat 截塔 7 etaeit 艾塔 8 thet it 西塔 9 iotaiot 约塔 10 kappakap 卡帕 11

    2026年3月20日
    2
  • Windows 如何卸载 Docker

    Windows 如何卸载 Docker在卸载 Docker 之前 请确保系统上没有运行任何容器 运行以下 cmdlet 检查是否有正在运行的容器 PowerShell Leaveswarmmo thiswillauto dockerswarml Stopallrunni ForEach Object

    2026年3月26日
    2
  • scrapy爬虫出现Forbidden by robots.txt[通俗易懂]

    scrapy爬虫出现Forbidden by robots.txt[通俗易懂]先说结论,关闭scrapy自带的ROBOTSTXT_OBEY功能,在setting找到这个变量,设置为False即可解决。使用scrapy爬取淘宝页面的时候,在提交http请求时出现debug信息Forbiddenbyrobots.txt,看来是请求被拒绝了。开始因为是淘宝页面有什么保密机制,防止爬虫来抓取页面,于是在spider中填入各种header信息,伪装成浏览器,结果还是不行。。

    2022年6月3日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号