C++网络编程之I/O多路复用、IO模型

本文详细介绍了C++网络编程中的I/O多路复用,包括select、poll和epoll模型。分析了select的缺点,如文件描述符数量限制。对比了poll与select的相似性和不同点。阐述了epoll模型的改进,如避免了轮询和拷贝问题。讨论了水平触发和边缘触发两种模式的特点及应用场景。最后,总结了阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO五种IO模型的工作原理。
摘要由CSDN通过智能技术生成

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返回后,也需要遍历整个描述符的数组才能得到有事件的描述符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值