select,poll,epoll比较
除常用文件i/o外,其他常用io模型:
io多路复用(select和poll系统调用)
信号驱动I/O
linux专有的epoll编程接口
异步io(aio),linux在glibc中提供有基于线程的 posix aio实现。
大部分程序使用的i/o模型都是单个进程每次只在一个文件描述符上执行i/o操作,每次i/o系统调用都会阻塞直到完成数据传输。
对于很多应用来说,传统的阻塞式i/o模型就足够,但不是所有应用都可以满足。
如果在打开文件时设定了O_NONBLOCK标志,会以非组赛方式打开文件.如果i/o系统调用不能立刻完成,则会返回错误而不是阻塞进程,非阻塞i/o可以运用到管道、fifo,套接字,中断,为终端以及其他一些类型的设备上。
i/o多路复用允许进程同时检查多个文件描述符以找出他们中的任何一个是否可执行i/o操作,系统调用select和poll用来执行i/o多路复用。
信号驱动i/o当有输入或者数据可以写到指定的文件描述符时,内核向请求数据的进程发送一个信号。
epoll api出现在linux2.6版以后.
select()对于被检查的文件描述符有一个上限限制FD_SETSIZE,在linux下默认1024.
每次调用select和poll,内核都必须检查所有被指定的文件描述符。看他们是否处于就绪态。
每次调用select和poll.程序都必须传递一个表示所有被检查的文件描述符的数据结构到内核,内核检查过描述符后,修改这个数据结构并返回给应用程序。
select和poll调用完成后,程序必须检查哪个文件描述符必须就绪。
select和poll只支持水平触发
epoll api的核心数据结构称作epoll实例,它和一个打开的文件描述符相关联,这个文件描述符不是做i/o操作的,相反,他是内核数据结构的句柄。
epoll_create创建一个epoll实例时,内核在内存中创建一个新的i-node并打开文件描述,随后为进程中打开这个文件描述分配一个文件描述符。
内核数据结构,主要目的就是记录在进程中声明过的感兴趣的文件描述符列表和处于i/o就绪态的文件描述符列表。和兴趣列表管理是文件描述而不是文件描述符。
epoll_wait调用的目的就是让内核负责监视打开的文件描述.
文件描述表示的是一个打开文件的上下文信息(大小、内容等和文件有关的信息),可以比喻为抽屉。由内核管理。
内核分配给用户空间来一个文件描述符,可以操作文件描述的内容,比喻为抽屉的把手.一个文件描述多个文件描述符。
max_user_watches用来定义每个用户可以注册到epoll实例上的文件描述符总数。
epoll水平和边缘都支持。
水平触发通知:如果文件描述符上可以非阻塞的执行i/o系统调用,此时认为已经就绪。
边缘触发通知:如果文件描述符自上次状态检查以来有了新的i/o活动,此时需要触发通知。
边缘触发会出现文件描述符饥饿现象。
select,poll,epoll比较的更多相关文章
- select/poll/epoll on serial port
In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...
- Linux下select&poll&epoll的实现原理(一)
最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的st ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...
- 多进程、协程、事件驱动及select poll epoll
目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...
- Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO
本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO 1. 多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...
- select,poll,epoll的归纳总结区分
Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
- select poll epoll三者之间的比较
一.概述 说到Linux下的IO复用,系统提供了三个系统调用,分别是select poll epoll.那么这三者之间有什么不同呢,什么时候使用三个之间的其中一个呢? 下面,我将从系统调用原型来分析其 ...
- select, poll, epoll
select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024 http://www.cnblogs.com/bigwangdi/p/3182958.html ...
随机推荐
- JavaScript小细节点罗列
共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...
- ERP入门
为什么想起写这个题目哪?其实这个问题很久就想写了,记得2005年时候,公司新招的二位刚毕业的大学生,一个专业是经济管理,一个是会计,东北大区培训后公司让我选择了一位带一带,我选择了一个会计专业的(因为 ...
- 理解java虚拟机内存分配堆,栈和方法区
栈:存放局部变量 堆:存放new出来的对象 方法区:存放类的信息,static变量,常量池(字符串常量) 在堆中,可以说是堆的一部分 创建了一个student类,定义了name属性, id静态变量 ...
- 【代码笔记】iOS-图片旋转
代码: RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewControl ...
- 进新公司用cornerstone-checkout后遇到的奇葩bug,及解决方法
从cornerstone中checkout下新的工程,运行报错. 1.开始错误原因是找不到相对应的某个.m文件的路径 解决方案:将缺少的.m文件重新从项目文件夹中导入 2.后来显示 造成的原因是在下面 ...
- jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章
这些天将原来在网上找的jQuery插件进行了下整理,特此将代码分享出来给大家. 见下图结构. 对目录结构进行了分类.这里是插件列表. 这里总共收集了20来个插件.还有下面未进行划分的. 下面是DEMO ...
- 常用API——字符串String型函数
上图: 声明 var myString = new String(“Every good boy does fine.”); var myString = “Every good boy does f ...
- 在Mac电脑上为iPhone或iPad录屏的方法
在以前的Mac和iOS版本下,录制iPhone或者iPad屏幕操作是一件稍微复杂的事情.但是随着Yosemite的出现,在Mac电脑上为iPhone或iPad录屏的方法就变得简单了.下面就介绍一下具体 ...
- C#中 ??、 ?、 ?: 、?.、?[ ]
1. 可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值类型 ...
- TNS-12502: TNS:listener received no CONNECT_DATA from client
检查我们的一台ORACLE数据库的监听日志发现有不少TNS-12502错误信息.如下所示 TNS-12502: TNS:listener received no CONNECT_DATA from c ...