Linux的5种IO模型用法详解

作者:三分恶 时间:2022-07-31 04:35:40 

阻塞IO(Blocking I/O)

阻塞IO是最常见的IO模型。

当发起一个IO操作时,比如读取数据,系统会调用read()函数。如果请求的数据没有准备好,此时进程会被挂起(blocked),进入等待状态。直到数据准备好,而且复制到应用进程的缓冲区,这时候才会返回。

从调用到返回,整个时间段都是阻塞的,所以被称为阻塞IO。

Linux的5种IO模型用法详解

就像是手机没电的时候,去饭馆吃饭,我点完菜,只能等着厨师做好,服务员端上来,我才能愉快干饭。这段时间,我就只能坐在座位上干等。

非阻塞IO(Non-Blocking I/O)

阻塞IO,还是比较浪费资源的,那么非阻塞IO就来了。

所谓非阻塞IO,是在调用IO操作时,如果缓冲区没有数据的话,直接返回一个错误码。应用进程需要不断轮询,来检查数据是否准备好。数据准备好了,就返回数据。

Linux的5种IO模型用法详解

就像是我奢侈一把,想吃个西餐,于是就去了肯德基,点完餐,我就可以坐着刷刷手机。当然,我还需要时不时地看看我的餐是不是已经备好,餐备好了,就去取一下。

多路复用IO(I/O Multiplexing)

虽然非阻塞IO相比阻塞IO,性能提升了很多,但是轮询过程中,还是有大量的系统调用,上下文切换的开销比较大。

那么,多路复用IO就来了。

多路指的是多个数据通道,复用指的是一个进程可以同时监控多个文件描述符(比如socket),当某个文件描述符状态发生变化(比如变得可读或可写),多路复用的函数将返回变化的文件描述符。

这样,在数据传输过程中,同一个进程中不同的任务都能被处理。特点是在数据传输过程中,进程能够同时处理多个任务,提高了程序的效率。

select、poll、epoll 等都是 I/O 多路复用的具体实现。

以select/poll为例,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以侦测多个fd是否处于就绪状态。当有fd就绪时,立即回调函数rollback,接下来就可以进行读取。

Linux的5种IO模型用法详解

就像是我想吃顿好的,于是选择去吃自助餐,自助餐有很多餐区,我先看看哪个餐区有我想吃的菜,然后端着盘子去取就行了,一个人就可以取多个菜,肉、蔬菜、水果,什么都能吃一点,而且不用怎么等。

信号驱动式IO(Signal-Driven I/O)

信号驱动式IO利用信号机制来进行数据传输。

进程首先告诉内核,当数据准备好时,请发送一个SIGIO信号。进程继续执行其他任务,等到收到信号后,再开始进行数据传输。、

Linux的5种IO模型用法详解

就像是我去吃饭,外带,跟服务员打声招呼,餐好了通知我,这时候我就可以去干其它事情,餐备好之后,服务员通知我,我取餐就行了。

异步IO(Asynchronous I/O)

异步IO是指当发起一个IO操作后,系统会立即返回。异步IO操作在后台进行数据传输,数据传输完成后,系统将通知进程。这样,在整个数据传输的过程中,进程都可以执行其他任务,不需要等待。

Linux的5种IO模型用法详解

就像是准备吃饭了,我自己懒得动,直接在某团上点个餐,点完之后爱干啥干啥,等着快递小哥给我送到就行了。

可以看到,阻塞非阻塞主要指的是等待数据这个过程应用进程需不需要挂起,同步异步指的是等待数据和数据拷贝这两个过程应用进程需不需要挂起,只有异步IO做到了完全异步。

来源:https://mp.weixin.qq.com/s/LYbJxorhsyoWWtP6OR6-eQ

标签:Linux,IO,模型
0
投稿

猜你喜欢

  • 浅谈新手想月赚几W 必需要有的资源

    2008-07-06 23:04:00
  • iis服务器应用程序不可用

    2009-01-19 13:36:00
  • WEB服务器系统盘权限简单设置

    2009-07-23 12:09:00
  • Discuz! X1模块独立程序目录和模板目录介绍

    2010-07-02 19:48:00
  • 聊聊Django+uwsgi+nginx服务器部署问题

    2023-09-09 05:38:34
  • linux入侵常用命令汇编

    2010-08-15 18:43:00
  • 李彦宏全球化战略:百度坚持两个市场并举

    2009-10-16 15:04:00
  • 教你修改UCenter Home分组名称

    2009-03-26 21:10:00
  • GoDaddy:如何在现有托管帐户创建Google站长工具

    2010-04-26 12:54:00
  • CentOS6.8中/英文环境切换教程图解

    2023-07-01 10:43:35
  • SupeSite7.0模板样式解析之日志篇

    2009-09-18 12:45:00
  • IIS优化指南

    2010-08-15 18:49:00
  • 详解Win10 Bash/WSL调试Linux环境下的.NET Core应用程序

    2023-08-22 04:15:02
  • Cyrus IMAP邮件服务器安装与配置(2)

    2007-08-14 15:42:00
  • 网站成功的关键在于“定位”

    2008-08-15 13:01:00
  • VMware Server的工作原理

    2009-09-09 13:04:00
  • 如何来衡量网站的价值和价格

    2007-11-16 16:14:00
  • 两种隐性的无效广告展示

    2008-07-27 16:57:00
  • 谷歌推出新型扩展式广告 考虑用户体验感受

    2009-03-06 12:50:00
  • 搭建Wordpress Mu的插件和注意事项

    2010-03-22 12:09:00
  • asp之家 网站运营 m.aspxhome.com