IO模型介绍

阻塞IO

门口做着瞅(阻塞)——-(一直到)来了老弟—-办事
调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停地去检查这个函数有没有反回,必须等这个函数返回才能进行下一步动作。
image.png

非阻塞IO

瞅一下—瞅一下-…——————来了老弟——-办事

非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。非阻塞I/O执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1;此时可以根据errrno区分这两种情况,对于accept 、recv、和send,时间未发生时,errno通常被设置成eagain。
image.png

信号驱动IO

放个门铃 —- 来了老弟———门铃响了我听到了——办事

Linux 用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO时间就绪,进程收到SIGIO信号。然后处理IO时间
image.png

IO复用

可以理解为 老鸨雇了个秘书,你要啥服务跟我秘书说,你俩唠完了再进来办事
LInux用select /poll函数实现IO复用模型,这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检测。知道有数据可读或可写时,才真正调用IO操作函数

异步IO

就是我在这开了个流水线服务,你要啥服务跟老鸨写个条,就等着就行了。然后等哪个师傅空了,老鸨把条给他。
这里的异步与线程中的异步不同。**异步IO主要表现的是由内核完成IO之后,告知对应需求程序。
Linux中,可以调用aio_read函数高速内描述字缓冲区指针和缓冲区的大小、文件编译及通知的方式,然后立即返回,当内核将数据拷贝
数据缓冲区后,在通知应用程序
到。image.png

IO多路复用

客户端连接进来,我肯定要判断你有没有给我发送信息。那么我不能在这阻塞等你。我阻塞了我怎么去再次调用accept。
所以我可肯定是我服务端只去负责连接,然后给到一个中间层帮我看着,是否能CLient有东西发过来,如果法,在通知服务端
那么我们再想,listenfd,能不能被监控,就是说我也不傻傻的accept搁这等你了,我监控listenfd,有链接来。我直接accept,当场,啪一下我就返回了,很快啊。我Server就在这等你给我发通知就行了,你发lfd的通知 我就accept,你发数据到达的通知,我就读呗。

于是这样的思想,就诞生了 select,poll,epoll
[

](https://blog.csdn.net/qq_38872537/article/details/112981276)