Java代码改变世界OS

图解IO模型——BIO,NIO,AIO

2020-08-06  本文已影响0人  JerrysCode

操作系统分为用户空间和内核空间,出于安全考虑,应用程序只能操作用户空间的数据,无法直接操作内核空间的数据。当应用程序发起I/O操作时,需要经过等待数据和拷贝数据两步,这两步的处理方式不同,就会产生不同的IO模型。

我们把数据读取分为两个步骤

根据step1是否阻塞可以把IO操作划分为:

根据step2是否是否阻塞可以划分为:

BIO——同步阻塞IO

应用进程发起read调用后就阻塞直到数据读取完成 ,在这个过程中用户进程会让出CPU

BIO

NIO

应用进程发起read操作,发现数据没有准备好就立即返回,用户进程不会阻塞,可以继续执行其他的任务。同时不断发起read轮询调用,当某一次read调用返回数据就绪,用户进程阻塞等待数据从内核空间拷贝到用户空间。在step1用户进程是非阻塞的,step1是阻塞的(同步的),所以叫同步非阻塞IO。

NIO

IO多路复用

操作系统提供了epoll机制,当进行IO操作时,阻塞于select调用,而不是阻塞IO调用。对于单个IO调用, select和相比NIO优势不大。
但是当IO进程较多时,NIO轮询机制会占用大量CPU,因此在NIO基础上,通过select检测多个进程的数据是否就绪,select会一直阻塞直到其中一个进程的数据就绪,操作系统发送事件唤醒对应的进程, 这样就实现了多个进程IO复用select,减少了CPU消耗。Linux下多路复用epoll机制。


多路复用

AIO

应用进程发起read调用时注册一个回调函数,read立即返回;操作系统内核自动拷贝数据到用户空间后,回调这个函数。


AIO

由于Linux只支持文件AIO,不支持网络AIO,所以AIO在企业中应用不多。

上一篇 下一篇

猜你喜欢

热点阅读