epoll所属IO模型的个人 见解

最近在学习IO模型,就突然想到了epoll属于哪个IO模型这个问题。要研究这个问题,我们首先要知道有哪些常用的IO模型。

常见的IO模型如下:

阻塞IO:程序阻塞直到IO可用。最简单的IO模型,你平时调用的recvfrom接收函数就属于这个模型。

非阻塞IO:程序调用IO函数后立刻返回,无论当前IO可用不可用。如果你把套接字设置成了非阻塞模式,那么你使用的就是这个模型了。

复用IO:程序阻塞到多个IO文件描述符上边,当至少一个IO可用的时候返回。select就属于是IO复用。

信号驱动IO:IO可用后程序被中断并执行相应的处理函数来读写IO。其他时间程序可以正常执行其他命令。

异步IO:异步IO和信号驱动IO的区别在于异步IO会在IO数据准备好(从内核复制到用户层)再通知程序去进行处理。

看完这些模型后我们还要知道epoll的基本机制。epoll中用户需要预先向epoll注册相关IO事件,然后调用epoll的主循环epoll_wait(),之后当IO事件发生的时候该函数返回所发生的IO事件的集合,并交由用户进行处理。

很明显,epoll不是前两种模型,现在的问题就在于epoll属于后三者的哪一个。

先看复用IO。复用IO的最主要特点在于阻塞到多个IO上边,当某个IO可用的时候返回。epoll中需要调用epoll_wait,然后epoll_wait返回可用IO处理,并交由用户处理。此时我们一般还要调用recv等函数去读写IO。这样一分析,epoll符合所有复用IO模型的特点,而且epoll本身的使用方法也像极了selec。

然后看看信号驱动IO。信号驱动IO的特点是IO可用的时候程序被中断,然后由中断函数处理IO事件。epoll中我们需要去执行主循环函数等待IO事件,并且IO事件的处理是由接下来的程序处理的,而非由某个回调函数自动处理,所以epoll明显不属于信号驱动。

最后看看异步IO。异步IO的特点在于系统是在IO数据准备好后再通知程序去处理的。而epoll只是告诉你哪个IO可用,以及这个IO的一些注册信息,真正要拿到IO数据还要靠你自己去调用recv等函数去内核拷贝。所以epoll也不属于异步IO。

综上,epoll和select一样,属于IO复用模型。 这里还要说的是,虽然epoll本身是IO复用模型,但是它的一些内部实现其实是用到了信号驱动IO、异步IO的特点,因为epoll是依靠中断来判断IO是否可用的,只不过封装到用户这里后就变成复用IO模型了。如果你想实现信号驱动IO或者复用IO,也只需要对epoll再进行简单封装。比如你可以另开一个线程去调用epoll主循环并且处理接收到的数据包,这就相当于信号驱动IO。如果再加上消息队列,每当数据包到来的时候先存放在消息队列中,之后由其他线程处理消息队列中堆积的数据包,这就相当于异步IO。

epoll所属IO模型的个人 见解

时间: 08-14

epoll所属IO模型的个人 见解的相关文章

[Z] linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO

原文链接:http://blog.csdn.net/colzer/article/details/8169075 IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据

linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据区,等一些属性).那么我们的应用程序对文件的读写就通过对描述符的读写完成. linux将内存分为内核区,用户区.l

[转]IO模型及select、poll、epoll和kqueue的区别

(一)首先,介绍几种常见的I/O模型及其区别,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal driven I/O (SIGIO) asynchronous I/O (the POSIX aio_functions)—————异步IO模型最大的特点是 完成后发回通知. 阻塞与否,取决于实现IO交换的方式.      异步阻塞是基于select,select函数本身的实现方式是阻塞的,而采用sel

五种网络IO模型以及多路复用IO中select/epoll对比

下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络IO模型 [阻塞blocking IO] 两阶段全程阻塞 recvfrom -> [syscall -> wait -> copy ->] return OK [非阻塞nonblocking IO] 第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据 recvfrom -&

Day30:IO模型

一.IO模型 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西.这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,为了更好的回答这个问题,先限定一下本文的上下文.本文讨论的背景是Linux

IO模型介绍 以及同步异步阻塞非阻塞的区别

阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成 同步:用户进程发起IO(就绪判断)后,轮询内核状态异步:用户进程发起IO后,可以做其他事情,等待内核通知 介绍一下IO模型 网络IO模型和文件IO模型是一样的,上图是IO的5种模型,包括阻塞IO.非阻塞IO.多路复用IO.信号驱动的IO.异步IO. 一次IO包括两个过程,内核数据准备 .把数据从内核空间copy到用户空间. 1.阻塞IO(re

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

5种网络IO模型(有图,很清楚)

同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西.这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,为了更好的回答这个问题,我先限定一下本文的上下文. 本文讨论的背景是Linux环境下的n

高性能IO模型浅析(转)

转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书吧. 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO