让你一看就懂的Linux - I/O模型详细解释

2025-04-09

同步():调用者等待被调用者返回消息,才能继续执行。同步阻塞例子:去餐馆吃饭,点了一个盖浇饭,然后在餐桌上一直等到盖浇饭做好,自己端到餐桌就餐。这就是典型的同步阻塞。当厨师给你做饭的时候,你需要一直在那里等着。

同步非阻塞例子:去餐馆吃饭,点了一个盖浇饭,你点完饭之后,过了几分钟感觉时间差不多了,就去问老板饭做好了没有,如果好了就去端,如果没好等一会再去问,实时同步做饭进度,依次循环去问直到饭做好,这就是同步非阻塞。 异步():被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态。

I/O模型类型

IO模型分为以下五类

1.阻塞型:所有过程全阻塞2.非阻塞型:如果没有数据,则立即返回.I/O复用型(和poll):在wait和copy阶段分别阻塞4.信号驱动型I/O(SIGIO):在wait阶段不阻塞,但copy阶段阻塞(信号驱动I/O),即通知5.异步I/O(AIO):完全无阻塞方式,当I/O完成时提供信号

阻塞I/O

应用内核是什么_内核通知应用程序_内核应用通知程序在哪

说明:应用程序调用一个IO的函数,会导致应用程序阻塞,进入阻塞状态后直到I/O操作结束才会返回;如果系统内核数据没有准备好,那就一直等待数据准备,因为是调用了函数导致了应用程序阻塞,所以一直在等,做不了任何事情,内核数据准备好之后把数据从内核拷贝到用户空间,拷贝结束后,I/O函数返回成功指示。注:其阻塞时在I/O操作阶段

非阻塞I/O

内核通知应用程序_应用内核是什么_内核应用通知程序在哪

说明:用户线程发起IO请求时立即返回。但并未读取到任何数据,则返回字段为“”,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即“轮询”机制。整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据。仍需要不断地轮询、重复请求、消耗了大量的CPU资源;是比较浪费CPU的方式,一般很少用这种模型,而是在其他模型中使用非阻塞IO这一特性。

I/O复用(和poll)

应用内核是什么_内核通知应用程序_内核应用通知程序在哪

说明:I/O复用模型会用到或poll函数,在I/O复用模型中,并不是阻塞到I/O操作过程中,而是阻塞到或者poll函数中;以为例:进程在处阻塞,等待几个描述符中的一个变为可操作,如果没等待到就继续阻塞在第一阶段,如果等到了一个描述符变为了可操作,则调用函数将数据拷贝到应用缓冲区。

信号驱动I/O(SIGIO)

内核应用通知程序在哪_内核通知应用程序_应用内核是什么

内核应用通知程序在哪_应用内核是什么_内核通知应用程序

说明:首先,我们允许套接口进行信号驱动I/O,并安装一个信号处理函数SIGIO,如果数据没有准备好,则立即返回结果,进程继续工作并不阻塞。当数据准备好时,系统内核会主动发送一个SIGIO信号给应用程序,应用程序收到信号后,可以在信号处理函数中调用I/O操作函数进行数据处理。信号驱动I/O模型的优点是当数据报到达时,可以不阻塞,主循环可以继续执行,只是等待处理程序的通知,或者数据已经准备好被处理,或者数据报已经准备好被读了。

异步I/O(AIO)

应用内核是什么_内核应用通知程序在哪_内核通知应用程序

说明:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态通知和回调通知来告诉调用者的输入输出操作。用户可以直接对I/O执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成之后内核通知应用程序的方式,就是上面讲的通过状态通知或者回调通知来告诉调用者。异步I/O的读写操作总是立即返回,但没有返回结果说是否阻塞,因为异步I/O操作真正的读写操作已由内核接管,内核自己对数据处理完成后生成一个信号,然后通知用户刚才交给自己的事件已经处理完成。

五种I/O模型的总结及比较

中文图示如下:

内核通知应用程序_应用内核是什么_内核应用通知程序在哪

英文图示如下:

内核通知应用程序_应用内核是什么_内核应用通知程序在哪

从两张图中我们可以看到,越往后,阻塞越少,理论上效率也是最优。其中五种I/O模型中,前三种属于同步I/O,后两者属于异步I/O。

同步I/O

阻塞I/O 非阻塞I/O I/O复用(和poll)

异步I/O

信号驱动I/O(SIGIO) 半异步 异步I/O(AIO) 全异步

异步I/O和信号驱动I/O的区别

信号驱动I/O模式下,内核可以复制的时候通知给我们应用程序发送SIGIO信号。异步I/O模式下,内核在所有的操作由内核操作完成后才会通知我们的应用程序。

下一篇:没有了
上一篇:应用程序发生异常,电脑出现未知的软件异常怎么办?-老毛桃winpe u盘
相关文章
返回顶部小火箭