目录
二. 生活的角度理解select poll epoll三种IO多路复用技术的工作模式.
前言.
- 小杰之前分析过的几种常见IO模型,以及给出了小杰对于IO多路复用技术的浅显理解. (上篇撸了很多代码,有着select poll epoll分别的服务端代码实现,感兴趣的可以阅读哈)
一. 谈信号驱动IO (对比异步IO来看)
-
信号驱动IO 对比 异步 IO进行理解

- 信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作
- 通知应用程序处理IO, 是开始处理IO, 这个时候还是存在阻塞的,将数据从内核态拷贝进入到用户态的过程至少是阻塞住的 (应用程序将数据从内核态拷贝到用户态的过程是阻塞等待的, 和异步IO的区别) (此处是区分信号驱动IO和异步IO的关键所在)
- 信号驱动IO, 我们提前在信号集合中设置好IO信号等待, 注册好对应的IO处理函数 handler,IO数据准备就绪后,会递交SIGIO信号,通知应用程序中断然后开始进行对应的IO处理逻辑. 但是通知处理IO的时候存在将数据从 内核空间拷贝到用户空间的过程,(而异步IO是数据拷贝完成之后内核再通知应用程序直接开始处理, 应用程序直接处理,不需要拷贝数据阻塞等待)

- 异步IO: 由内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)
- 真正的做到了完完全全的非阻塞,发起aio_read之后应用程序立即可以去做其他的事情了. 调用了aio_read之后会立即进行返回继续向下执行应用程序,由kernel内核进行等待数据准备,只有当数据准备好了且拷贝到来用户空间,一切完成后,kernel给应用程序发送一个signal,告知它read完成了, 没有任何的阻塞,你直接处理就是
- 异步IO由于它不会对用户进程,应用程序产生任何的阻塞,所以他对于高并发网络服务器的实现至关紧要.
小结:
- 任何IO操作都是存在 等待数据准备完成 和 将 数据从内核态拷贝到用户态两个过程的
- 两个过程中等待数据消耗的时间一般远超于拷贝数据所花费的时间,所以一般我们进行IO的优化,都是想办法尽量降低等待时间
- 所以信号驱动IO 因为是通知开始处理数据,应用程序需要将数据从内核拷贝进入到用户态 (数据拷贝阻塞等待) 和异步IO的区别
- 异步IO 是完全不存在应用程序的阻塞等待,平时应用程序干自己的事情,当数据完全准备好了 (数据 完成了拷贝 ),直接通知应用程序回调处理数据
- 所以我们之前介绍的 blocking io non-blocking io io multiplexing (IO多路复用) 本质上都是属于 synchronous IO (同步IO) 都是存在有阻塞的,有人说不对吧: 哪 non-blocking IO 呢? 非阻塞IO仅仅只是在数据准备阶段上来说是非阻塞的,数据没准备好立马返回,可是数据拷贝阶段还是阻塞住的,所以本质还是同步IO. (大大的狡猾,忘记了阻塞除了准备数据的时候存在,拷贝数据也是阻塞住的)
- 只有异步IO asynchronous 是完全做到了整个过程非阻塞的 , 当进程发起IO操作之后,就直接返回再也不必理睬,直kernel 发送一个信号,告诉进程说IO完成(涵盖数据拷贝完成), 在这个过程中,是完全避免了阻塞进程了的

本文详细探讨了信号驱动IO与异步IO的工作原理,通过生活实例解读select/poll/poll的工作模式,并重点讲解了epoll的边缘触发(Et)和水平触发(Lt)机制。通过实例展示了ET在处理小块数据的优势。最后总结了IO多路复用在高并发服务器中的应用和epoll在技术选型中的重要性。
https://blog.youkuaiyun.com/weixin_53695360/article/details/123311049?spm=1001.2014.3001.5501
最低0.47元/天 解锁文章
9230





