Linux的5种IO模型用法详解
作者:三分恶 发布时间:2022-07-31 04:35:40
阻塞IO(Blocking I/O)
阻塞IO是最常见的IO模型。
当发起一个IO操作时,比如读取数据,系统会调用read()函数。如果请求的数据没有准备好,此时进程会被挂起(blocked),进入等待状态。直到数据准备好,而且复制到应用进程的缓冲区,这时候才会返回。
从调用到返回,整个时间段都是阻塞的,所以被称为阻塞IO。
就像是手机没电的时候,去饭馆吃饭,我点完菜,只能等着厨师做好,服务员端上来,我才能愉快干饭。这段时间,我就只能坐在座位上干等。
非阻塞IO(Non-Blocking I/O)
阻塞IO,还是比较浪费资源的,那么非阻塞IO就来了。
所谓非阻塞IO,是在调用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,接下来就可以进行读取。
就像是我想吃顿好的,于是选择去吃自助餐,自助餐有很多餐区,我先看看哪个餐区有我想吃的菜,然后端着盘子去取就行了,一个人就可以取多个菜,肉、蔬菜、水果,什么都能吃一点,而且不用怎么等。
信号驱动式IO(Signal-Driven I/O)
信号驱动式IO利用信号机制来进行数据传输。
进程首先告诉内核,当数据准备好时,请发送一个SIGIO信号。进程继续执行其他任务,等到收到信号后,再开始进行数据传输。、
就像是我去吃饭,外带,跟服务员打声招呼,餐好了通知我,这时候我就可以去干其它事情,餐备好之后,服务员通知我,我取餐就行了。
异步IO(Asynchronous I/O)
异步IO是指当发起一个IO操作后,系统会立即返回。异步IO操作在后台进行数据传输,数据传输完成后,系统将通知进程。这样,在整个数据传输的过程中,进程都可以执行其他任务,不需要等待。
就像是准备吃饭了,我自己懒得动,直接在某团上点个餐,点完之后爱干啥干啥,等着快递小哥给我送到就行了。
可以看到,阻塞
和非阻塞
主要指的是等待数据这个过程应用进程需不需要挂起,同步
和异步
指的是等待数据和数据拷贝这两个过程应用进程需不需要挂起,只有异步IO做到了完全异步。
来源:https://mp.weixin.qq.com/s/LYbJxorhsyoWWtP6OR6-eQ
猜你喜欢
- 本文将详细介绍通过跟邮件服务器通信的Web应用程序,即webmail应用来注入某些邮件协议(IMAP和SMTP协议)命令来攻击邮件服务器的原
- 搜索引擎网站排名就如同每年春运的火车票一样,每个回家的人都在想尽办法将票搞到手。但真正有座位的票就那么多,再想买到好位置的票就得去花高价、找
- PHPWind v7.3.2“引用”的返回链接如果链接到主题部分出错。解决方法:打开job.php查找:} elseif 
- Grep的多次管道过滤问题在日常的开发过程中,我们利用grep可以方便快捷的查找感兴趣的日志内容,极大地提升了开发和排错效率。但是有时候,我
- 一. 在卸载VMware虚拟机之前,要先把与VMware相关的服务和进程终止1. 在windows中按下【Windows键】,搜索【服务】设
- 10月23日消息,网络电话服务Skype第三季度营收增长了27%,新增逾4000万用户。据国外媒体报道称,Skpye母公司eBay昨天发布了
- 通过对“大龄文艺女青年之歌”的成功炒作,使邵美女迅速走红。精准的多点切入为这次炒作奠定了良好的基础,准确把握受众心里更是这次营销成功的核心。
- 1. 登录godaddy账户,再产品列表中点击Hosting Account List进入主机列表。如下图所示2.点击要管理的主机域名后面的
- 新闻出版总署将在年底前对网络游戏前置审批和运营情况进行一次全面摸底和清理,凡未取得具有网络游戏经营范围的互联网出版许可证的企业,一律不得从事
- 什么是具有生命力的网站?这我要先说一下什么是网站的生命力,我觉得生命力是源动力,是促使网站更好发展的根本。具体到表现形式,就是如何更好的吸引
- 关闭SeLinuxsetenforce 0永久关闭:vi /etc/selinux/config关闭防火墙systemctl stop fi
- selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系
- 最近总是有用户向我要求“怎么不在软件里加点VIP的视频?”“可以看特别的频道或电影吗”诸多这样的问题。存在即是合理,想必做视频网站永远都无意
- Windows远程接入服务器允许VPN客户进行身份识别并且透明地连接到内部网络,就像直接连接到网络一样。这能够使用户以安全的方式进行远程工作
- 一、您必须有一个属于您自已的域名。比如:abc.com。没有域名的必须先注册一个域名。二、在国际域名中心注册一个DNS域名,以使您的DNS服
- 10月14日消息,据国外媒体报道,一场在2006年由几家“点击付费”搜索广告的签约客户对雅虎公司进行
- 北京时间11月6日消息,据国外媒体报道,Facebook将为其聊天工具(Facebook Chat)提供XMPP协议支持。这意味着用户通过任
- 什么是404错误HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生
- 部署禁止中文浏览器访问网站 在网站的根目录中的 htaccess 文件中,增加如下语句 #####################
- 默认状态下gftp是没有设置字符编码的,所以我们上FTP的时候,看到里面的中文文件名全部是乱码,或则不部分文件看到文件夹却没名字;其实在gf