阻塞和非阻塞网络IO

发布时间:2024年01月15日

网络 I/O 模型是指在进行网络通信时,应用程序与操作系统之间进行数据传输的方式和模式。

常见的网络 I/O 模型:

  1. 阻塞 I/O(Blocking I/O):在阻塞 I/O 模型中,当应用程序发起一个 I/O 操作(如读取或写入数据),它会一直阻塞等待,直到操作完成。在此期间,应用程序无法执行其他任务。这种模型通常简单易用,性能很一般。

  2. 非阻塞 I/O(Non-blocking I/O):非阻塞 I/O 模型中,应用程序发起一个 I/O 操作后,会立即返回,而不会等待操作完成。应用程序可以继续执行其他任务,然后通过轮询或事件通知等方式来检查操作是否完成。需要应用程序不断地主动查询 I/O 状态,会导致 CPU 资源的浪费。

  3. 多路复用 I/O(Multiplexing I/O): 多路复用 I/O 模型使用操作系统提供的多路复用机制(如 select、poll 或 epoll)来同时监听多个 I/O 事件。应用程序将多个 I/O 操作注册到多路复用器上,然后通过阻塞等待多路复用器通知哪些 I/O 事件已经就绪。这种模型可以有效地处理多个连接,减少了轮询的开销。中间件如mysql、redis、es都是用的这种网络IO模型

  4. 信号驱动 I/O(Signal-driven I/O):信号驱动 I/O 模型使用操作系统提供的信号机制来通知应用程序 I/O 事件的就绪状态。应用程序通过注册信号处理函数来处理相应的事件。与多路复用 I/O 类似,信号驱动 I/O 也可以处理多个连接,但需要额外的信号处理逻辑。

  5. 异步 I/O(Asynchronous I/O):异步 I/O 模型中,应用程序发起一个 I/O 操作后,不需要等待操作完成,而是继续执行其他任务。当操作完成时,操作系统会通知应用程序,然后应用程序可以处理已完成的操作结果。这种模型通常需要操作系统提供对异步 I/O 的支持,且编程模型相对复杂。通常消息队列使用的是异步IO,如MQ、kafka等

不同的网络 I/O 模型适用于不同的应用场景和需求。选择合适的网络 I/O 模型可以提高系统的性能和可扩展性。具体选择哪种模型取决于应用程序的特性、并发连接数量、数据传输速度以及操作系统和编程语言的支持。

为什么 IO 多路复用要搭配非阻塞 IO?

阻塞IO的处理方式:每次只能调用一次read 或 accept,多路复用只会告诉程序fd对应的socket可读,但是不会说有多少数据可读,所以handle_read / handle_accept只能调用一次,无法直到下次accept/read会不会发生阻塞,要等ioloop的第二次循环。
非阻塞IO的处理方式:循环的read 或 accept,直到读取完全部的数据,直到抛出EWOULDBLOCK异常。

文章来源:https://blog.csdn.net/qq_42476938/article/details/135553796
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。