select模型
- 跨平台支持好
- 监视的文件描述符有限(内核限制,1024,fd_set位集合)
- 使用轮询方式判断fd是否就绪
- 消息传递方式:内核需要将消息传递给用户空间,需要内核进行拷贝工作
- 如果fd_set比较大时,会使得用户空间和内核空间在传递该结构时复制开销较大
poll模型
-
没有最大连接数的限制(poll fd数组)
-
消息传递方式:与select没有本质的区别,它是将用户传入的数组拷贝到内核空间
-
也是使用轮询方式判断fd是否就绪
-
水平触发,如果报告的fd没有被处理,那么下次poll还会再次报告
epoll模型
-
没有描述符限制
-
事件驱动模型,为每个fd注册一个监听事件,fd变更为就绪时,将fd添加到就绪链表
-
消息传递方式:epoll通过内核和用户空间共享一块内存来实现的,利用mmap()文件映射内存加速与内核空间的消息传递,内存拷贝
-
epoll支持水平触发和边缘触发,边缘触发只告诉进程哪些fd刚刚变为就绪状态,并且只会通知一次。
-
由于使用事件就绪通知方式,不会随着fd数目的增加导致效率下降(只有活跃可用的fd才会调用)
网友评论