【笔记】select, poll, epool

Select 系统调用:

  select 轮询监听多个文件描述符的数组,其原理如下(转自:这里):

从用户空间拷贝fd_set到内核空间
注册回调函数__pollwait;
遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等待队列传给内核,让内核把当前的进程挂载到其中);
当设备就绪时,设备就会唤醒在自己特有等待队列中的【所有】节点,于是当前进程就获取到了完成的信号。poll文件操作返回的是一组标准的掩码,其中的各个位指示当前的不同的就绪状态(全0为没有任何事件触发),根据mask可对fd_set赋值;
如果所有设备返回的掩码都没有显示任何的事件触发,就去掉回调函数的函数指针,进入有限时的睡眠状态,再恢复和不断做poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。
只要有事件触发,系统调用返回,将fd_set从内核空间拷贝到用户空间,回到用户态,用户就可以对相关的fd作进一步的读或者写操作了。

  上述标红的地方都是比较耗时的,这是select的一大缺陷,此外,select只能监听有限的文件描述符(可修改内核参数)。

  select跨平台特性是其一大优点

Poll 系统调用

  Poll与Select基本一致,只是没有了监听描述字的个数限制

Select和Poll都是只支持水平触发

注:select()和poll()将就绪的文件描述符告诉进程后,如果进程没有对其进行IO操作,那么下次调用select()和poll()的时候将再次报告这些文件描述符,所以它们一般不会丢失就绪的消息,这种方式称为水平触发(Level Triggered)

epoll 系统调用

  epoll 是linux系统才有的, 几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法:转自这里

epoll支持水平触发和边缘触发(Edge Triggered, 告诉进程哪些文件描述符刚刚发生变为就绪状态,只说一遍,如果进程没有进一步动作,将不会再次告知),

epoll同样只告知那些就绪的文件描述符,而且当我们调用epoll_wait()获得就绪文件描述符时,返回的不是实际的描述符,而是一个代表就绪描述符数量的值,你只需要去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里也使用了内存映射(mmap)技术,这样便彻底省掉了这些文件描述符在系统调用时复制的开销。

另一个本质的改进在于epoll采用基于事件的就绪通知方式。在select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知

  原理:转自这里

epoll原理概述

调用epoll_create时,做了以下事情:

  1. 内核帮我们在epoll文件系统里建了个file结点;
  2. 在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket;
  3. 建立一个list链表,用于存储准备就绪的事件。

调用epoll_ctl时,做了以下事情:

  1. 把socket放到epoll文件系统里file对象对应的红黑树上;
  2. 给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。

调用epoll_wait时,做了以下事情:

观察list链表里有没有数据。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。而且,通常情况下即使我们要监控百万计的句柄,大多一次也只返回很少量的准备就绪句柄而已,所以,epoll_wait仅需要从内核态copy少量的句柄到用户态而已。

时间: 2024-10-05 05:05:46

【笔记】select, poll, epool的相关文章

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

最近简单看了一把Linux linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已经有IO事件就绪 如果已经有IO事件就绪,则直接所收集到的IO事件返回,本次调用结束 如果暂时没有IO事件就绪,则根据所给定的超时参数,选择性地进入等待 如果超时参数指示不等待,则

高性能网络服务器--I/O复用 select poll epoll_wait之间的区别

一.select 使用的集合的方式,最多只能监听1024个文件描述符,内部使用位操作,将相应的位置为1或者置为0,需要将可读.可写.异常的三类事件分开来用,内部使用轮询的方法,每次返回都需要将所有的套接字从内核到用户空间之间进行拷贝. 二.poll 比select稍微好一点,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪. 三.epoll_wait 把用户关心的文件描述符上事件放在内核里的一个事件表中从而无需像select和poll那样每次调用都要重复传入文件描述符集或者事件集.

select, poll, epoll区别详解(一)

1 select函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 1.1 参数说明 第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查. 第二三四个参数表示需要关注读.写.错误事件的文件描述符位数组,这些参数既是输入参

I/O多路复用之select,poll,epoll简介

一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作. 2.select的优点 目前几乎在所有的平台上支持,具有良好的跨平台支持. 3.select的缺点 单个进程能够监视的文件描述符的数量存在最大限制.默认情况下,在Linux上单个进程能够打开的最

select/poll/epoll on serial port

In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port to transmit data between PC and Raspberry pi. Outline Character device file of serial port Naive serial communication Asynchronous conferencing Select

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

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

I/O多路复用 SELECT POLL -- 内核实现

等待队列 先补充个基础知识――等待队列 认识 定义 wait_queue_head_t wait_queue; 初始化 init_waitqueue_head(&wait_queue); 等待 wait_event(queue, condition)   等待某个条件而进入睡眠 wait_event_interruptible(queue, condition)  等待某个条件而进入睡眠并允许信号中断睡眠 wait_event_timeout(queue, condition,timeout)

Linux的I/O多路复用机制之--select&poll

1. Linux下的五种I/O模型 1)阻塞I/O(blocking I/O)2)非阻塞I/O (nonblocking I/O)3) I/O复用(select 和poll) (I/O multiplexing)4)信号驱动I/O (signal driven I/O (SIGIO))5)异步I/O (asynchronous I/O (the POSIX aio_functions)) (前四种都是同步,只有最后一种才是异步IO.) 五种I/O模型的比较: 2.多路复用--select 系统提

I/O多路复用之select,poll,epoll的区别

一.关于select,poll,epoll 三种IO模型,都属于多路IO就绪通知,提供了对大量文件描述符就绪检查的高性能方案,只不过实现方式有所不同: select原理概述: 调用select时,会发生以下事情: (1)从用户空间拷贝fd_set到内核空间: (2)注册回调函数__pollwait: (3)遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等