五种IO模型详解( 七 )


但是 , 内核发送SIGIO信号只是通知进程数据已经就绪 , 但就绪了多少数据量 , 进程并不知道 。
而且 , 进程因为收到通知而认为可以数据已就绪 , 于是执行read() , 进程在执行read()的时候 , CPU将从用户态切换到内核态 , 由内核获取CPU来执行数据同步操作 , 所以在这个阶段中 , 进程的read()是被阻塞的 。
因为信号驱动要求有另一端主动写入数据 , 所以socket、pipe、fifo、terminal等文件描述符类型是可以信号驱动IO 的 , 但是不支持对普通文件使用信号驱动IO 。
3.select()、poll()和epoll
前面说了 , 这三个函数是文件描述符状态监控的函数 , 它们可以监控一系列文件的一系列事件 , 当出现满足条件的事件后 , 就认为是就绪或者错误 。 事件大致分为3类:可读事件、可写事件和异常事件 。 它们通常都放在循环结构中进行循环监控 。
select()和poll()函数处理方式的本质类似 , 只不过poll()稍微先进一点 , 而epoll处理方式就比这两个函数先进多了 。 当然 , 就算是先进分子 , 在某些情况下性能也不一定就比老家伙们强 。
select()--tt-darkmode-color: #707070;">备注:
这篇文章摘抄来自网络 。 我打算总结一些列架构师需要的优秀文章 , 由于自己写会花太多时间 , 我决定做一个搬运工 , 为大家筛选优秀的文章 , 最后我会做成索引方便大家查找 。


推荐阅读