网站服务是什么,企业网盘哪个最好用,wordpress建多语言分站,网页版微信二维码怎么弄http://blog.sina.com.cn/s/blog_8fa7dd41010153zx.html select#xff0c;poll#xff0c;epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是#xff1a; 1 单个进程可监视的fd数量被限制 2 需要维护一个用…http://blog.sina.com.cn/s/blog_8fa7dd41010153zx.html selectpollepoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是 1 单个进程可监视的fd数量被限制 2 需要维护一个用来存放大量fd的数据结构这样会使得用户空间和内核空间在传递该结构时复制开销大 3 对socket进行扫描时是线性扫描 poll poll本质上和select没有区别它将用户传入的数组拷贝到内核空间然后查询每个fd对应的设备状态如果设备就绪则在设备等待队列中加入一项并继续遍历如果遍历完所有fd后没有发现就绪设备则挂起当前进程直到设备就绪或者主动超时被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。 它没有最大连接数的限制原因是它是基于链表来存储的但是同样有一个缺点 大量的fd的数组被整体复制于用户态和内核地址空间之间而不管这样的复制是不是有意义。 poll还有一个特点是“水平触发”如果报告了fd后没有被处理那么下次poll时会再次报告该fd。 epoll epoll支持水平触发和边缘触发最大的特点在于边缘触发它只告诉进程哪些fd刚刚变为就需态并且只会通知一次。 在前面说到的复制问题上epoll使用mmap减少复制开销。 还有一个特点是epoll使用“事件”的就绪通知方式通过epoll_ctl注册fd一旦该fd就绪内核就会采用类似callback的回调机制来激活该fdepoll_wait便可以收到通知 1 支持一个进程所能打开的最大连接数 select 单个进程所能打开的最大连接数有FD_SETSIZE宏定义其大小是32个整数的大小在32位的机器上大小就是32*32同理64位机器上FD_SETSIZE为32*64当然我们可以对进行修改然后重新编译内核但是性能可能会受到影响这需要进一步的测试。 poll poll本质上和select没有区别但是它没有最大连接数的限制原因是它是基于链表来存储的 epoll 虽然连接数有上限但是很大1G内存的机器上可以打开10万左右的连接2G内存的机器可以打开20万左右的连接 2 FD剧增后带来的IO效率问题 select 因为每次调用时都会对连接进行线性遍历所以随着FD的增加会造成遍历速度慢的“线性下降性能问题”。 poll 同上 epoll 因为epoll内核中实现是根据每个fd上的callback函数来实现的只有活跃的socket才会主动调用callback所以在活跃socket较少的情况下使用epoll没有前面两者的线性下降的性能问题但是所有socket都很活跃的情况下可能会有性能问题。 3 消息传递方式 select 内核需要将消息传递到用户空间都需要内核拷贝动作 poll 同上 epoll epoll通过内核和用户空间共享一块内存来实现的。 综上在选择selectpollepoll时要根据具体的使用场合以及这三种方式的自身特点。表面上看epoll的性能最好但是在连接数少并且连接都十分活跃的情况下select和poll的性能可能比epoll好毕竟epoll的通知机制需要很多函数回调