10分钟看懂,Java NIO 底层原理( 五 )
文章插图
(1)当用户线程调用了read系统调用 , 立刻就可以开始去做其它的事 , 用户线程不阻塞 。
(2)内核(kernel)就开始了IO的第一个阶段:准备数据 。 当kernel一直等到数据准备好了 , 它就会将数据从kernel内核缓冲区 , 拷贝到用户缓冲区(用户内存) 。
(3)kernel会给用户线程发送一个信号(signal) , 或者回调用户线程注册的回调接口 , 告诉用户线程read操作完成了 。
(4)用户线程读取用户缓冲区的数据 , 完成后续的业务操作 。
异步IO模型的特点:
在内核kernel的等待数据和复制数据的两个阶段 , 用户线程都不是block(阻塞)的 。 用户线程需要接受kernel的IO操作完成的事件 , 或者说注册IO操作完成的回调函数 , 到操作系统的内核 。 所以说 , 异步IO有的时候 , 也叫做信号驱动 IO。
?
异步IO模型缺点:
需要完成事件的注册与传递 , 这里边需要底层操作系统提供大量的支持 , 去做大量的工作 。
目前来说 ,Windows 系统下通过 IOCP 实现了真正的异步 I/O 。 但是 , 就目前的业界形式来说 , Windows 系统 , 很少作为百万级以上或者说高并发应用的服务器操作系统来使用 。
而在 Linux 系统下 , 异步IO模型在2.6版本才引入 , 目前并不完善 。 所以 , 这也是在 Linux 下 , 实现高并发网络编程时都是以 IO 复用模型模式为主 。
小结一下:【10分钟看懂,Java NIO 底层原理】四种IO模型 , 理论上越往后 , 阻塞越少 , 效率也是最优 。 在这四种 I/O 模型中 , 前三种属于同步 I/O , 因为其中真正的 I/O 操作将阻塞线程 。 只有最后一种 , 才是真正的异步 I/O 模型 , 可惜目前Linux 操作系统尚欠完善 。
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型
- 流氓软件|老电脑开机10分钟?5M小软件一出手,流氓软件藏不住
- 为了赚钱费尽心思,iPhone12的3个小心思,你看懂了吗?
- 程序员学英语第1天——JavaScript 程序测试的介绍1
- 三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经
- 《深入理解Java虚拟机》:对象创建、布局和访问全过程
- java面试题整理
- Kotlin集合vs Kotlin序列与Java流
- Java安全之Javassist动态编程