除常用文件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比较的更多相关文章

  1. select/poll/epoll on serial port

    In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...

  2. Linux下select&poll&epoll的实现原理(一)

    最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的st ...

  3. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  4. 多进程、协程、事件驱动及select poll epoll

    目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...

  5. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO

    本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   1.  多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...

  6. select,poll,epoll的归纳总结区分

    Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...

  7. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  8. select.poll,epoll的区别与应用

    先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...

  9. select poll epoll三者之间的比较

    一.概述 说到Linux下的IO复用,系统提供了三个系统调用,分别是select poll epoll.那么这三者之间有什么不同呢,什么时候使用三个之间的其中一个呢? 下面,我将从系统调用原型来分析其 ...

  10. select, poll, epoll

    select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024 http://www.cnblogs.com/bigwangdi/p/3182958.html ...

随机推荐

  1. Sass-也许你想和CSS玩耍起来(上篇)

    我们努力,我们坚持,共勉! 众所周知,css其实不是一门编程语言,熟悉的人都知道css全称Cascading Style Sheets(层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用) ...

  2. eclipse — Failed to load the JNI shared library”……\jvm.dll问题原因以及解决方案

    首先上一张出现问题的图片: 出现这个问题一般是你的jdk和eclipse不是同一位的,比如你的jdk是32位的但是eclipse下载的是64位的就会导致这种问题. 解决方案:把两者都换为32或者64位 ...

  3. 升级Xcode8、iOS10问题记录

    1.webView的代理方法: 升级前: - (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)e ...

  4. HTML5-01 简介

    标记语言 概述 标记语言(也称置标语言),是一种将文本及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机编码.与文本相关的其他信息(包括例如文本的结构和表示信息等)与原来的文本结合 ...

  5. iOS开发之功能模块--关于自定义TabBar条

    只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...

  6. Feathers UI 性能优化

    Feathers UI作者写的 http://joshblog.net/2013/feathers-performance-tips/

  7. C#命名规则和编码规范

    用Pascal规则来命名属性.方法.事件和类名. public class HelloWorld { public void SayHello(string name) { } } Pascal规则是 ...

  8. crontab设置作业间隔执行问题

    这个源于有个网友问,crontab里   */40  9  *  *  *  是不是代表9点开始每40分钟执行?  直觉这个肯定不是从9:00开始每隔40分钟执行一次,但是也不能肯定它代表一个什么样的 ...

  9. web.xml is missing and <failOnMissingWebXml> is set to true 错误解决办法

    对web项目的解决方案: 右击项目——>Java EE Tools——>Generate Deployment Descriptor Stub. 然后系统会在src/main/webapp ...

  10. OSX下 pip更新及安装python库

    直接执行安装命令 $ pip install builtwith 提示pip当前版本为7.1.2,要使用"pip install --upgrade pip"升级到8.1.2 $  ...