javaNio学习 -- 四种主要的io模型

来源与尼恩的《Java高并发核心卷》

同步阻塞io

阻塞与非阻塞:
阻塞是指需要内核io彻底执行完毕后才返回到用户空间执行用户程序的指令,阻塞是指用户程序的运行状态。
同步与异步:
同步io是指用户空间主动发起io请求的一方,内核系统是接收方;相反的异步io是指,系统的内核空间是主动的发起io请求的一方,用户空间是被动接受的一方。
同步阻塞io是指用户空间主动发起,需要等待内核空间的io彻底完成操作后才返回到用户空间的io操作;在io操作的过程中,发起io请求的用户进程处于阻塞状态。

同步非阻塞io

同步非阻塞io是指用户空间的程序不需要等待内核空间的io彻底完成,立即返回用户空间去执行后续的操作,发起io请求的用户进程处于非阻塞状态,内核空间会立即返回给用户一个io状态值。

io多路复用

Linux系统中通过调用select/epoll的系统调用,一个用户进程监控多个文件描述符,一旦某个文件描述符状态可用,内核将文件描述符的就绪状态返回给用户进程,用户空间可以根据文件描述符进行相应io调用。
io多复用是一种典型的reactor模式的实现,又是也称为异步阻塞io,Java中的selector就是这种模型。

异步io

内核空间为主动的io请求发起方,用户空间进程为被动的接收方;当用户接收到请求后,数据已经被内核空间读取完毕并放到了用户缓冲区,用户空间进程直接使用即可。
异步io类似于Java中的回调函数,用户进程在内核空间注册了各种io事件的回调函数,由内核主动的去调用。在整个内核的数据处理过程中(包括将数据从网络设备读取到内核缓冲区,再从内核缓冲区复制到用户缓冲区),用户进程都不需要阻塞。
异步io模型的特点是,内核等待数据和复制数据的连哥哥阶段,用户进程都是不需要阻塞的。用户线程需要接受内核io的完成事件,或者用户线程注册一个io操作的回调函数。异步io也被称为信号驱动的io。

总结

同步阻塞io需要为每一个连接创建一个线程,高并发的情况下性能会比较差;
同步非阻塞io需要不断的发起io调用用以读取最终内核空间处理完的数据;用户线程不会阻塞,事实性好;内核空间有数据的情况下,数据的复制过程是阻塞的,直到数据完成从内核空间到用户空间的复制,完成复制后内核空间返回成功给用户空间进行。
io多路复用,用户线程获得了就绪状态列表后,根据其中的socket连接发起read/write的系统调用,用户线程阻塞,数据从内核缓冲区复制到用户缓冲区;复制完成后内核返回结果,用户进程接触阻塞状态,继续执行。Java的nio就是一种io多路复用。
异步io相比于以上三种,彻底的解除了阻塞。

posted @ 2021-11-28 16:08  桂花载酒少年游O  阅读(155)  评论(0编辑  收藏  举报