epoll和select的分析

来源:互联网 发布:ubuntu安装打印机驱动 编辑:程序博客网 时间:2024/05/15 06:59

昨天关于epoll和select的问题被阿里的面试官狂虐,今天好好准备下吧。。。两个函数都是I/O多路复用

select 函数

int select(int maxfd,fd_set* read,fd_set* write,fd_set* exception,struct timeval* timeout);

     第一个参数是传递给内核的最大的描述符+1,

     参数read,write,exception,是观察这些描述符上是否有读、写、异常等,

     timeout有三种方式 1)timeout == NULL时,永远等待下去,直到有一个描述符准备好  2)timeout->sec != 0 || timeout->usec != 0 有一个描述符准备好就返回,但不超过给定

     的时间3)timeout->sec == 0 || timeout->usec == 0,根本不等待,立即返回.

函数返回准备好的描述符的个数


epoll 函数

int  epoll_create(int size) 返回一个要句柄,size是告诉内核大致要处理的事件的数目

int  epoll_ctl(int epfd,int op,int fd,struct epoll_event* event)  epfd是epoll_create返回的句柄,op是操作(三种,添加事件,修改事件,删除事件),fd是监听的连接套接字,event

是在告诉epoll对什么样的事件感兴趣

int  epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)

收集在epoll监控的事件中发生的事件,epoll会把发生的事件复制到events数组中,maxevents是events数组的大小,timeout表示没有检测到时事件发生时最多等待的时间,如果是0的话,会立即返回

两种触发方式:水平触发和垂直触发,当一个事件发生时,通过epoll_wait可以获取到该事件,但是当该事件对应的套接字缓冲区未处理完时,设置为边缘触发时,通过epoll_wait 不能获取到该事件,通过水平触发的方式可以.


三点不同:

1)select对文件描述符的个数有限制,epoll对事件发生的个数没有限制

2)select采用轮询的方式检查每个描述符是否是活跃的,epoll_wait获得的事件都是活跃的

3)epoll采用的是内存映射的技术,加速了内核态和用户态之间的消息传递

 参考:

http://blog.csdn.net/networm3/article/details/8659279

http://blog.csdn.net/mmz_xiaokong/article/details/8704988

http://blog.csdn.net/lingfengtengfei/article/details/12398299



0 0
原创粉丝点击