面试中常被问到(13)五种IO模型

Posted AllenSquirrel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到(13)五种IO模型相关的知识,希望对你有一定的参考价值。

阻塞IO:

发起IO调用,若发现IO未就绪(IO条件不具备),则一直等待  也就说条件不满足一直死等

非阻塞IO:

发起IO调用,若发现IO未就绪,则直接报错返回

应用程序通过recvfrom调用不断和内核交互,当条件未达到会直接返回,然后不断轮询,不停去询问内核数据条件是否满足,如果条件满足数据准备好了,则把数据从内核空间拷贝到用户数据空间中。如果条件不满足,数据没有准备好,内核会向应用程序报错,隔断时间应用程序再次调用recvfrom发起请求,间隔的这段时间中,应用程序可以做自己的事

信号驱动IO:

自定义IO信号处理,等待IO就绪,收到信号打断当前操作进行IO

应用程序会预先在内核中注册一个信号处理函数,然后用户进程直接返回,并不阻塞,当内核中条件满足,数据准备好之后就会通过信号处理函数发送一个信号给进程,用户进程便在信号处理函数中把数据从内核空间拷贝到用户空间

发现信号驱动IO相比较于非阻塞IO一遍遍轮询,直接等待数据准备好然后通知进程,进程收到通知后,直接拷贝数据到用户空间。

复用IO:

将多个进程IO注册到同一个管道上,管道和内核交互,当管道中某一进程的IO调用的条件满足,数据准备好,进程则把对应数据拷贝到用户空间

多个进程的IO可以注册到同一个select中,用户调用select,select会监听所有注册好的IO,如果所有被监听的IO需要的数据都没有准备好,select调用进程就会阻塞,如果其中有一个IO所需要的数据准备好了,select调用就会返回,然后进程通过recvfrom进行数据拷贝。

异步IO:

上述三个都是同步操作,都是靠自己完成,而异步是通过其他代替自己完成

用户进程发起IO调用,给内核传递描述符,缓冲区指针或缓冲区大小等,并告诉内核完成操作后如何通知进程,然后用户进程就返回去做自己的事,然后内核开始等待数据准备,数据准备好了以后,直接把数据拷贝到用户空间,然后通知用户进程本次IO完成即可

以上是关于面试中常被问到(13)五种IO模型的主要内容,如果未能解决你的问题,请参考以下文章

介绍下你知道的IO模型?

面试中常被问到的(24)网络分层及协议

五种Linux IO模型+同步异步,阻塞非阻塞,再也不怕头条面试官挂我了

深入底层,Linux五种IO模型全解析

深入底层,Linux五种IO模型全解析

从理解Linux操作系统的网络IO模型来理解NettyRedis...