支撑Java NIO 与 NodeJS的底层技术编程
众所周知在近几个版本的Java中增长了一些对Java NIO、NIO2的支持,与此同时NodeJS技术栈中最为人称道的优点之一就是其高性能IO,那么咱们今天要讨论的话题就是支撑这些技术的底层技术。框架
开始以前先要提出的一个问题是:异步
为何NodeJS和Java NIO2没有在更早的时间出现?async
答案:我的认为是底层的支撑技术还不成熟。性能
那么,底层技术指的是什么呢?对的,我想不少人已经猜到,是操做系统技术。本文提出的两个概念Java NIO2和NodeJS无一例外都是用户态技术或者说是应用层技术,而这些应用层技术是运行于OS之上的,与此同时随着操做系统的进步,能够支撑的编程模型也更加的丰富。能够这么说,这两项技术彻底是为了应用操做系统进步带来的红利而进化出来的技术。通常来讲最早享受这种红利的技术必定是C\C++,由于OS的进步最新提供的大部分是系统调用,而C\C++是最方便应用这些系统调用的,可是同时也是最复杂的。其余平台为了也得到一样的性能,就必须不断的进化,封装,使用户能够用上这些红利,一旦那个平台停滞更新,也就是这个平台没落的时候了。对用户来讲封装的越方便,对用户来讲就越是友好,可能使用的人就越多。虽然不少人能够很快的写出基于这些平台的代码,可是每每不得其精髓,由于本质上仍是不理解这些技术的动机和原理。下面咱们讨论的这些技就是这两项技术相关的底层技术。spa
无论哪种OS设计中,下面5种IO模型都是必不可少的。操作系统
1. blocking I/O
2. nonblocking I/O
3. I/O multiplexing (select, poll and epoll)
4. signal driven I/O (SIGIO)
5. asynchronous I/O (the POSIX aio_ functions)线程
1. blocking I/O设计
如图所示,这种IO模型的优势是编程简单,也是OS最先支持的IO模型之一,缺点是系统调用阻塞用户动态线程执行,从而形成CPU时间浪费,IO效率低。blog
2. nonblocking I/O
如图所示,这种IO模型的一个改进是IO是非阻塞了,可是须要长轮询,一样浪费CPU时钟周期。
3. I/O multiplexing (select, poll and epoll)
如图所示,这种IO模型是当今OS提供的最稳定的IO模型,大部分主流的应用都是基于此种IO模型构建的,好比NodeJS,可是这些平台每每在这种模型之上增长一层封装来直接支持AIO。
4. signal driven I/O (SIGIO)
如图所示,资料记载这种IO模型因为对比模型3没有性能优点,同时因为系统支持不稳定,不多为设计者采用。
5. asynchronous I/O (the POSIX aio_ functions)
如图所示,此种IO模型是最完美的AIO,编程模型也最简单,可是可以完美支持者个模型的OS不多,网上资料显示Linux正在作这方面的努力,一旦OS在这个方面上取得进展,编程框架,平台,编程模型可能仍是须要有很大程度的简化。
虽然这种模型不多有OS的支持,可是并非说如今就没有这种AIO模型,不少框架作了这方面的工做,在用户态模拟了AIO,使用户能够更多的关注业务逻辑代码。
6. 同步异步,阻塞和非阻塞
同步和异步是针对应用程序和内核的交互而言的。一直等到数据读完再返回的是同步,直接返回的是异步。阻塞和非阻塞是对进程、线程而言的,阻塞方式下读取或者写入线程一直等待,而非阻塞方式下,读取或者写入线程当即返回一个状态值。