接续上一节内容(通俗易懂)阻塞、非阻塞、同步、异步区别-CSDN博客,非常接地气地解释了阻塞、非阻塞、同步、异步的内容。由于内容深度具有延续性,建议看本节内容之前,先过一遍上一节内容噢~
由于最近忙于项目,拖了好久才续更这一节内容。本节,我们更深入地探讨一下Unix/Linux上的五种IO模型。
1、阻塞 blocking
这是最传统的 I/O 模型。在这种模型中,应用程序在发出 I/O 请求时会被挂起(阻塞),直到数据准备就绪并且操作完成。在此过程中,应用程序无法执行其他任何操作。如果单看这段文字不能够理解,可以看看上一节(通俗易懂)阻塞、非阻塞、同步、异步区别-CSDN博客内容。
2、非阻塞 non-blocking(NIO)
在非阻塞模型中,如果数据未准备好,I/O 操作会立即返回一个错误,而不是阻塞调用线程。这要求应用程序定期检查数据是否已经准备就绪,通常这是通过轮询完成的。这种方式可以让应用程序在等待 I/O 操作完成时执行其他任务。
3、IO复用(IO multiplexing)
I/O 复用允许应用程序同时等待多个 I/O 操作。它使用 select或 poll 或 epoll 这类系统调用,让单个进程可以监视多个文件描述符,一旦某个文件描述符就绪(例如,读操作可以不受阻塞地进行),相应的操作可以立即执行。这种模型特别适用于处理多个并发连接,而无需为每个连接使用多线程或多进程,从而减少资源消耗。我在I/O多路复用(I/O多路转接)-CSDN博客这节详细地介绍了IO复用的内容。
4、信号驱动(signal-driven)
在这种模型中,应用程序首先告诉内核在给定的文件描述符上启动一个异步操作,并让内核在数据准备就绪时发送一个信号。这时,应用程序可以继续执行其他任务,直到收到该信号,然后进行实际的 I/O 操作。这种方式减少了应用程序的 CPU 占用,因为它不需要不断检查 I/O 是否准备就绪。要注意这里的内核在第一个阶段是异步,在第二个阶段是同步!
5、异步(asynchronous)
异步 I/O 模型是最高级的 I/O 处理方式。应用程序发出 I/O 操作请求后会立即返回,继续执行其他任务。与信号驱动 I/O 不同,应用程序不需要等待信号告知数据准备就绪,内核会在整个 I/O 操作(包括数据传输)完成后通知应用程序。这样,应用程序可以不被阻塞地继续执行,直到 I/O 请求完全处理完成。对于同步和异步有不理解的,还是建议看看上一节内容噢~
标签:异步,模型,阻塞,应用程序,Unix,IO,Linux,操作 From: https://blog.csdn.net/weixin_45634782/article/details/137358653