BIO、NIO、多路复用IO、AIO

it2024-03-10  65

同步异步、阻塞非阻塞

同步:线程或进程向内核发送IO请求后,需要等待或者轮训内核完成IO操作后,再继续执行。

异步:线程或进程向内核发送IO请求后,仍可以继续执行,等内核执行完IO操作后,再通知线程或进程已经完成操作,或者调用它们注册的回调函数。

同步和异步描述的是线程或进程与内核之间的交互方式。

阻塞:线程或进程向内核发送IO请求后,需要等到IO操作执行完才返回。

非阻塞:线程或进程向内核发送IO请求后,内核立即返回一个状态值,无需等待IO操作执行完毕。

阻塞和非阻塞描述的是线程或进程调用内核IO操作的方式。

BIO

阻塞IO,当用户发送一个IO读请求时,系统还没有准备好数据的话,用户线程就会处于一个阻塞状态,一直等待数据准备好返回给用户之后(将socket中的数据写入线程指定的buffer中),才能继续执行下去。

图解如下

NIO

非阻塞IO,当用户发送一个请求时,系统还没有准备好数据的话,立马返回数据还没准备好的消息,然后用户继续发送同一请求,直到接收到准备好的数据为止。

图解如下

多路复用IO

异步阻塞IO,redis就是使用这种IO模型,当用于发送一个请求时,系统还没有准备好数据的话,系统会对用户的这个请求进行标记,用户会对这个请求进行监听。

用户可以发送多个其他请求,如果第一次的请求依旧没有准备好数据,则多个其他请求会被阻塞。

当数据准备好时,系统会通知用户第一次请求的数据已经准备好,然后用户就再次发送这个请求,去请求并接收数据。

图解如下

AIO

异步非阻塞IO,当用户发送一个请求时,无论是否准备好数据都返回结果,用户可以发送其他请求;

此时用户开启监听数据是否准备好,系统标记用户的这个请求,当数据准备好时,等到准备好数据之后,通知用户数据已经准备好,用户再次发送这个请求去请求并接收数据。

图解如下

最新回复(0)