最简洁易懂的方式介绍I/O模型

什么是I/O模型?

简单来说IO模型是指程序以何种方式等待数据或者状态的就绪,进而针对数据或者状态进行处理。“就绪”指的是数据准备好了或者某个状态发生了。比如程序等待socket接收数据到buffer中以后再进行数据处理;再比如server端socket变成连接状态后进行某种处理。程序为什么要等待呢?因为程序不能确定数据的读写会在什么时候完成,状态会在什么时候改变,程序需要等待这些事件的发生,然后进行相应的处理。比如server端socket接收客户端发过来的数据,然后进行数据处理,但是程序并不知道什么时候数据才会发过来,只能等在那里。

有哪些常用模型?
常用I/O模型有阻塞模型,非阻塞模型,多路复用模型和异步模型。

阻塞模型 (Blocking I/O)
阻塞指的是I/O方法调用(比如read)在数据或者状态还没有就绪的时候,一直等待,直到就绪才返回。比如阻塞模式下的Socket的read方法,如果没有接收到数据,read方法将会阻塞,程序就会停在那里,不能做其他的事情。这种模型下,如果服务器想处理多个连接,那么就要为每个Socket连接创建一个单独的线程,开销会很大。

非阻塞模型 (Non-Blocking I/O)
非阻塞模型是I/O方法调用(比如read)无论数据有没有就绪,会马上返回。如果有数据就会读到数据,如果没有数据就返回一个错误码。应用程序需要用轮询的方式不断去检测数据有没有就绪,但是程序不会被阻塞,除了轮询程序还可以做其他事情。但是这种轮询的方式会浪费CPU的时间,效率不够高。

多路复用模型 (I/O Multiplexing)
如果说数据就绪了系统能通知程序,而不是让应用程序轮询检测数据的就绪状态,岂不是就解决了非阻塞模型中的效率问题?是的,多路复用模型就是利用了系统的通知功能。常用的I/O多路复用有select和epoll。

先说多路复用中的selector。selector可以同时监听多个fd(File Descriptor - 文件描述符,比如文件系统的文件,socket都可以看做是文件,可以用fd表示)的某个就绪事件。以socket为例,selector可以监听多个socket的数据就绪状态。程序调用select方法,当所有监听的socket数据都没有就绪的时候,select会阻塞在这里,当被监听的socket中有数据就绪的了,select方法就返回了,应用程序需要遍历所有的socket去尝试读取数据。这种模型使得用户程序可以用一个专门的线程负责监听所有的socket的状态,避免了阻塞模型中为每个socket单独创建一个线程的情形。但是select的问题也很明显,就是系统不能通知到具体是哪一个socket的数据就绪了,程序需要遍历整个监听列表中所有的socket,会浪费CPU。并且Select监听的fd的个数也是有限制的,Linux上是1024。Java的NIO就使用了selector模型。

那对于上面的例子,系统可不可以通知程序具体是哪些socket的数据就绪了?Linux上的epoll可以做到。epoll提供了三个API,epoll_create, epoll_ctl, epoll_wait,分别可以创建epoll数据结构,注册监听fd的事件(比如注册监听socket的数据接收),和等待事件的发生。调用epoll_wait方法时,如果监听的事件没有发生,则会阻塞。继续以server端socket为例,应用程序按照类似selector的方式使用epoll,不同的是当某些socket数据就绪的时候,可以获取就绪的socket列表,而不需要遍历和检测所有的socket。epoll内部以一种非常高效的方式提供这个就绪的fd列表,并且没有监听数目的限制。这使得linux系统可以以更简单高效的方式支持更多的连接。

异步模型 (Asynchronous I/O)
异步模型是指用户给I/O方法调用(比如read)提供一个回调方法,I/O方法调用会立刻返回,等到数据就绪时回调方法会执行。这个看上去很好用,把所有的处理都推给了系统,用户只需要关心回调方法中的数据处理就行了,但是在高并发情况下,处理好系统I/O程序和用户程序之间的CPU竞争比较困难。

混淆的阻塞/非阻塞,同步/异步
关于I/O模型我们经常看到阻塞/非阻塞,同步/异步这几个词,可能会想阻塞不就是同步,非阻塞不就是异步吗?其实它们说的不是一回事儿。阻塞和非阻塞针对的是I/O方法调用时的行为。阻塞是指方法调用会一直等待直到数据就绪才返回;非阻塞是无论数据是否就绪方法调用都立刻返回,如果数据没有就绪则方法返回错误码,需要轮询检测数据就绪状态,在数据就绪时读出数据。同步异步针对的是I/O方法调用返回数据的方式。同步是指数据是调用的I/O方法返回的(在没有数据的时候返回错误码);异步指的是系统在数据就绪的时候把数据放到用户程序指定的用户缓冲区,然后通知程序说好了,或者直接调用用户提供的回调方法,数据作为参数。按照这个定义,上面提到的阻塞,非阻塞和多路复用模型都是同步的,只有异步模型是异步的。

作者公众号(码年)扫码关注:

原文地址:https://www.cnblogs.com/yufengzhang/p/11408358.html

时间: 2024-11-13 19:02:22

最简洁易懂的方式介绍I/O模型的相关文章

IntelliJ IDEA 编译方式介绍

原文:https://github.com/judasn/IntelliJ-IDEA-Tutorial/blob/newMaster/make-introduce.md 编译方式介绍 相比较于 Eclipse 的实时自动编译,IntelliJ IDEA 的编译更加手动化,虽然 IntelliJ IDEA 也支持通过设置开启实时编译,但是不建议,因为太占资源了.IntelliJ IDEA 编译方式除了手工点击编译按钮进行编译之外,还有就是在容器运行之前配置上一个编译事件,先编译后运行.默认下 In

javascript继承的实现方式介绍

javascript继承的实现方式介绍:作为面向对象的一门语言,继承自然是javascript所比不可少的特性,下面就简单介绍一下javascript实现继承的几种方式,希望能够对需要的朋友带来一定的帮助,下面进入正题.一.对象冒充: function A() { this.name="蚂蚁部落"; this.address="青岛市南区"; } function B() { this.target="提供免费的教程"; this.newA=A;

关于iOS中音视频播放的几种方式介绍

在IOS设计中,音视频的播放通常涉及到大部分设计过程中,因此清晰了解并使用音视频播放结构就很重要了,下面介绍几种常用的音视频的播放方式: (一) 使用系统提供的播放器,用system sound service去播放时长小于30s的音乐,通常是.caf,.aif,.wav格式: 创建一个系统播放对象: AudioServicesCreateSystemSoundID ( CFURLRef inFileURL, SystemSoundID *outSystemSoundID); AudioServ

几种VPN组网方式介绍

几种VPN组网方式介绍 VPN是(Virtual Private Network ,虚拟专用网络)的简称,最初是指通过公用网络(例如Internet)将多个不同地区的局域网,组建成广域网的一项技术.为什么要用VPN组网呢?我们简要介绍一下. 在Internet没有普及的时候,跨地区的单位如果要组建网络(广域网)需要从电信租用点对点或点对多点的"专线",例如某个单位总部在北京,在天津.广州.上海有分公司,如果这4个点要组成一个"大局域网",就需要租用3条专线,分别是从

0527.模态视图的概念以及显示、变换方式介绍

学几个单词 dissolve  [d?'z?lv] vi. 溶解:解散 curl  [k??l]  vi. 卷曲 什么是模态视图? 比如UIAlertView,它就是一个模态视图.对于模态视图和普通视图最主要的区别就是模态视图显示的时候不能对其他视图进行操作.主要用来收集或显示一些信息. 思考:弹出警告框的时候,背景视图变暗不能操作,所以说警告框就是一个模态视图. Presentation Style(显示方式) 对于iPhone来讲Presentation Style始终是UIModalPre

android 定位的几种方式介绍

[地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络中现有对于介绍android定位的几种方式,希望对大家有帮助: android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位, (1) Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智

sql for xml 另一种写法(采用 tag 与 union all,简洁易懂)

测试环境:sql 08, 08 R2, 2010,  2012, 2014 等 declare @agent table ( AgentID int, Fname varchar(5), SSN varchar(11) ) insert into @agent select 1, 'Vimal', '123-23-4521' union all select 2, 'Jacob', '321-52-4562' union all select 3, 'Tom', '252-52-4563' de

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

原文:C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍 在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一种是普通的Url菜单(类型为View的菜单),一种是事件菜单(类型为Click的菜单),一般情况下,微信的Url菜单,是无法获得用户的任何信息的,但微信用户信息非常重要,因此也提供了另外一种方式(类似重定向的方式)来给我们使用,本篇

Apache HTTP Server 与 Tomcat 的三种连接方式介绍

Apache HTTP Server 与 Tomcat 的三种连接方式介绍 整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能.利用 Web 服务器来做负载均衡以及容错.无缝的升级应用程序.本文介绍了三种整合 Apache 和 Tomcat 的方式. 3 评论: 刘 冬 ([email protected]), 开发工程师, 2007 年 1 月 15 日 内容 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomca