linux基础编程—selectpollepoll

Posted CPP开发之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux基础编程—selectpollepoll相关的知识,希望对你有一定的参考价值。

工作中经常会被别人问到select、poll、epoll三个的区别是什么,下面讲对此做一个介绍和说明。具体如下:

1、select 和poll实现颇为相似,调用过程中都会做以下操作:(1)将用户态拷贝到内核态 (2)都会遍历fd_set遍历完成时如果没有可以读写的句柄,则会调用schedule_timeout进行睡眠。如果设备可读写时,则会唤醒睡眠的进程继续处理;如果达到超时时间还没有可读写,则会再次获得CPU资源,对fd_set进行重新遍历,判断是否有可读写的fd。(3)完成后,在由内核态拷贝到用户态;(4)有句柄数限制


2、epoll时为了解决select和poll存在的问题而诞生的。不同于select和poll的是,epoll提供了三个接口,分别是:epoll_creat(创建一个句柄),epoll_ctrl(监控)和epoll_wait(等待)。解决的问题主要有:(1)保证每个fd只会被拷贝一次。接受到新的注册事件时,epoll在ctrl接口成就完成了拷贝,不会在wait时进行重复拷贝(2)在epoll_ctl时把current流加载到设备等待队列并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd。不会像select一样每次都进行重新加载。(3)epoll理论上来说没有打开句柄数目的限制。

参考:

http://www.cnblogs.com/Anker/p/3265058.html

以上是关于linux基础编程—selectpollepoll的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络编程之selectpollepoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)

IO多路复用,selectpollepoll 编程主要步骤

SOCKET编程之一个端口如何建立多个TCP连接?(用fork子进程selectpollepoll都是可以的)一个端口最大支持建立多少个tcp连接?

Linux IO模式及 selectpollepoll详解

Linux IO模式及 selectpollepoll详解(转)

Linux IO模式及 selectpollepoll详解