文章目录
1.I/O多路复用之select模型
1.1 select模型服务端的流程
1.2 bitmap位图
_FD_SETSIZE
可以重新定义它的值的大小,但是实际应用开发不推荐这样使用,因为如果有更多socket的时候可以选择poll模型或者epoll模型。
1.3 select水平触发
- select采用水平触发的方式,如果报告fd后事件没有被处理或者数据没有被完全读取,那么下次select时会再次报告该id,也就是说select不会丢失事件和数据。
1.4 select的缺点
- select支持的文件描述符数量太小,默认是1024。虽然可以调整,但是描述符数量越大,效率就会更低,因此调整的意义不大。
- 每次调用select,都需要把fdset从用户态拷贝到内核态。
- 同时在线的大量客户端有事件发生的可能性太小,但是还是需要遍历fdset。因此随着监视的描述符数量增长,其效率也会线性降低。
2.I/O多路复用之poll模型
2.1 poll模型与select模型比较
- poll和select在本质上没有差别,管理多个描述符也是进行轮询。根据描述符的状态进行处理,但是poll模型没有最大文件描述符数量的限制。
- select的fdset采用bitmap,poll采用数组。
- poll和select同样存在一个缺点,文件描述符的数组被整体复制与用户态和内核态的地址空间之间,而不论这些文件描述符是否有事件,它的开销随着文件描述符数量的增长而线性增大。还有poll返回后,也需要遍历整个描述符的数组才能得到有事件的描述符。