数据|今天来图解IO模型——BIO、NIO、AIO

数据|今天来图解IO模型——BIO、NIO、AIO
文章图片

文章图片

作者|JerrysCode|简书操作系统分为用户空间和内核空间 , 出于安全考虑 , 应用程序无法直接操作内核空间的数据 。当应用程序发起I/O操作时 , 需要经过等待数据和拷贝数据两步 , 这两步的处理方式不同 , 就会产生不同的IO模型 。我们把数据读取分为两个步骤
step1 准备数据阶段:数据从硬件拷贝到内核缓冲区 , 这里的硬件可以是磁盘 , 网卡等设备 。
step2 拷贝数据阶段:数据从内核缓冲区拷贝到用户空间缓冲区
根据step1是否阻塞可以把IO操作划分为:
阻塞IO
非阻塞IO
根据step2是否是否阻塞可以划分为:
同步IO
异步IOBIO——同步阻塞IO
应用进程发起read调用后就阻塞直到数据读取完成, 在这个过程中用户进程会让出CPU
【数据|今天来图解IO模型——BIO、NIO、AIO】数据|今天来图解IO模型——BIO、NIO、AIO
文章图片

文章图片

BIO
NIO
应用进程发起read操作 , 发现数据没有准备好就立即返回 , 用户进程不会阻塞 , 可以继续执行其他的任务 。同时不断发起read轮询直到数据就绪 , 然后进程阻塞等待数据从内核空间拷贝到用户空间 。
在step1用户进程是非阻塞的 , step2是阻塞的(同步的) , 所以叫同步非阻塞IO 。
数据|今天来图解IO模型——BIO、NIO、AIO
文章图片

文章图片

NIO
IO多路复用
当IO进程较多时 , 每个进程都去轮询数据会占用大量CPU , 因此在NIO基础上引入select , select会监控多路IO , 当其中一路IO的数据就绪 , 就发送事件唤醒对应的进程, 这样就实现了多个进程IO复用select , 减少了CPU消耗 。
数据|今天来图解IO模型——BIO、NIO、AIO
文章图片

文章图片

多路复用AIO
应用进程发起read调用时向操作系统内核注册一个回调函数 , read立即返回;内核准备数据 , 拷贝数据到用户空间后 , 回调这个函数 。
数据|今天来图解IO模型——BIO、NIO、AIO
文章图片

文章图片

AIO
由于Linux只支持文件AIO , 不支持网络AIO , 所以AIO不如NIO流行 。


    推荐阅读