梁越

IO模式详解

0 人看过

参考UNIX网络编程卷1

在unix系统下有5种IO模式,分别为阻塞IO,非阻塞IO,IO多路复用,异步IO。前4种IO都是同步的,只有异步IO是真正的异步

在了解IO模式之前我们先了解下用户态和内核态,为什么需要划分用户态和内核态呢。其实这有点像前后端分离,为了能更好的发挥cpu的性能,让请求需要计算的东西有序的进行计算,内核需要进行协调CPU资源,分配内存资源。所以内核总是在处理当前最关键最重要的程序,而像界面,管理程序这种就划分为用户应用,也就是用户态。中间隔着系统调用,而系统调用就是底层的接口。有个形象的图能描述这三者的关系。

关于这三者更深入的理解在这里

阻塞IO

以套接字数据传送为例,一般的socket默认都是阻塞的,其模式图如下:

这里的recvfrom函数会通过系统调用进入内核,这里函数开始请求后,如果数据准备好,那么内核将数据从内存复制出来,返回函数结果,那么recvfrom函数也结束了。这时候应用进程才继续往下走,在等待期间,进程什么也不干,处于阻塞状态。

非阻塞IO

非阻塞IO就不太一样了,我们看到recvfrom函数在数据没准备好的情况下直接返回了,这里返回的是一个错误码,并没有一直等待,当数据好了然后阻塞去处理数据。这里虽然进程还是在等待结果,不过等待的方式不同了,采用轮询法,不停的去问内核数据有没有,没有我直接走人,就算我每隔1秒去问一次,也是非阻塞的表现。不过这样消耗挺大的,因为从用户态到内核的消耗较大,会占用较多的cpu资源。

IO多路复用

select和poll的功能相似,都是帮助进程去监听数据,现在用epoll函数了,作用都差不多,如果数据来了,再启动进程去接收数据。这样有啥好处呢,好处就是可以监听多个socket,而且不止socket,其他你感兴趣的事件都也可以监听。

关于select和poll和epoll函数的深入解读再这里

异步IO

类似与select和poll功能的,还有信号通知,recvfrom函数请求后直接返回,集成继续干别的事去,等数据来了,再发送一个信号通知进程去处理。这才是真正的异步。