Linux文件IO(四)IO多路复用

当程序进行IO时,如果数据尚未准备好,那么IO将处于阻塞状态。当某个进程有多个打开的文件,比如socket,那么其后的所有准备好读写的文件将受到阻塞的影响而不能操作。不借助线程,单一进程无法在同一时间服务多个文件描述符。非阻挡式IO可以作为一个解决方案,但是效率并不高。首先进程需要不断发IO请求,其次,如果程序可以休眠,让出CPU将提高效率。多任务式IO是在其中任何一个文件描述符就绪时收到通知,此时IO将不会受到阻挡,其余时间处于休眠状态,将CPU资源让给别的进程。
I/O多路复用的设计遵循以下原则:
1,I/O多路复用:当任何文件描述符准备好I/O时告诉我
2,在一个或更多文件描述符就绪前始终处于睡眠状态。
3,唤醒:哪个准备好了?
4,在不阻塞的情况下处理所有I/O就绪的文件描述符。
5,返回第一步,重新开始。

多任务式IO主要有select、poll、epoll三种:
select监视一大片文件描述符,监视的范围是最大的文件描述符maxfd加1,并将所监视的文件描述符分为三组,采用FD_ISSET宏查看哪些fd对应的bitmap变为准备状态,就可以对其进行操作。由于select()在各种Unix系统中都很容易实现,相对于微秒级精度的睡眠机 制来讲,经常将select()做为一种可移植的微秒级的睡眠机制:select (0, NULL, NULL, NULL, &tv)。此外BSD还是先了pselect()系统调用。Select可以用在文件描述符数量相对比较确定的场景。
poll是System V的IO多路复用方案,采用pollfd数组来设定需要监视的文件描述符,相比select需要为每个分组检查maxfd+1个比特位,效率更高。

EPoll接口
epoll把监听注册从实际监听中分离出来,从而解决了这个问题。一个系统调用初始化一个epoll上下文,另一个从上下文中加入或删除需要监视的文件描述符,第三个执行真正的事件等待(eventwait)。如果epoll_ctl()的参数event中的events项设置为EPOLLE,fd上的监听称为边沿触发,相反的称为水平触发。对于水平触发的监听,在步骤2里对epoll_wait()的调用将立即返回,以表明pipe可读。对于边沿触发的监听,这个调用直到步骤1发生后才会返回。也就是说,即使调用epoll_wait()时管道已经可读,调用仍然会等待直到有数据写入,之后返回。水平触发是默认行为。也是poll()和select()的行为,也是大多数开发者所期望的。边沿触发需要一个不同的方式来写程序,通常利用非阻塞I/O,并需要仔细检查EAGAIN。
水平触发在一个状态发生时触发。边沿触发只有在状态改变的时候才会产生。水平触发在只关心状态时有用。边沿触发则在关心事件本身时有用。

epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。epoll的主要优点有:
1、支持一个进程打开大数目的socket描述符;
2、IO效率不随FD数目增加而线性下降;
3、使用mmap加速内核与用户空间的消息传递。
int epoll_create (int size)
epoll_create()创 建 一 个 epoll实例,返回与该实例关联的文件描述符。这个文件描述符和真正的文件没有关系,仅仅是为了后续调用使用epoll而创建的。

int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event);
在epfd实例中加入一个fd指定的监听文件参数op用来添加、删除、修改fd指定文件的事件。events结构体中的events参数列出了在给定文件描述符上监听的事件。多个事件可以使用位或运算同时指定。最常见的是读写事件的监听: EPOLLIN | EPOLLOUT。

int epoll_wait (int epfd, struct epoll_event events, int maxevents, int timeout);
返回值是事件数,出错返回-1。events要保证有足够的buffer:
events = malloc (sizeof (struct epoll_event)
MAX_EVENTS);
nr_events = epoll_wait (epfd, events, MAX_EVENTS, -1);
如果timeout为 0, 即使没有事件发生 , 调用也立即返回,此时调用返回0。如果timeout为 -1,调用将一直等待到有事件发生。

原文地址:http://blog.51cto.com/13376824/2060154

时间: 2024-10-10 03:03:44

Linux文件IO(四)IO多路复用的相关文章

Linux文件权限【转载】

一.Linux文件权限    每个Linux文件具有四种访问权限:可读(r).可写(w).可执行(x)和无权限(-).    利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为    准.第一个字段由10个字符组成,如下:        -rwxr-xr-x    第一位表示文件类型,-表示文件,d表示目录    2-4位表示文件所有者的权限,u权限    5-7位表示文件所有者所属组成员的权限,g权限    8-10位表示所有者所属组之外的用户的权限,o权限      

python(十)下:事件驱动与 阻塞IO、非阻塞IO、IO多路复用、异步IO

上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 一.事件驱动模型介绍 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 第三种就是协程.时间驱动的方式,一般普遍认为第(3)种方式是大多数网络服务器采用的方式 论事件驱动模型 在UI编程中,,常常要对鼠标点击进行相应,

python IO模式(多路复用和异步IO深入理解)

1.事件渠道模型.事件渠道为异步IO的原型. 2.IO模式,一次IO调用会经历两个阶段.一.等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二.将数据从内核拷贝到进程中. 基于这两个阶段,linux系统下面产生了五种网络网络模式方案. -阻塞I/O(blocking IO) -非阻塞I/O(nobokcing IO) - I/O多路复用.(I/O multiplexing) - 信号驱动 -异步I/O(async) 由于信号驱动使用较少,主要介绍其余四种模式. 3.阻塞I/O

理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 一 IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能

linux块设备的IO调度算法和回写机制

************************************************************************************** 參考: <Linux内核设计与实现> http://laokaddk.blog.51cto.com/368606/699028/ http://www.cnblogs.com/zhenjing/archive/2012/06/20/linux_writeback.html *************************

Linux 性能优化之 IO 子系统 系列 图

http://blog.sina.com.cn/s/articlelist_1029388674_11_1.html Linux 性能优化之 IO 子系统(一) 本文介绍了对 Linux IO 子系统性能进行优化时需要考虑的因素,以及一些 IO 性能检测工具. 本文的大部分内容来自 IBM Redbook - Linux Performance and Tuning Guidelines FileSystem VFS(Virtual FileSystem) 虚拟文件系统 文件系统是内核的功能,是

Python 异步IO、IO多路复用

事件驱动模型 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 7 </head> 8 <body> 9 10 <p onclick="fun()">点我呀</p> 11 12 13 &l

Linux 环境下 网络IO模型

本文讨论的背景是Linux环境下的network IO. IO发生时涉及的对象和步骤: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel).当一个read操作发生时,它会等待内核经历两个阶段: 1  内核数据准备 (Waiting for the data to be ready) 2  内核把数据从内核空间,拷贝到用户空间中 (Copying the data from

java文件操作(IO流)

一.引言 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本能力.本章IO类的使用就从读写文件开始. 文件操作 文件(File)是 最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件.声音文件等数据文件,也经常需要根据需要从指定的文件中进行数据的读取.当然, 在实际使用时,文件都包含一个的格式,这个格式需要程序员根据需要进行设计,读取已有的文件