您的位置:首页 > 其它

select、poll、epoll的原理、优点、缺点比较总结

2016-07-30 20:30 344 查看
一、select:

实现多路复用输入/输出型模型的一种。让程序监视多个文件句柄的状态变化的。程序会停在select这里等待,知道监视到的文件句柄有一个或者多个发生了状态变化(从数据无到有)。

编写select服务器步骤:

(1)创建监听套接字socket();

(2)填充本地信息,绑定bind();

(3)监听套接字listen();

(4)监视等待文件句柄是否发生状态改变select()

1)创建所关心时间的文件描述符集fd_set,对于一个描述符,可以关心它上面的read、write、exception事件,所以通常我们要创建三个fd_set,一个用来收集关于读事件,一个用来关心写事件,另外一个用来收集关于异常事件的描述符集合。

2)清空FD_EMPTY()所有位,设置监听套接字相关位FD_SET;每次重置max_fd,这里的最大描述符由select()函数原型的第一个参数,我们知道是最大描述符的下标+1,该文件描述符有意义就把该描述符置为FD_SET()

3)创建一个数组array,用来保存检测到的fd。遍历所有的文件描述符,如果FD_SET()说明该IO已经能够就绪,那么监听到了,进行接收accept,将接收到的文件描述符放在array中,这就监测到了监听套接字,当下次有文件描述符的状态发生改变时,就可以知道了。否则,如果检测到是其他套接字(用来通信,读、写、异常),就将该事件上的信息读取出来。

缺点:

(1)fd_set有上限

(2)每次都要遍历fd_set,当fd集很大时,开销很大

(3)每次调用select时,都把fd_set从用户态拷到内核态,开销大。

二、epoll

epoll与poll本质区别不大,是poll的升级版本,性能更高。原理都是:创建一个关注事件的描述符的集合,然后等待事件的发生,在轮询描述符集合,检查有没有事件的发生,如果有,就进行处理。

步骤:

(1)创建该事件的描述符集合,设置关注事件(读、写、异常)。

(2)调用poll(),等待事件的发生。

(3)轮询文件描述符集,检查事件处理事件。

优点:较之poll,性能提高

无文件描述符上限,而poll有

缺点:当文件描述符过大后,性能会下降
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: