io
cpu的执行速度比io设备的写入速度快多了 所以如果在等待数据的过程中一直让cpu陷入等待 将极大影响cpu的效率
io设备(网卡 硬盘设备)写入主存(内存)不通过cpu 而是通过DMA方式 与存储器直接存取
比如客户端向服务器发送数据 系统内核(linux)负责向io设备(如网卡 硬盘 等等)写入数据 用户线程申请读取数据
阻塞Io
系统内核没准备好数据(比如客户端向服务器发送数据 此时服务器io设备还没有写入完到主存) 用户线程一直被阻塞(cpu线程一直等待)
非阻塞io
系统内核没准备好数据 直接返回error 用户线程继续轮询 直到准备好
这个时候线程不是阻塞的还可以去做其它的事 准备好之后用户线程还需要自己拷贝到用户空间
(cpu线程不等待 而是轮询看他有没有准备好 准备好了再拷贝到用户空间操作)
异步io
系统准备好数据 复制到用户空间 然后通知用户线程 (直接准备好数据并拷贝到用户空间然后通知cpu线程)
多路复用IO
用户线程调用select后进行系统调用(内核会监视所有select负责的socket),此时用户线程被阻塞
当内核将数据准备好后就会返回,并通知用户线程进行读取操作,此时内核将数据拷贝到用户空间并返回 所有的io 请求会注册到select上
以下统称调用方为a 被调用方为b
同步阻塞相对于是b 就是说 a调用b b没有结果响应 a就阻塞了起来 直到有结果响应
同步非阻塞 就是 a调用b b如果现在还没有结果 先响应a一个没有结果的通知 a随后轮询b看有没有结果
异步就是a调用b b先响应一个ok 然后如果有结果通知随后再回调响应a
参考资料:
图解5种IO模型_琦彦的博客-CSDN博客_io模型有哪几种