各种IO模型

BIO(Blocking IO)

阻塞式同步IO

性能最差,响应最快

用户调用read,会阻塞并等待数据就绪,直到数据就绪,才返回

 

NIO(non-blocking IO)

非阻塞式同步IO

(基本不会直接用)性能也差,因为要用户来轮询

用户需要来轮询是否数据就绪,调用read,如果数据未准备好,就会返回错误,用户可以继续做别的事情,如果就绪,就可以读取

 

NIO(java new IO)/ IO多路复用

简单的说就是:内核帮你管理多个io,但是需要用户自己去询问是否有socket就绪(select),就绪了就继续读

内核会去轮询/监控socket/文件描述符是否数据有读入/就绪, 而不是用户去轮询,一旦某个socket/文件描述符就绪,会通知reader来读取

减少了用户态和内核态的切换, 有select和epoll

也可以算是阻塞同步,因为有个专门的select线程,select会阻塞到有socket数据就绪为止

 

(1)进行select/epoll系统调用,查询可以读的连接。kernel会查询所有select的可查询socket列表,当任何一个socket中的数据准备好了,select就会返回。

当用户进程调用了select,那么整个线程会被block(阻塞掉)。

(2)用户线程获得了目标连接后,发起read系统调用,用户线程阻塞。内核开始复制数据。它就会将数据从kernel内核缓冲区,拷贝到用户缓冲区(用户内存),然后kernel返回结果。

(3)用户线程才解除block的状态,用户线程终于真正读取到数据,继续执行。

AIO(Asynchronous IO

非阻塞异步

和多路复用的区别,个人感觉就是,多路复用是用户去主动问内核,有没有可用的socket,而AIO是内核通知用户数据好了

(1)当用户线程调用了read系统调用,立刻就可以开始去做其它的事,用户线程不阻塞。

(2)内核(kernel)就开始了IO的第一个阶段:准备数据。当kernel一直等到数据准备好了,它就会将数据从kernel内核缓冲区,拷贝到用户缓冲区(用户内存)。

(3)kernel会给用户线程发送一个信号(signal),或者回调用户线程注册的回调接口,告诉用户线程read操作完成了。

(4)用户线程读取用户缓冲区的数据,完成后续的业务操作。

 

原文链接:https://blog.csdn.net/u014453898/article/details/109811000

posted @ 2023-01-05 13:36  坏男银  阅读(16)  评论(0编辑  收藏  举报