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
标签:kernel,各种,模型,用户,线程,内核,IO,select From: https://www.cnblogs.com/huainanyin/p/17027321.html