同步io异步io非阻塞io区别(同步异步阻塞非阻塞及五种io)
导语:IO - 同步、异步、阻塞、非阻塞
一般情况下,一次网络IO读操作会涉及两个系统对象:(1) 用户进程(线程)Process;(2)内核对象kernel,两个处理阶段:
[1] Waiting for the data to be ready - 等待数据准备好
[2] Copying the data from the kernel to the process - 将数据从内核空间的buffer拷贝到用户空间进程的buffer
1 同步阻塞IO
用户进程process在Blocking IO读recvfrom操作的两个阶段都是等待的。在数据没准备好时,process原地等待kernel准备数据。kernel准备好数据后,process继续等待kernel将数据copy到自己的buffer。在kernel完成数据的copy后process才会从recvfrom系统调用中返回
2 同步非阻塞IO
process在NonBlocking IO读recvfrom操作的第一个阶段是不会block等待的,如果kernel数据还没准备好,那么recvfrom会立刻返回一个EWOULDBLOCK错误。当kernel准备好数据后,进入处理的第二阶段的时候,process会等待kernel将数据copy到自己的buffer,在kernel完成数据的copy后process才会从recvfrom系统调用中返回
3 同步IO之多路复用
IO多路复用,就是熟知的select、poll、epoll模型。从图上可见,在IO多路复用的时候,process在两个处理阶段都是block等待。初看好像IO多路复用没什么用,其实select、poll、epoll的优势在于可以以较少的代价来同时监听处理多个IO
4 异步IO
异步IO要求process在recvfrom操作的两个处理阶段上都不能等待,也就是process调用recvfrom后立刻返回,kernel自行去准备好数据并将数据从kernel的buffer中copy到process的buffer在通知process读操作完成,然后process在去处理。遗憾的是,linux的网络IO中是不存在异步IO的,linux的网络IO处理的第二阶段总是阻塞等待数据copy完成的。真正意义上的网络异步IO是Windows下的IOCP(IO完成端口)模型
同步与异步,关注的是消息通信机制(或应答模式),是对响应本身而言
阻塞与非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态,是对请求本身而言
本文内容由小姬整理编辑!