概论:

select、poll和epoll三组I/O复用系统调用,这3组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回.返回值是就绪的文件描述符的数量。返回0表示没有事件发生,超时.

我们从事件集、最大支持文件描述符的数量、工作模式和具体实现等四个方面进一步比较它们的异同.

事件集:

这三个函数都是通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些事件,并使用该结构体类型的参数来获取内核处理的结果。

select模型:参数类型是fd_set,提供3个这样的结构来表示监听三种不同类型的事件可读、可写和异常.这使得select不能监听更多类型的事件。另外一方面由于内核对fd_set的输出结果进行修改,这使得select不得不在再次调用select时必须重置fd_set集合.

poll模型:把文件描述符和事件同时定义在一个结构体pollfd中。任何事件都统一处理,从而使得编程接口更加规范.并且内核每次返回修改的都是pollfd的revents成员,而events成员保持不变,所以下次调用poll不需重置.

但是select和poll的共同缺点:每次两者调用都需要返回整个用户注册的事件集.包括就绪的和未就绪的。这使得必须对整个事件集逐个遍历判断,时间复杂度O(n).

epoll模型采用了与select、poll完全不同的方式来管理用户注册的事件.它在内核中维护一个事件表,并提供一个独立的系统调用epoll_ctl来操作往其中添加、删除、修改事件。同时epoll_wait函数的events参数仅用来返回就绪的事件,这使得直接索引就绪文件描述符的事件复杂度O(1).

文件描述符的数量:

select能够同时监听最大的文件描述符数量是1024个,这使得往往对于大规模用户登录的服务器端明显不足。而poll和epoll相对没有限制,通常能够达到65535.

工作模式:

select、poll模型都只工作在相对低效的LT模式,而epoll可以工作在ET的高效模式.

 实现原理:

select和poll采用的都是轮询的方式,即每次调用都是扫描整个注册的文件描述符集合,并返回其中就绪的文件描述符集。而epoll采用的回调的方式,内核检测到就绪的文件描述符时,将触发回调函数,回调函数就会将该文件描述符上对应的事件插入内核就绪事件队列.

三组I/O复用模型的比较的更多相关文章

  1. select、poll、epoll三组IO复用

    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...

  2. Linux下的5种I/O模型与3组I/O复用

    引言 上一篇文章中介绍了一些无缓冲文件I/O函数,但应该什么时机调用这些函数,调用这些I/O函数时进程和内核的行为如何,如何高效率地实现I/O?这篇文章就来谈一谈Linux下的5种I/O模型,以及高性 ...

  3. I/O复用模型之select学习

    linux下的I/O模型可以分为5种: 1.阻塞式I/O模型 2.非阻塞式I/O模型 3.I/O复用模型 4.信号驱动I/O模型 5.异步I/O模型 简单解释: 阻塞和非阻塞:就是说需要做一件事的时候 ...

  4. epoll函数及三种I/O复用函数的对比

    epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd ...

  5. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  6. COMET探索系列二【Ajax轮询复用模型】

    写在前面:Ajax轮询相信大家都信手拈来在用,可是有这么一个问题,如果一个网站中同时有好多个地方需要用到这种轮询呢?就拿我们网站来说,有一个未读消息数提醒.还有一个时实时加载最新说说.昨天又加了一个全 ...

  7. swoole(3)网络服务模型(单进程阻塞、预派生子进程、单进程阻塞复用模型)

    一:单进程阻塞 设计流程: 创建一个socket,绑定端口bind,监听端口listen 进入while循环,阻塞在accept操作上,等待客户端连接进入,进入睡眠状态,直到有新的客户发起connet ...

  8. PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第三组

    七:终端风险管理-必选但包含可选步骤异常文件:终端检查应用主账号是否在异常文件列表(卡号黑名单)中.商户强制联机:商户可以将当前交易强制为联机处理.最低限额:控制交易当前交易金额或同一张卡片连续几笔交 ...

  9. CSS 设计彻底研究(三)深入理解盒子模型

    第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...

随机推荐

  1. PHPexcel:多sheet上传和下载

    excel表格上传和下载,断断续续写了很久,赶紧记下来万一以后忘记就亏大了= = 数据库有三张表:

  2. php用get_meta_tags轻松获取网页的meta信息

    之前没发现php还有这个函数,get_meta_tags()直接就可以获取文件中meta标签的属性值,返回数组: <?php $metas = get_meta_tags('http://www ...

  3. ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

    ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()   今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...

  4. rtf表格的合并

    {\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil Calibri;}{\f1\fnil\fcharset134 \'cb\'ce\ ...

  5. perl 登录某网站

    <pre name="code" class="html">use Net::SMTP; use LWP::UserAgent; use HTTP: ...

  6. Linux开发工具的使用

    1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1.   Linux开发工具的使用 V ...

  7. java.sql.SQLException:指定了无效的 Oracle URL

    java.sql.SQLException:指定了无效的 Oracle URL 昨天晚上用MyEclipse连接Oracle,出现了" java.sql.SQLException: 指定了无 ...

  8. AngularJs学习笔记3——自定义指令

    指令 概述: 前面也说过一些常用指令,用于快速入门.现在详细总结一下:指令用于实现各种页面的操作,是对于底层DOM操作的封装,扩展了HTML的行为,实现页面交互以及数据绑定. 指令是一种执行的信号,一 ...

  9. Android中获取网页表单中的数据实现思路及代码

    在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...

  10. javascript自定义浏览器右键菜单

    javascript自定义浏览器右键菜单   在书上看到document对象还有一个contextmenu事件,但是不知为什么w3school中找不到这个耶... 利用这个特性写了个浏览器的右键菜单, ...