Linux:select、pool、epoll多路IO复用

select、pool、epoll多路IO复用

https://blog.csdn.net/wteruiycbqqvwt/article/details/90299610

https://blog.csdn.net/nanxiaotao/article/details/90612404 

 

select和poll本质相同, 都是将socket放在一个集合中, 每次调用select和poll函数, 都会将socket集合拷贝到内核中, 挂载一次, 不断轮询查看

1. select受到单个进程能够监听的socket限制, 32位是1024, 64位是2048

2. poll采用的是链表, 不受限制

3. select和poll将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

 

epoll

1. 没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口)
2. 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数, 即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll

3. 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销(在从内核向用户空间传递时)

4. epoll监听使用的是红黑树, 可能会增大开销, 用户空间向内核空间添加新结点只需要拷贝一个结点大小就可以了

5. 监听性能提升, 但是处理性能没有

 

使用

select和poll用在链接数量少并且活跃数量多的情况

 

posted @ 2020-08-16 17:02  x_Aaron  阅读(253)  评论(0)    收藏  举报