五种IO模型详解( 四 )
select/poll的性能问题
select()/poll()的性能会随着监控的文件描述符数量增多而快速下降 。 其原因是多方面的 。
其中一个原因是它们所监控的文件描述符会以某种数据结构全部传送给内核 , 让内核负责监控这些文件描述符 , 当内核发现某个文件描述符已经就绪时 , 会修改数据结构 , 然后将修改后的数据结构传回给进程 。 所以涉及了两次数据传输的过程 。
对于select()来说 , 每次传递的数据结构的大小是固定的 , 都是1024个描述符的大小 。 对于poll()来说 , 只会传递被监控的文件描述符 , 所以文件描述符少的时候 , poll()的性能是可以的 , 此外poll()可以超出1024个文件描述符的监控数量限制 , 但随着描述符数量的增多 , 来回传递的数据量也是非常大的 。
基于这方面的性能考虑 , 更建议使用信号驱动IO或epoll模型 , 它们都是直接告诉内核要监控哪些文件描述符 , 内核会以合适的数据结构安排这些待监控的文件描述符(如epoll , 内核采用红黑树的方式) , 换句话说 , 它们不会传递一大片的文件描述符数据结构 , 效率更高 。
使用IO复用还有很多细节 , 本文在此仅只是对其作最基本的功能性描述 , 在本文末还会多做一些扩展 , 至于更多的内容需自行了解 。
2.4 Signal-driven I/O模型即信号驱动IO模型 。 当文件描述符上设置了O_ASYNC标记时 , 就表示该文件描述符是信号驱动的IO 。
注:可能你觉得O_ASYNC应该表示的是异步IO , 但并非如此 。
在历史上 , 信号驱动IO也称为异步IO , 比如这个标记就暗含了这一点历史 。
如今常说的术语【异步】 , 是由POSIX AIO规范所提供的功能 , 这个异步表示某进程发起IO操作时 , 立即返回 , 当IO完成或有错误时 , 该进程会收到通知 , 于是该进程可以去处理这个通知 , 比如执行回调函数 。
当某个文件描述符使用信号驱动IO模型时 , 要求进程配置信号SIGIO的信号处理程序 , 然后进程就可以做其他任何事情 。 当该文件描述符就绪时 , 内核会向该进程发送SIGIO信号 。 该进程收到SIGIO信号后 , 就会去执行已经配置号的信号处理程序 。
通常来说 , SIGIO的信号处理程序中会编写read()类的读取代码 , 这表示在收到SIGIO时在信号处理程序中执行read操作 , 另一种常见的作法是在SIGIO的信号处理程序中设置某变量标记 , 然后在外部判断该标记是否为true , 如果标记为true , 则执行read类的操作 。
使用Shell伪代码如下:
# 第一种模式:在信号处理程序中执行IO操作 trap 'read...' SIGIO# 设置SIGIO的信号处理程序 # 然后就可以执行其它任意任务 # 当在执行其它任务过程中 , 内核发送了SIGIO , 进程会 # 立即去执行SIGIO信号处理程序 ...other codes... ? # 第二种模式:在信号处理程序中设置变量标记 , 在外部执行IO操作 trap 'a=1' SIGIO ... other codes... #while [ $a -eq 1 ];doread... done很明显 , 使用信号驱动IO模型时 , 进程对该描述符的读取是被动的 , 进程不会主动在描述符就绪前执行读取操作 。
其实信号驱动IO模型就像是小姐姐在闲逛 , 小姐姐本没有想过要买什么东西 , 但如果发现有合适的 , 也会去买下来 , 在逛了一段时间后 , 一件超短裙闪现到小姐姐的视线 , 小姐姐很喜欢这个款式 , 于是立即决定买下来 。
这里可以做出大胆的推测 , 并非所有文件描述符类型都能使用信号驱动的IO模型 。 如果某文件描述符想要开启信号驱动IO , 要求有某个另一端会主动向该描述符发送数据 , 比如管道、套接字、终端等都符合这种要求 。 显然 , 普通文件系统上的文件IO是无法使用信号驱动IO的 。
回到信号驱动IO模型 , 由于进程没有主动执行IO操作 , 所以不会阻塞 , 当数据就绪后 , 进程收到内核发送的SIGIO信号 , 进程会去执行SIGIO的信号处理程序 , 当进程执行read()时 , 由于数据已经就绪 , 所以可以直接将数据从kernel buffer复制到app buffer , read()过程中 , 进程将被阻塞 。
推荐阅读
- Satechi推出Dock5多设备充电站 一次可同时充五种设备
- 极速鲨课堂85:显卡怎么测试 3DMARK详解
- Google AI建立了一个能够分析烘焙食谱的机器学习模型
- 性能翻倍!飞腾首款8核桌面处理器腾锐D2000详解
- OpenAI推DALL-E模型:能根据文字描述生成图片
- 详解工程师不可不会的LRU缓存淘汰算法
- 网速再翻倍,官方详解小米 11 搭载的 WiFi 6 增强版技术
- 谷歌搜索的灵魂!BERT模型的崛起与荣耀
- 苹果指南详解如果隐私受到威胁,如何锁定iPhone
- 一次模型训练相当70万公里排放量?深度学习耗能超乎你想象
