【网络编程系列】IO多路复用
博客目录
什么是 IO 多路复用?
IO多路复用:一种同步的 IO 模型。利用 IO 多路复用模型可以实现一个线程监视多个文件句柄,一旦某个文件句柄就绪,就能够通知到对应应用程序进行相应的读写操作;没有文件句柄就绪时就会阻塞应用程序,从而释放出 CPU 资源
IO:在操作系统中,数据在内核态和用户态之间的读写操作
多路:大部分情况下是指多个 TCP 连接(多个 或者多个 )
复用:一个或多个线程资源
IO多路复用:一个或多个线程处理多个 TCP 连接。无需创建和维护过多的进程/线程
实现 IO 多路复用的模型有三种:
89efb25035d1c40d1a91d20d36fd2817
模型?
采用轮训加遍历的方式,在客户端操作服务器时,会创建三种文件描述符,简称 FD
分别是写描述符,读描述符,异常描述符. 会阻塞和监视这三种文件描述符.等到有数据可读,可写,或者出异常,或者超时的时候,都会返回.返回后通过遍历 fdset(文件描述符集合),来找到就绪的 fd,然后去触发相应的 IO 操作.
优点:跨平台支持性好,几乎在所有的平台上支持
缺点:随着 FD 数量增多而导致性能下降。而操作系统对单个进程打开的 FD 数量是有限制的,一般默认是 1024 个
poll 模型?
采用轮训加遍历的方式,poll 模式使用链表的方式来存储 fd,优点是没有最大的 fd 的数量限制.缺点和 一样,采用轮训的方式来进行全盘扫描,随着 fd 数量的增加,导致性能下降
epoll 模型?
epoll 模型解决了 和 poll 因为吞吐量的增加而性能下降的问题.采用时间通知机制来触发 IO 操作.它没有 fd 个数的限制,而且从用户态拷贝到内核态只需要一次,因为它主要是通过调用系统底层的函数,来实现注册,激活 fd,这样大大提高了执行性能.主要是以下三个系统函数:
优点:将轮询改成了回调,大大提高了 CPU 执行效率,也不会随 FD 数量的增加而导致效率下降
缺点:只能在 Linux 下工作
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!
如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!
Stay Stay 道阻且长,行则将至,让我们一起加油吧!