Reactor为什么必须使用非阻塞io?

简介: Reactor为什么必须使用非阻塞io?

概述:

本文解释为什么reactor模型必须使用非阻塞套接字文件描述符

注:

本文所说的阻塞和非阻塞io指的是使用非阻塞/阻塞属性的套接字文件描述符进行io操作

主题:

为什么reactor模型要使用非阻塞io操作呢,阻塞的io不行吗?

阻塞io会阻塞在io未就绪的阶段,非阻塞io虽然不会阻塞在io未就绪阶段,但是他们都会阻塞在io就绪后,内核将数据copy进用户缓冲区的这一阶段,所以非阻塞io并不是绝对的全程非阻塞

所以select/poll/epoll通知调用者io就绪后,send/recv这些处理io的函数使用阻塞和非阻塞都是一样的效果,所以两者都可以?

答案

表面上是的,但这只是理想的结果,如果使用阻塞io,遇到select/poll/epoll非预期行为时会造成阻塞:

1.检测就绪io出现问题。select/poll/epoll这些系统调用被信号打断或未检测到就绪io返回-1,这时如果调用阻塞的send/recv就会将线程阻塞,不过一般通过判断返回值可以避免这种情况

2.多线程问题。如果多个线程的epoll/select/poll检测同一个fd(文件描述符),且此时只有一个连接请求或就绪io,只有一个线程能进行io操作,而其他线程会被阻塞挂起

3.select有误报读错误bug。select函数本身有一个bug,通过man 2 select命令可以查到。bug是select会将没有发生的事件误报为可读事件,从而引起recv阻塞线程

而使用非阻塞io就不会出现任何以上的情况

目录
相关文章
|
6月前
|
Linux C++
|
5月前
|
Java Unix Linux
什么是阻塞IO和非阻塞IO
什么是阻塞IO和非阻塞IO
123 3
|
4月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
188 1
|
6月前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
77 2
|
6月前
|
存储 监控 Java
Java nio非阻塞io
Java nio非阻塞io
|
6月前
|
分布式计算 JavaScript Java
非阻塞IO:提高应用程序的效率与性能
非阻塞IO:提高应用程序的效率与性能
|
12月前
阻塞IO、非阻塞IO和IO复用有啥区别?
阻塞IO、非阻塞IO和IO复用有啥区别?
119 1
|
Java Unix Linux
深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用
I/O(Input/Output)模型是计算机科学中的一个关键概念,它涉及到如何进行输入和输出操作,而这在计算机应用中是不可或缺的一部分。在不同的应用场景下,选择正确的I/O模型是至关重要的,因为它会影响到应用程序的性能和响应性。本文将深入探讨四种主要I/O模型:阻塞,非阻塞,多路复用,signal driven I/O,异步IO,以及它们的应用。
深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用
|
算法 Linux C语言
Linux驱动IO篇——阻塞/非阻塞IO
Linux驱动IO篇——阻塞/非阻塞IO
|
缓存 PHP
PHP实现IO非阻塞模型(no-blocking)
非阻塞IO发出read请求后发现数据没准备好,会继续往下执行,此时应用程序会不断轮询polling内核询问数据是否准备好,当数据没有准备好时,内核立即返回EWOULDBLOCK错误。直到数据被拷贝到应用程序缓冲区,read请求才获取到结果。并且你要注意!这里最后一次 read 调用获取数据的过程,是一个同步的过程,是需要等待的过程。这里的同步指的是**内核态的数据拷贝到用户程序的缓存区这个过程**。
152 0